博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python之匿名函数
阅读量:6258 次
发布时间:2019-06-22

本文共 2553 字,大约阅读时间需要 8 分钟。

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

匿名函数

  1. lambda关键字来定义
  2. 参数列表不需要小括号
  3. 冒号不是开启新的语句块的
  4. 只能写在一行上
  5. 没有return语句,最后一个表达式的值就是返回值

一个简单的例子:

In [1]: lambda x: x+1Out[1]: 
># 第一种用法(lambda x: x + 1)(3) # 第一个括号用来改变优先级,第二对括号表示函数调用In [2]: (lambda x: x+1)(3)Out[2]: 4# 第二种用法,把匿名函数赋值给变量f = lambda x: x + 1f(5)In [3]: f = lambda x: x+1In [4]: f(5)Out[4]: 6lambda x, y: x + y# 也可以这样调用(lambda x, y: x + y)(3, 5) # 第一个括号是用来改变优先级的,第二个括号是调用函数的add = lambda x, y: x + yadd(3, 5)

也可以设置默认参数:

lambda x, y=1: x + yadd = lambda x, y=1: x + yadd(3)# 调用的时候也可以用关键字参数add(x=5)lambda x, y=1: x + y
at 0x1019e10d0>add = lambda x, y=1: x + yadd(3)4# 调用的时候也可以用关键字参数add(x=5)6

可变参数可以吗?

In [5]: f = lambda *x: xIn [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: kwIn [10]: f(a=0)Out[10]: {'a': 0}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): x for x in range(3)})(0, 1, 2) {'0': 0, '1': 1, '2': 2}In [14]: (lambda *args, **kwargs: print(args, kwargs))(*range(3), **{str(x): x for x in range(3)})(0, 1, 2) {'0': 0, '1': 1, '2': 2}

参数槽可以吗?

In [15]: f = lambda x, *, y: x+yIn [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 = (lambda x, y: x if x < y else y)In [20]: lower(7, 3)Out[20]: 3In [21]: lower('a', 'b')Out[21]: 'a'In [22]: lower(2.3, 4.5)Out[22]: 2.3

匿名函数通常和高阶函数配合使用,作为参数传入,或者作为返回值返回。

匿名函数最好不要定义成递归函数。

In [29]: fib = lambda n: 1 if n == 0 or n == 1 else fib(n-1) + fib(n-2)In [30]: fib(5)Out[30]: 8

一个例子:

from collections import namedtupleUser = namedtuple('User', ['name', 'age'])users = [User('lavenliu', 23), User('taoqi', 20)]def get_age(user):    return user.agesorted(users, key=get_age)[User(name='taoqi', age=20), User(name='lavenliu', age=23)]# 或者使用匿名函数sorted(users, key=lambda x: x.age)[User(name='taoqi', age=20), User(name='lavenliu', age=23)]list(map(lambda x: x.age, users))list(filter(lambda x: x.age < 30, users))

自己实现一个map函数,

In [31]: def map_(fn, it):    ...:     return [fn(x) for x in it]    ...: In [32]: def square(n):    ...:     return n ** 2    ...: In [33]: lst1 = [1, 2, 3, 4, 5]# 使用自定义的map函数In [34]: map_(square, lst1)Out[34]: [1, 4, 9, 16, 25]

自己实现一个filter函数,

def filter_(fn, it):    return [x for x in it if fn(x)]

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

转载于:https://blog.51cto.com/lavenliu/2122629

你可能感兴趣的文章
Git-命令行-删除本地和远程分支
查看>>
本文将介绍“数据计算”环节中常用的三种分布式计算组件——Hadoop、Storm以及Spark。...
查看>>
顺序图【6】--☆☆
查看>>
Docker Swarm 让你事半功倍
查看>>
string.Format字符串格式说明
查看>>
[转]IC行业的牛人
查看>>
javaScript事件(四)event的公共成员(属性和方法)
查看>>
linux系统常用命令
查看>>
在 Word 中的受支持的区域设置标识符的列表
查看>>
Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明2
查看>>
An easy to use android color picker library
查看>>
Oracle SID爆破工具SidGuess
查看>>
批处理常用命令总结2
查看>>
解读ASP.NET 5 & MVC6系列(9):日志框架
查看>>
MyEclipse生成WAR包并在Tomcat下部署发布(转发)
查看>>
Android -- 自定义View小Demo,绘制钟表时间(一)
查看>>
信息检索Reading List
查看>>
JavaWeb_JavaEE_命名规则
查看>>
申小雨命案审理延期至3月5日 警方将翻译嫌犯口供
查看>>
自动精简配置&重复数据删除核心技术点及其经济效应探究
查看>>