高阶函数
把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式
Map/Reduce
Python内建了map()和reduce()函数。 首先来讲解map。map()函数接受两个参数,一个是函数,另外一个是Iterable,Map将传入的函数依次作用到序列的每个函数,并且把结果作为新的Iterator返回。例如:我们有一个函数f(x)=x*x,要把次函数作用在一个list[1,2,3,4,5,6,7,8,9]上,可以通过map()实现(pyhton代码如下):
def f(x):
  return X * X
r = map(f,[1,2,3,4,5,6,7,8,9])
map()传入第一个参数为f,即函数对象本身。由于r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把真个序列可以计算出来本返回list。另外一种实现方法,不需要map()函数,通过循环实现:
L = []
for n in [1,2,3,4,5,6,7,8,9]:
  L.append(f(n))
print(L)
利用for循环不能直接看出把f(x)作用在list上的每一个元素并把结果生成一个新的list,所以通过map()高阶函数,把运算规则抽象,不光可以结算X*X,还可以计算更复杂的函数。
reduce的用法。reduce把一个函数作用在一个序列上[x1,x2,x3,…]上,此函数必须接受两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)
例如一个序列求和,通过reduce实现:
from functools import Reduce
def add(x,y):
  return x+y
reduce(add,[1,3,5,7,9])
通过一个例子阐明map()和reduce()相互配合:
from functools import reduce
def fn(x,y):
  return x*10+y
def char2num(s):
  digits = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
  return digits[s]
reduce(fn,map(char2num,'13579'))
可以转换整理称一个str2int的函数:
DIGITS = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
def str2int(s):
  def fn(x,y):
    return x*10+y
  def char2num(s):
    return DIGITS[s]
  return reduce(fn,map(char2num,s))
Filter()函数
python内建的filter()函数用于过滤序列。和map()类似,filter()也接受一个函数和序列,和map()不同,filter()把传入的函数依次作用于每个元素,然后根据返回值是True或者False决定保留还是丢弃。例如,在一个list中删除偶数,保留奇数。
def is_odd(n):
  return n % 2 == 1
list(filter(is_odd,[1,2,4,,5,6,9,10,15]))
filter函数返回的是一个Iterator,也是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。
举例:回数是指从左到右读和从右到左读都一样的数,例如12321,909.利用filter()筛选出回数
def is_palindrom(n):
    return str(n)==str(n)[::-1]
output = filter(is_palindrom,range(1,1000))
print output
filer()的作用是从一个序列中筛选出符合条件的元素,由于filter()使用了惰性计算,所以只有在取filter()结果时候,才能真正筛选并每次返回下一个筛出的元素。
排序算法
排序算法作为程序中经常使用的算法,无论是冒泡排序还是快速排序,排序的核心是比较两个元素的大小,如果是数字,那么可以直接比较,但是如果是字符串或者两个dict,直接比较数学上的大小没有意义,比较的过程需要通过函数抽象出来。python内置函数sorted()实现对list排序,可以接受参数key和reverse。
函数作为返回值
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。如果不需要立刻求和,只是在后边的代码中用到再计算。可以不返回求和结果,返回求和的函数。例如:
def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum
a = lazy_sum(3,5,7,9)
print (a())
闭包
返回函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量被新函数引用,所以闭包用起来简单,实现较难。返回函数没有立即执行,直到调用f()才执行。
匿名函数
利用关键字lambda表示匿名函数,冒号前边的x表示函数参数。匿名函数有一个限制,只能有一个表达式,不能写return,返回值就是结果。可以将匿名函数赋值给一个变量,同时也可以作为函数返回值,例如:
f = lambda x:x * x //赋值给一个变量
def build(x,y):
  return lambda: x * x + y * y
装饰器
微信支付
支付宝
