函数是编程是一种抽象程度很高的编程范式。特点之一是允许将函数本身作为参数传入另一个函数。并且允许返回一个函数。
1 高阶函数
变量可以指向的函数
f = abs
其中abs为一个函数,即变量f指向abs本身。
函数名也是变量
abs()是函数,abs其实是一个指向该函数的变量。
ps:abs定义在__builtin__
模块中。
传入函数
函数的参数可以接受变量,那么也可以接受其实是变量的函数名。
>>>def add(x, y, f):
return f(x) + f(y)
>>>add(-9, 6, abs)
15
实际上就是abs(-9) + abs(6)的过程。
总结:把函数作为参数传入,这样的函数就是高阶函数。
2 map() / reduce()
map()
接受两个参数:函数与序列。
map(f, [ something ])
map(str, [1, 2, 3, 4, 5, 6]) ==> ['1', '2', '3', '4', '5', '6']
实际上map()是把计算过程抽象化了。
reduce()
接收两个参数:函数和序列。
与map()不同的是,reduce将接收到的函数作用在序列的每一个元素上并将其累计计算。
>>> def fn(x, y):
return x * 10 + y
>>> reduce(fn, [1, 3, 5, 7, 9])
13579
3 filter()
filter()接收一个函数和一个序列。
它将传入的函数依次作用于每个元素,然后根据返回值决定保留或是丢弃。
例:找1~100之间的素数
def is_prime(n):
if n == 1:
return True
else:
for i in range(2, n-1):
if n % i == 0:
return False
return True
print filter(is_prime, range(1, 101))
结果:[1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
4 sorted()
排序算法
通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。
>>> sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]
def reversed_cmp(x, y):
if x > y:
return -1
if x < y:
return 1
return 0
传入自定义的比较函数reversed_cmp,就可以实现倒序排序:
>>> sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]
5 返回函数
函数作为返回值
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
每次返回的函数都是新的。
闭包
返回函数不要应用任何循环变量,或是后续会发生变化的变量。