学习目标:
Python学习八、
- 高阶函数:把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计
学习内容:
1、map/reduce
2、filter
3、sorted
1、map/reduce
Python内建了map()和reduce()函数
1、map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
def f(x):
return x*x
t = map(f, [1, 2, 3, 4])
print(list(t))
输出:
[1, 4, 9, 16]
- map()作为高阶函数,事实上它把运算规则抽象了,可以用来计算任意复杂的函数
print(list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])))
输出:
['1', '2', '3', '4', '5', '6', '7', '8', '9']
2、reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
from functools import reduce
def add(x, y):
return x + y
print(reduce(add, [1, 3, 5, 7, 9]))
输出:
25
- 把序列[1, 2, 3, 5, 6, 8, 9]变换成整数1235689
- Python没有提供int()函数,你完全可以自己写一个把字符串转化为整数的函数
from functools import reduce
def zheng(x, y):
return x*10+y
print(reduce(zheng, [1, 2, 3, 5, 6, 8, 9]))
输出:
1235689
- 配合map()函数,把str转换为int的函数
from functools import reduce
def zheng(x, y):
return x*10+y
def ints(s):
digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
return digits[s]
print(reduce(zheng, map(ints, '1235456')))
输出:
1235456
- 进一步改进
from functools import reduce
digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def doo(s):
def zheng(x, y):
return x*10+y
def ints(s):
return digits[s]
return reduce(zheng, map(ints, s))
print(doo('56156566'))
输出:
56156566
- 用lambda函数进行简化
def doo(s):
return digits[s]
def ins(s):
return (reduce(lambda x, y:x*10+y,map(doo, s)))
print(ins('12318656'))
输出:
12318656
2、filter
Python内建的filter()函数用于过滤序列
- filter()接收一个函数和一个序列,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素
- 保留一个列表的奇数,丢弃偶数
def que(n):
return n%2==1
print(list(filter(que, [1, 2, 5, 8, 15, 21, 22, 25, 65, 48, 245, 64, 86])))
输出:
[1, 5, 15, 21, 25, 65, 245]
把一个序列中的空字符串删掉
def empty(s):
return s and s.strip()
print(list(filter(empty, ['1', '2','5',' ', None, '21', '22', ' ', '25', '65'])))
输出:
['1', '2', '5', '21', '22', '25', '65']
filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list
3、sorted–排序算法
sorted()函数也是一个高阶函数,排序的核心是比较两个元素的大小
- Python内置的sorted()函数就可以对list进行排序,sorted()函数是一个高阶函数,它可以接收一个key函数来实现自定义的排序
key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序
print(sorted([36, 5, -12, 9, -21], key=abs))
输出:
[5, 9, -12, -21, 36]
- 默认情况下,对字符串排序,是按照ASCII的大小比较的,ASCII小的会排在前面
print(sorted(['bob', 'about', 'Zoo', 'Credit']))
输出:
['Credit', 'Zoo', 'about', 'bob']
- 当对字符串进行排序时,忽略其大小写可以利用key使其都变形成大写或者都小写
- key=str.lower小写
- key=str.upper大写
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower))
输出:
['about', 'bob', 'Credit', 'Zoo']
需要对字符串进行倒序排列时采用参数reverse=True
reverse=True
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower,reverse=True ))
输出:
['Zoo', 'Credit', 'bob', 'about']