stay hungry stay foolish

python(函数式编程)

函数式编程

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

高阶函数

如果一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

def add(x, y, f):
    return f(x) + f(y)

map()函数

map()函数接收两个参数,一个是函数,一个是Iterable对象,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator对象返回。

>>> def f(x):
...  return x*x
...
>>> g=map(f,[1,2,3])
>>> next(g)
1
>>> list(g) #list与iter相反,可以把Iterator变成Iterable,如果该g无限大,将会内存溢出
[4, 9]
>>>

reduce()函数

reduce把一个函数作用在一个Iterable对象上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)`

序列求和:

>>> def f(x,y):
...  return x+y
...
>>> from functools import reduce
>>> reduce(f,[1,2,3]) #如果第二个参数是一个Iterator并且无穷大,将会内存溢出
6
>>>

filter()函数

类似js数组的filter函数,用于过滤序列,其返回的时一个Iterator对象。

>>> def g(n):
...  while(n>0):
...   yield n
...   n=n-1
...
>>> def is_odd(x):
...  return x%2==1
...
>>> list(filter(is_odd,g(10)))
[9, 7, 5, 3, 1]
>>> list(filter(is_odd,[1,2,3,4,5]))
[1, 3, 5]
>>>

sorted()函数

用于排序,第二个关键字参数key可以接受一个函数作为排序依据,第三个关键字reverse参数是个Boolean值,可以改变排序顺序。

>>> sorted([2,1,3])
[1, 2, 3]
>>> sorted([2,1,-3],key=abs)
[1, 2, -3]
>>> sorted([2,1,-3],key=abs, reverse=True)
[-3, 2, 1]
>>> def f(x): #自定义函数只接收一个参数
...  if(x<0):
...   return -x
...  else:
...   return x
...
>>> sorted([2,-3,1],key=f)
[1, 2, -3]
>>>