首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python语言特性:函数与闭包

普通函数

由于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))),每个函数返回一个迭代器,最终形成了多层函数的处理方式,一个函数输入迭代器,另一个函数输出迭代器,这样的输入输出称之为管道模式。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180426G1JUCO00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券