Python 核心技术与实战
景霄
Facebook 资深工程师
78765 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
Python 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

10 | 简约不简单的匿名函数

你好,我是景霄。
上一节,我们一起学习了 Python 中的“常规”函数,用途十分广泛。不过,除了常规函数,你应该也会在代码中见到一些“非常规”函数,它们往往很简短,就一行,并且有个很酷炫的名字——lambda,没错,这就是匿名函数。
匿名函数在实际工作中同样举足轻重,正确地运用匿名函数,能让我们的代码更简洁、易读。这节课,我们继续 Python 的函数之旅,一起来学习这个简约而不简单的匿名函数。

匿名函数基础

首先,什么是匿名函数呢?以下是匿名函数的格式:
lambda argument1, argument2,... argumentN : expression
我们可以看到,匿名函数的关键字是 lambda,之后是一系列的参数,然后用冒号隔开,最后则是由这些参数组成的表达式。我们通过几个例子看一下它的用法:
square = lambda x: x**2
square(3)
9
这里的匿名函数只输入一个参数 x,输出则是输入 x 的平方。因此当输入是 3 时,输出便是 9。如果把这个匿名函数写成常规函数的形式,则是下面这样:
def square(x):
return x**2
square(3)
9
可以看到,匿名函数 lambda 和常规函数一样,返回的都是一个函数对象(function object),它们的用法也极其相似,不过还是有下面几点区别。
第一,lambda 是一个表达式(expression),并不是一个语句(statement)
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(128)

  • 最新
  • 精选
  • Hoo-Ah
    第一问:sorted(d.items(), key=lambda x: x[1], reverse=True); 第二问:最开始接触 lambda 匿名函数的时候觉得蛮不理解的,觉得这个函数没有灵魂,用完一次就扔掉。后来在和高阶函数、列表生成式搭配使用以及一些小功能的使用上觉得很好用,这样代码即简洁又易于阅读。 注:匿名函数最难理解的地方就是要传入的参数是一个可迭代的对象,lambda 内部会调用可迭代对象的 __next__ 方法取值当作参数传入 lambda 函数冒号前面的值,然后把表达式计算的结果进行返回。

    作者回复: 你说的对。关于迭代器生成器后面会讲到,所以这篇文章没有提及。

    9
    80
  • lmingzhi
    python3 -mtimeit -s'xs=range(1000000)' 'map(lambda x: x*2, xs)' 这个地方map生成的是生成器,与后面的2个做比较感觉不大合适,是否更改为测试list(map(lambda x: x*2, xs))更恰当?

    作者回复: 实际情况中,Map返回的对象依然可以直接遍历,所以直接比较从实用的角度上来说也是可以的,Map在Python3中变为Lazy了以后,速度得到了很大的提升。当然,如果以返回的类型一致为标准,你的建议也是可以的

    3
    35
  • 向南
    ```python sorted(d.items(), key=lambda x: x[1], reverse=True) ``` lambda函数在数据清洗的时候,作用很大

    作者回复: 必须的

    6
  • daowuli_chihai
    下面代码,print(new_list)报错,而改成print(list(new_list))可以输出所有偶数,python3.8版本 和之前版本 不同? l = [1, 2, 3, 4, 5] new_list = filter(lambda x: x % 2 == 0, l) # [2, 4]

    作者回复: filter/map都是返回一个iterator,我注释写成[2, 4]只是为了更直观的表示这个函数的功能哈

    1
  • Kevin
    第一问:不知道这么写对不对。 d = {'mike': 10, 'lucy': 2, 'ben': 30} print(sorted(d, key=lambda x:x[1], reverse=False)) 输出:['ben', 'mike', 'lucy']

    作者回复: 没问题哈

    2
  • Steve
    喜欢这种讲解方式,能不能再开一个JavaScript的课?

    作者回复: Javascript我不是特别精通哈

  • 谁谁
    请问老师,如何理解这一句: [(lambda x: x*x)(x) for x in range(10)] 其中的(lambda x: x*x)(x),这个lambda函数括起来是代表直接调用?

    作者回复: 这个就是语法啊,这句话的意思就是对于1-10的每个整数,都调用lambda函数(自身相乘)

    3
  • Freshman
    # 获得排序的元组,字典 list_1 = [item for item in ori_dict.items()] list_1.sort(key=lambda val: val[1], reverse=True) # 重新生成字典 dict_1 = {key: value for key, value in list_1}

    作者回复: 对

  • 可乐泡枸杞
    sorted(d.items(), key= lambda x:-x[1])

    作者回复: 嗯嗯

  • Jove
    思考题答案: d = {'mike': 10, 'lucy': 2, 'ben': 30} sorted(d.items(), key=lambda x:x[1])

    作者回复: 由高到低排序,注意加上reverse=True

收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部