#高阶函数
map/reduce
In [2]:
#我们先看map。map()函数接收两个参数,一个是函数,
#一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
def f(x):
return x*x
r=map(f,[1,2,3,4,5])
r
Out[2]:
In [3]:
list(r)
Out[3]:
In [4]:
#再看reduce的用法。reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,
#这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
from functools import reduce
def add(x,y):
return x+y
reduce(add,[1,3,5,7,9])
Out[4]:
In [5]:
def fn(x,y):
return x*10+y
reduce(fn,[1,3,5,7,9])
Out[5]:
filter
Python内建的filter()函数用于过滤序列。
和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,#然后根据返回值是True还是False决定保留还是丢弃该元素。
In [6]:
def is_odd(n):
return n%2==1
list(filter(is_odd,[1,2,4,6,8,9]))
Out[6]:
In [10]:
#把一个序列中的空字符串删掉
def not_empty(s):
return s and s.strip()#结果必须是判断是true还是false
list(filter(not_empty,['A','','B',None,'C',' ']))
Out[10]:
sorted
排序
In [11]:
sorted([36,-5,-12,-9])
Out[11]:
In [12]:
sorted([36,-5,-12,15],key=abs)
Out[12]:
In [14]:
#返回函数,# 闭包
#返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
def lazy_sum(*args):
def sum():
ax=0
for n in args:
ax=ax+n
return ax
return sum
In [15]:
f=lazy_sum(1,3,5,7,9)
f
Out[15]:
In [16]:
f()
Out[16]:
匿名函数
In [18]:
list(map(lambda x:x*x,[1,2,3,4,5,6]))
Out[18]:
In [19]:
#lambda表示匿名函数,冒号前面的x表示函数参数。
#匿名函数不用写return.返回值就是表达式的结果
#匿名函数可以把函数值赋给一个变量,再利用变量来调用该函数
f=lambda x:x*x
f
Out[19]:
In [20]:
f(5)
Out[20]:
In [22]:
def build(x,y):
return lambda:x*x+y*y
build(5,7)
Out[22]:
In [26]:
f=build(5,7)
f
Out[26]:
In [27]:
f()
Out[27]: