map()映射
map()方法会将 一个函数 映射到序列的每一个元素上,生成新序列,包含所有函数返回值。
由于返回的序列是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。
def fun(x):
return x*x
r = map(fun,[1,2,3,4,5,6,7,8,9])
print(list(r))
#map()作为高阶函数,事实上它把运算规则抽象了
print(list(map(str,[1,2,3,4,5,6,7,8,9]))) #将数字转换为字符串
print(list(map(lambda x:x**2, range(1,10)))) #计算序列每个元素的平方
reduce()归并
在迭代序列的过程中,首先把 前两个元素(只能两个)传给 函数,函数加工后,然后把 得到的结果和第三个元素 作为两个参数传给函数参数, 函数加工后得到的结果又和第四个元素 作为两个参数传给函数参数,依次类推。
from functools import reduce
from tkinter import N
def fun_add(x,y):
return x+y
print(reduce(fun_add,[1,2,3,4,5,6,7,8,9]))
#或者
print(reduce(lambda x,y:x*10+y,range(1,10)))
fliter()过滤器
Python内建的filter()函数用于过滤序列。他也是一个高阶函数,将符合过滤函数的元素删除。
def not_empty(s):
return s and s.strip()
list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))
# 结果: ['A', 'B', 'C']
用filter求素数
用Python来实现这个算法,可以先构造一个从3开始的奇数序列:
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
然后定义一个筛选函数:
def _not_divisible(n):
return lambda x: x % n > 0
最后,定义一个生成器,不断返回下一个素数:
def primes():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一个数
yield n
it = filter(_not_divisible(n), it) # 构造新序列
# 打印1000以内的素数:
for n in primes():
if n < 1000:
print(n)
else:
break
sorted()排序
sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:
print(sorted([36, 5, -12, 9, -21], key=abs))
#[5, 9, -12, -21, 36]
print(sorted(['bob', 'about', 'Zoo', 'Credit']))
#['Credit', 'Zoo', 'about', 'bob']
字符串排序
#忽略大小写的排序
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower))
#['about', 'bob', 'Credit', 'Zoo']
#反向排序,不必改动key函数,可以传入第三个参数reverse=True:
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True))
#['Zoo', 'Credit', 'bob', 'about']