python函数式编程
1、高阶函数的定义:
函数名也是变量,
传入函数
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
一个最简单的高阶函数:
def add(x, y, f):
return f(x) + f(y)
1)、map/reduce
map()
函数接收两个参数,一个是函数,一个是Iterable
,map
将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator
返回。
再看reduce
的用法。reduce
把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
练习题:
利用map
和reduce
编写一个str2float
函数,把字符串'123.456'
转换成浮点数123.456
:
def str2float(s):
counts = s.find('.')
return reduce(lambda x,y:x*10+y,map(int,s[:counts])) + 0.1*reduce(lambda x,y:x*0.1+y,map(int,s[len(s)-1:counts:-1]))
print(str2float('123.456'))
2)、filter
filter函数传入两个参数,传入的函数会作用于序列的每个元素,并将不符合传入函数要求的过滤掉。
filter返回的也是一个迭代器Iterator
用filter求素数
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)
for n in primes():
if n <1000:
print(n)
else:
pass
3)、sorted
sorted()
也是一个高阶函数。用sorted()
排序的关键在于实现一个映射函数。
sorted(L,key=,reverse=)
练习
假设我们用一组tuple表示学生名字和成绩:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
请用sorted()
对上述列表分别按名字排序:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_name(t):
return t[0]
def by_score(t):
return t[1]
print(sorted(L,key=by_name))
print(sorted(L,key=by_score,reverse=True))