高阶函数
变量可以指向函数,函数的参数接收变量,所以一个函数可以接收另一个函数作为参数,这就叫做高阶函数。
map/reduce
map(函数,iterable) “散” 返回的是一个Iterator
from collections.abc import Iterable
from collections.abc import Iterator
def square(x):
return x*x
print(list(map(square,[y for y in range(1, 11)])))
输出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>isinstance(map(square,[1,2,3,4]),Iterator)
True
reduce(函数,iterable) “聚”
In[1]:from functools import reduce
In[2]:L=[1,2,3,4,5,6]
In[3]:def cum(x,y):
return x*y
In[4]:print(reduce(cum,L))
Out[5]:720
函数cum需要传入两个参数,reduce(cum,L)=cum(cum(cum(cum(cum(1,2),3),4),5),6)
filter
过滤序列:根据返回的True和False决定是否保留
>>>def isOdd(x):
return x%2==1
>>>L=[x for x in range(6)]
>>>>from collections.abc import Iterator
>>>isinstance(filter(isOdd,L),Iterator)
True
>>>print(list(filter(isOdd,L)))
[1, 3, 5]
filter返回的Iterator,是一个惰性序列,用next调用很明显十分的鸡肋,所以通过list()强迫filter函数计算并获得所有的结果。
sorted
排序函数:可以接收一个key函数实现自定义排序,返回的是一个列表,而不是Iterator
>>>print(sorted([-5,1,10,-100],key=abs))
[1, -5, 10, -100]
>>>print(sorted([-5,1,10,-100],key=abs,reverse=False))
[1, -5, 10, -100]
>>>print(sorted([-5,1,10,-100],key=abs,reverse=True))
[-100, 10, -5, 1]
默认reverse为False,即升序,当reverse=True时为降序
lambda
匿名函数:避免函数名冲突,冒号右侧只能是表达式或确定的值,局限性在于只能处理逻辑简单的情况
>>>print(map(lambda x:x*x,[1,2,3,4,5]))
<map object at 0x000001C6ED145CD0>
>>>print(list(map(lambda x:x*x,[1,2,3,4,5])))
[1, 4, 9, 16, 25]
>>>print(list(map(lambda x:x if x%2==0 else -x,[1,2,3,4,5,6,7,8,9])))
[-1, 2, -3, 4, -5, 6, -7, 8, -9]