1、高阶函数
什么是高阶函数?满足以下任意条件就是:
①函数形参是函数
②函数的返回值是函数
用户可以自定义高阶函数,python有自带的内置高阶函数:map函数、reduce函数、filter函数,均满足第一个条件。
map函数:
格式:map(函数引用,可迭代对象) 返回值是一个迭代器,可以通过list转换成列表。
其中函数引用可以为匿名函数,也就是lambda声明的函数
可迭代对象可以是:列表,元组,字符串
例如:
m = list(map(lambda x:x**2,[1,2,3,4]))
print(m)
运行结果:
[1, 4, 9, 16]
可以看出来上述的map函数是会列表中的每个元素按照函数的规则进行处理之后,返回值还放在原来的位置。
reduce函数:
格式:reduce(函数引用,可迭代对象,initializer=None),其中函数引用和map一样,可以是函数名或者是匿名函数,可迭代对象也是一样,initializer这个是基准值。返回值一个整数。
功能:对可迭代对象中的两个两个元素按照函数的规则进行处理,返回值作为下一次处理的第一个参数值,第二个参数值则是可迭代对象的下一个值。
reduce函数需要从functools 模块导入才行。
reduce可以应用在累加、累乘的场景上。
比如:
from functools import *
m = reduce(lambda x,y:x+y,[1,2,3,4])
print(m)
运行结果:
10
上述就是实现:1+2+3+4=10
下面是reduce函数的源码:
def reduce(function, iterable, initializer=None):
it = iter(iterable)
if initializer is None:
value = next(it)
value2 = next(it)
print(value,value2)
else:
value = initializer
for element in it:
print(element)
value = function(value, element)
return value
sum = reduce(lambda x,y:x+y,[1,2,3,4])
print(sum)
可以看到initializer这个参数,如果设置的话,比如为10,那么就是10+1+2+3+4+5=25.
filter 函数:
格式:filter(函数引用,可迭代对象)返回值是一个迭代器,可以通过list转换成列表。
其中函数引用可以为匿名函数,也就是lambda声明的函数
可迭代对象可以是:列表,元组,字符串
功能:对可迭代对象的每个元素按照函数规则就是过滤,符合条件的留下来,不符合的丢弃,最后返回一个迭代器,可以通过list进行转换成列表。
例如:
l = list(filter(lambda x:x.islower(),['I','love','China','!']))
print(l)
运行结果:
['love']
2、偏函数
偏函数的作用就是为了简化一些函数在调用过程中繁琐的参数输入,对某些固定的参数可以隐藏,通过偏函数生成一个新的函数,再在新函数的参数中传入经常变动的参数,该参数也是原函数的参数.所以偏函数就相当于给原函数进行了包装,包装之后给了另外一个名字,后面使用就用这个别名,原来的名字也是可以用的.就跟明星一样,名字都是艺名.
调用偏函数前,需要导入模块functools .
语法:partial(函数名,需隐藏的参数),返回的是函数名引用.
def s(a,b,c):
print(c)
return a+b
ss = partial(s,c='这个是固定的属性')
print(ss(2,3))
运行结果:
这个是固定的属性
5
上面使用partial函数对属性c进行了固定,后面就不用传递这个参数了.
3、闭包
闭包也是针对函数来说的,满足闭包的函数,需满足如下的条件:①定义函数时内部还嵌套一个函数②外部函数返回值为内部函数的引用③内部函数使用到了外部函数传递的参数.
如下代码就是一个闭包:
def outer(a,b):
def inner():
nonlocal a #使用并修改外部函数的变量需要声明nonlocal,否则不能修改.
a = 100
c = 1000
return a*b*c
return inner
f = outer(1,2)
g = f()
print(g)
运行结果:
200000