函数式编程是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
高阶函数
变量可以指向函数
函数名也是变量
传入函数
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。
map/reduce
map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
reduce把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
练习:
1、利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:[‘adam’, ‘LISA’, ‘barT’],输出:[‘Adam’, ‘Lisa’, ‘Bart’]。
2、Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积。
返回函数
可以将函数作为返回值返回
在A函数中定义B函数,并且A函数返回B函数,这是如果调用B函数,则A中的参数和局部变量会储存在B中,B可以使用这些参数和局部变量。这种结构叫闭包
每次调用A都会返回一个B,但是没次的B都是不等的,即使A的参数和其中的局部变量完全一样
返回的函数并不会马上执行,而是等到调用的时候才会执行
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
匿名函数
lambda关键字来表示匿名函数
lambda x: x * x
实际上就是:
def f(x):
return x * x
匿名函数只能有一个表达式
Python对匿名函数的支持有限,只有一些简单的情况下可以使用匿名函数。
装饰器
偏函数
当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数
(需要import functools),这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85