普通函数
由于python为动态类型语言,这样函数就具备了天然的多态性,而在重载性方面python则不予支持。在可变参数方面,python提供了list和map类型参数作为支持,如下面函数:
func(*args):args为list列表类型,实参为:func(1,2,3)
func(**kwargs):kwargs为map键值对类型,实参为:func(k1=v1,k2=v2)
func(key=’a’):默认参数为a,func(key)/func()
func(a,b,c):显示调用参数名,func(a=1,b=2,c=3)
lambda匿名函数
与数据一样,函数也可作为变量传递。python可显示定义函数,也可定义匿名函数,这也就是lambda类型函数。
list方法sort(*,key=None,reverse=None),key就可以指定一个函数来获取,[‘abc’,’ABC’].sort(key=str.lower),这里的key可以指定一个匿名函数,sort(lambdapoint:point.x),point为包含坐标x和y的点。
items= [I for I in range(10)] #这里也是采用lambda来定义一个列表
lambda函数避免了冗余的函数定义,可作为实参传递也可作为返回值进行传递。
def test_add(n):
f= lambda h:h+n
return f
test_add(3)(4)
注意的是:lambda函数在python中有1个限制:因为必须在一行,故定义必须为单一表达式,不能包含有更多的语句(含return)。也就是说,不能这样定义:
lambda key: key = key + 2 return key
map-filter-reduce模式
与信号处理一样,一个程序对数据的处理模式可以抽象为数据的变换-过滤-规约,作为函数式语言的标配,python也提供此类函数链的支持。
map函数操作原型为:map(function,iterable1,iterable2,….),对每个迭代器执行function操作,返回一个list列表
filter函数操作原型为:filter(function,iterable),等价于[item foritem in iterable if function(item)]如果function为None,则为[item foritem in iterable if item]
reduce函数操作原型为:reduce(function,iterable,[,initializer]),将迭代器中的元素执行function操作,initializer为规约初始值。
reduce(lambda x,y:x + y,[1,2,3,4,5]):对list列表元素求和。
map(lambda key:return ):对list列表中每个元素加2,map(lambdakey:key + 2,[1,2,3,4,5])
filter:从list列表中过滤偶数,filter(lambdakey:key %2 == 0,[1,2,3,4,5])
如对列表中的偶数实现加法操作:
reduce(lambdax,y:x+y,filter(lambda key:key %2 == 0,[1,2,3,4,5]))
函数闭包
如前面描述的一样,python中每个函数都可作为变量传递。从另一方面来说,一个函数就是一个类,每个变量都是一个对象,这个函数类中可以定义变量和函数,函数中定义内部函数就构成了函数闭包。
def test_func(n):
var = n
def g():
return var
def s(v):
var = v
return var
return (g,s)
在上述函数中,test_func定义了1个变量var,2个函数g,s并返回该2个函数,内部函数g,s引用外部函数变量。
g,s = test_func(3)
print(s(30))#30
print(g())#3
调用后s()函数并未修改变量var的值,因为var默认为局部变量,只有声明了nonlocal(非局部)变量才能引用外部变量。
除显示定义内部函数外,也可通过库函数functool.partial来返回一个函数对象。
管道模式
因函数可以作为变量传递,这样可形成高阶函数(f(f(x))),每个函数返回一个迭代器,最终形成了多层函数的处理方式,一个函数输入迭代器,另一个函数输出迭代器,这样的输入输出称之为管道模式。
领取专属 10元无门槛券
私享最新 技术干货