目录
使用方法: sorted(iterable, key=None, reverse=False)
例1:对s = ['fdsf','Ffsdf','dsa','ERW']按照首字母顺序进行排序
例2:输入若干个商品信息,由商品名,商品数量,价格组成,然后分别按照各个项目进行排序
一、高阶函数
即----将一个函数作为另一个函数的参数
def plus(a): #定义自加一的函数
a=a+1
return a
def fun (x,y,plus):
return plus(x),plus(y) #定义一个函数,将参数,赋值给plus函数
print(fun(100,0,plus))
二、内置的高阶函数
1、map()
用法:
- 接受两个参数,一个是函数,一个是序列
- map将传入的函数以此作用于该序列的每个元素,并且把结果作为新序列后返回
例1:对一个列表的数据,求阶乘,输出列表里每个数据的阶乘
import random
def f(x):
res=1
for i in range(1,x+1):
res *= i
return res
a=[random.randint(1,10) for i in range(0,6)]
print(set(map(f,a))) #以列表形式输出
例2:对一个列表的每一项求绝对值
print(list(map(abs,[1,32,-3,-42])))
2、reduce()
定义:
- 把一个函数作用在一个序列上,这个函数必须接收两个参数
- reduce把结果继续和序列的下一个元素做累积计算,就这样一直循环下去
使用:
python2:reduce是内置函数,可以直接用
python3:from functools import reduce 进行调用
例子:reduce(f,[x1,x2,x3,x4]) 理解起来,就是这个过程:
f(f(x1,x2),x3),x4)
例1:用内置reduce计算一个列表中元素的和
from functools import reduce #调用该模块
a=[1,2,3,4,5,6]
def plus(x,y):
return x+y
print(reduce(plus,a)) #使用reduce
3、filter() 过滤函数
说明:
- 和map()类似的,也接收一个函数和一个序列
- 但是和map()不同的是,filter()把传入的函数依次作用于,每个元素
- 然后根据返回值是True或者False决定保留还是丢弃该元素
注意:类似于map(),只是加了一道选择判断功能
例1:输出20以内的偶数
def isodd(num): #判断偶数
if num % 2 ==0:
return True
else:
return False
print(list(filter(isodd,range(20)))) #输出19以内的偶数
输出:
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
4、sort 和sorted
sort:是list的内置函数,是对原本列表进行排序,返回原列表
sorted:是全局函数,不会对原数据作出改变,会产生一个新的列表(集合,字典......)
使用方法:
sorted(iterable, key=None, reverse=False)
参数说明:
- iterable -- 可迭代对象。
- key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
返回值
返回重新排序的可迭代对象
例1:对s = ['fdsf','Ffsdf','dsa','ERW']按照首字母顺序进行排序
# list2 = [6,-8,-9,-1,3,4,5,6,8,9]
# list2.sort()
# print(list2)
# list3 = sorted(list2,key=abs)
# print(list3)
#
# s = ['fdsf','Ffsdf','dsa','ERW']
# print(s)
# print(sorted(s))
# print(sorted(s,key=str.lower))
# print(sorted(s,key=str.upper))
例2:输入若干个商品信息,由商品名,商品数量,价格组成,然后分别按照各个项目进行排序
info = [
# 商品名称,商品数量,商品价格
('apple1',200,32),
('apple2', 40, 12),
('apple3', 1000, 23),
('apple1', 40, 2),
('apple1', 40, 5),
]
# 按照商品数量进行排序
def sorted_by_count(x):
return x[1]
# 按照商品价格进排序
def sorted_by_price(x):
return x[2]
# 先按照商品数量进行排序,如果商品数量一致
# 则按照商品价格进行排序
def sorted_by_count_price(x):
return x[1],x[2]
print(sorted(info,key=sorted_by_count))
print(sorted(info,key=sorted_by_price))
print(sorted(info,key=sorted_by_count_price))
输出:
[('apple2', 40, 12), ('apple1', 40, 2), ('apple1', 40, 5), ('apple1', 200, 32), ('apple3', 1000, 23)]
[('apple1', 40, 2), ('apple1', 40, 5), ('apple2', 40, 12), ('apple3', 1000, 23), ('apple1', 200, 32)]
[('apple1', 40, 2), ('apple1', 40, 5), ('apple2', 40, 12), ('apple1', 200, 32), ('apple3', 1000, 23)]
三、练习
1、将一个字符串转换成整型--还不会
'332.31321'
'0':0
'1':1
...
from functools import reduce
def str2int(s):
def char2int(ch):
c = {str(x):x for x in range(10)}
#print(c)
return c[ch]
def fun(n1,n2):
return n1 * 10 + n2
return reduce(fun,map(char2int,s))
num = str2int('12343')
print(type(num),num)
2、利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字
3、利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456
4、回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回数