map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次做用到序列的每一个元素,并把结果做为新的Iterator返回。
reduce把一个函数做用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素作累积计算。python
和map()相似,filter()也接收一个函数和一个序列。和map()不一样的是,filter()把传入的函数依次做用于每一个元素,而后根据返回值是True仍是False决定保留仍是丢弃该元素。编程
def is_palindrome(n): return n==int(str(n)[::-1]) output = filter(is_palindrome, range(1, 1000)) print('1~1000:', list(output)) if list(filter(is_palindrome, range(1, 200))) == [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191]: print('测试成功!') else: print('测试失败!')
sorted()函数也是一个高阶函数,它还能够接收一个key函数来实现自定义的排序,例如按绝对值大小排序:闭包
>>> sorted([36, 5, -12, 9, -21], key=abs) [5, 9, -12, -21, 36]
要进行反向排序,没必要改动key函数,能够传入第三个参数reverse=True:
***app
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count() *** >>> f1() 9 >>> f2() 9 >>> f3() 9
缘由就在于返回的函数引用了变量i,但它并不是马上执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,所以最终结果为9。函数式编程
def count(): def f(j): def g(): return j*j return g fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)马上被执行,所以i的当前值被传入f() return fs *** >>> f1, f2, f3 = count() >>> f1() 1 >>> f2() 4 >>> f3() 9
def createCounter(): i = 0 def counter(): print(i) i += 1 return i return counter
def createCounter(): i = [0] def counter(): i[0] += 1 return i return counter
也能够使用生成器函数
def createCounter(): def num(): n = 1 while 1: yield n n = n + 1 n = num() def counter(): return next(n) return counter