Python之匿名函数

Python之匿名函数

今天给大家介绍一下Python中的匿名函数。

匿名函数

由关键字来定义

参数列表不需要小括号

冒号不是开启新的语句块的

只能写在一行上

没有return语句,最后一个表达式的值就是返回值

一个简单的例子:

In[1]:lambdax:x+1

Out[1]:

# 第一种用法

(lambdax:x+1)(3)# 第一个括号用来改变优先级,第二对括号表示函数调用

In[2]:(lambdax:x+1)(3)

Out[2]:4

# 第二种用法,把匿名函数赋值给变量

f=lambdax:x+1

f(5)

In[3]:f=lambdax:x+1

In[4]:f(5)

Out[4]:6

lambdax,y:x+y

# 也可以这样调用

(lambdax,y:x+y)(3,5)# 第一个括号是用来改变优先级的,第二个括号是调用函数的

add=lambdax,y:x+y

add(3,5)

也可以设置默认参数:

lambdax,y=1:x+y

add=lambdax,y=1:x+y

add(3)

# 调用的时候也可以用关键字参数

add(x=5)

lambdax,y=1:x+y

add=lambdax,y=1:x+y

add(3)

4

# 调用的时候也可以用关键字参数

add(x=5)

6

可变参数可以吗?

In[5]:f=lambda*x:x

In[6]:f(1,2,3)

Out[6]:(1,2,3)

In[7]:lst=[1,2,3]

In[8]:f(*lst)

Out[8]:(1,2,3)

关键字参数可以吗?

In[9]:f=lambda**kw:kw

In[10]:f(a=)

Out[10]:{'a':}

In[11]:dict01={'name':'lavenliu.cn','age':23}

In[12]:f(**dict01)

Out[12]:{'age':23,'name':'lavenliu.cn'}

可变参数与可变关键字参数同时使用呢?

In[13]:(lambda*args,**kwargs:print(args,kwargs))(*range(3),**{str(x):xforxinrange(3)})

(,1,2){'0':,'1':1,'2':2}

In[14]:(lambda*args,**kwargs:print(args,kwargs))(*range(3),**{str(x):xforxinrange(3)})

(,1,2){'0':,'1':1,'2':2}

参数槽可以吗?

In[15]:f=lambdax,*,y:x+y

In[16]:f(1,y=3)

Out[16]:4

普通函数所支持的参数变化,匿名函数都支持。再来一例:

In[17]:concat=lambda*args:''.join(args)

In[18]:concat('a','b','c')

Out[18]:'abc'

In[19]:lower=(lambdax,y:xifx

In[20]:lower(7,3)

Out[20]:3

In[21]:lower('a','b')

Out[21]:'a'

In[22]:lower(2.3,4.5)

Out[22]:2.3

匿名函数通常和高阶函数配合使用,作为参数传入,或者作为返回值返回。匿名函数最好不要定义成递归函数。

In[29]:fib=lambdan:1ifn==orn==1elsefib(n-1)+fib(n-2)

In[30]:fib(5)

Out[30]:8

一个例子:

fromcollectionsimportnamedtuple

User=namedtuple('User',['name','age'])

users=[User('lavenliu',23),User('taoqi',20)]

defget_age(user):

returnuser.age

sorted(users,key=get_age)

[User(name='taoqi',age=20),User(name='lavenliu',age=23)]

# 或者使用匿名函数

sorted(users,key=lambdax:x.age)

[User(name='taoqi',age=20),User(name='lavenliu',age=23)]

list(map(lambdax:x.age,users))

list(filter(lambdax:x.age

自己实现一个map函数,

In[31]:defmap_(fn,it):

...:return[fn(x)forxinit]

...:

In[32]:defsquare(n):

...:returnn**2

...:

In[33]:lst1=[1,2,3,4,5]

# 使用自定义的map函数

In[34]:map_(square,lst1)

Out[34]:[1,4,9,16,25]

自己实现一个filter函数,

deffilter_(fn,it):

return[xforxinitiffn(x)]

今天的内容就到这里,欢迎大家继续关注小白的技术客栈。

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

同媒体快讯

扫码关注云+社区

领取腾讯云代金券