Python中的函数是对象,可以赋值给变量,Python提供了很多函数式编程特性,如map, reduce, filter, sorted等内置函数,都支持函数作为参数。函数式编程中的要点,包括高阶函数、匿名函数、装饰器、偏函数等等。
1.lambda匿名函数
lambda匿名函数在一些工程项目中经常出现,匿名函数就是没有定义函数的名称,用来实现简单的功能,语法是
#param_list是函数的参数,expression是函数体,用一行表示 lambda param_list: expression #实例,运行结果是3 func=lambda x, y: x+y func(1,2)
2.高阶函数
函数可以赋值给变量,函数的参数能接收变量,所以一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
map函数
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。(Iterator是惰性序列,需要通过list()函数让它把返回结果变为list。)
语法:map(function, iterable, …)
def main(x):
return x*x
y=list(map(main,[0,1,2,3,4,5]))
y
#输出[0, 1, 4, 9, 16, 25]
reduce函数
reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算:
语法:reduce(function, iterable[, initializer])
#在python3中,内置函数中已经没有reduce了。要使用reduce,需要从functools模块里引入 from functools import reduce reduce(lambda x, y: x+y, [1,2,3,4,5]) #输出15
filter函数
和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。filter()函数返回的是一个Iterator,也就是一个惰性序列,同样需要通过list()函数让它把返回结果变为list。
语法:filter(function, iterable)
def m(x):
return x%2==1
list(filter(m,[1,2,3,4,5,6,7,9]))
#输出[1, 3, 5, 7, 9]
sorted函数
sorted函数对所有可迭代的对象进行排序操作,它可以接收一个key函数来实现自定义的排序
语法:sorted(iterable, key=None, reverse=False)
#按每个元素的第一个元素值大小排序 sorted([[2,1],[6,2],[1,4],[10,11]], key=lambda x:x[0]) #输出[[1, 4], [2, 1], [6, 2], [10, 11]]
3. 函数实现闭包
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。特点是函数中有定义一个新函数,新函数名做为返回值返回给函数。
#get_result函数中定义了一个新函数get_add,*m为可变参数
def get_result(*m):
def get_add():
x=0
for i in m:
x +=i
return x
return get_add
y = get_result(1,2,3,4,5)
y() #结果15
y = get_result(1,2)
y() #结果3
4.迭代器与生成器
4.1.迭代器
迭代器指的是可以使用next()方法来回调的对象,可以对可迭代对象使用iter()方法,将其转换为迭代器。
迭代器优势: 所有的元素不是一次性加载的,在调用next方法才会返回,不需要考虑内存问题。next()只能往后进行访问。
迭代器应用场景: list规模过大,出于对内存的考虑使用迭代器。 有规律,但是不能使用列表推导式描述
- List item
4.2.生成器
生成器的优点是延迟计算,一次返回一个结果,这样非常适用于大数据量的计算。但是,使用生成器必须要注意的一点是:生成器只能遍历一次。
- List item
5. 装饰器
Python中,常见的类装饰器包括:
@staticmathod、@classmethod和@property
@staticmethod:类的静态方法,跟成员方法的区别是没有self参数,并且可以在类不进行实例化的情况下调用。
@classmethod:跟成员方法的区别是接收的第一个参数不是self,而是cls(当前类的具体类型)
@property:表示可以直接通过类实例直接访问的信息。
- List item
- List item
- List item



