Python核心技术与实战
景霄
Facebook资深工程师
立即订阅
13891 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 从工程的角度深入理解Python
免费
基础篇 (14讲)
01 | 如何逐步突破,成为Python高手?
02 | Jupyter Notebook为什么是现代Python的必学技术?
03 | 列表和元组,到底用哪一个?
04 | 字典、集合,你真的了解吗?
05 | 深入浅出字符串
06 | Python “黑箱”:输入与输出
07 | 修炼基本功:条件与循环
08 | 异常处理:如何提高程序的稳定性?
09 | 不可或缺的自定义函数
10 | 简约不简单的匿名函数
11 | 面向对象(上):从生活中的类比说起
12 | 面向对象(下):如何实现一个搜索引擎?
13 | 搭建积木:Python 模块化
14 | 答疑(一):列表和元组的内部实现是怎样的?
进阶篇 (11讲)
15 | Python对象的比较、拷贝
16 | 值传递,引用传递or其他,Python里参数是如何传递的?
17 | 强大的装饰器
18 | metaclass,是潘多拉魔盒还是阿拉丁神灯?
19 | 深入理解迭代器和生成器
20 | 揭秘 Python 协程
21 | Python并发编程之Futures
22 | 并发编程之Asyncio
23 | 你真的懂Python GIL(全局解释器锁)吗?
24 | 带你解析 Python 垃圾回收机制
25 | 答疑(二):GIL与多线程是什么关系呢?
规范篇 (7讲)
26 | 活都来不及干了,还有空注意代码风格?!
27 | 学会合理分解代码,提高代码可读性
28 | 如何合理利用assert?
29 | 巧用上下文管理器和With语句精简代码
30 | 真的有必要写单元测试吗?
31 | pdb & cProfile:调试和性能分析的法宝
32 | 答疑(三):如何选择合适的异常处理方式?
量化交易实战篇 (8讲)
33 | 带你初探量化世界
免费
34 | RESTful & Socket: 搭建交易执行层核心
35 | RESTful & Socket: 行情数据对接和抓取
36 | Pandas & Numpy: 策略与回测系统
免费
37 | Kafka & ZMQ:自动化交易流水线
38 | MySQL:日志和数据存储系统
39 | Django:搭建监控平台
40 | 总结:Python中的数据结构与算法全景
技术见闻与分享 (4讲)
41 | 硅谷一线互联网公司的工作体验
42 | 细数技术研发的注意事项
加餐 | 带你上手SWIG:一份清晰好用的SWIG编程实践指南
43 | Q&A:聊一聊职业发展和选择
结束语 (1讲)
结束语 | 技术之外的几点成长建议
Python核心技术与实战
登录|注册

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

景霄 2019-05-31
你好,我是景霄。
上一节,我们一起学习了 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Python核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(72)

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

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

    2019-05-31
    2
    24
  • 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了以后,速度得到了很大的提升。当然,如果以返回的类型一致为标准,你的建议也是可以的

    2019-05-31
    18
  • 每次听音频的时候,老师说到建议听音频的同学打开文章,获得最优学习体验时,我就想把这段话装入函数里,哈哈哈
    2019-06-15
    9
  • Geek_59f23e
    1. sorted(d.item(), key = lambda x: x[1], reverse = True)

    2. 一般想偷懒和装X的时候用(来个玩笑😜)
    2019-05-31
    7
  • 爬行的蜗牛
    1.reduce报错问题,python3需要加
    from functools import reduce
    2.filter,print变量时,需要加list()
    如下:
    l =[1,2,3,4,5]
    new_list3 = filter(lambda x:x%2==0,l)
    list(new_list3)
    # 输出
    [2,4]
    2019-06-04
    6
  • Jove
    在python3中,map、filter函数返回的是迭代器,不是集合
    2019-05-31
    3
  • Geek_59f23e
    一楼说的对,list(map(###))和列表推导式对比更科学,显然后者生成列表速度更快,另外我实测圆括号生成器和map生成器速度在一个数量级,性能差别很小,结果如下:

    函数generator被调用了1000000次,共计用时:2.248 秒
    <generator object generator.<locals>.<genexpr> at 0x000002D735AE5ED0>

    函数map被调用了1000000次,共计用时:2.243 秒
    <map object at 0x000002D7346F7470>
    2019-05-31
    3
  • hello,everyone
    数据清洗过程常用lambda 函数
    data["工作日"] = data["日期"].map(lambda x: x.weekday())
    data["工作日"] = data["工作日"].map(lambda x: 1 if x<5 else 0)
    2019-07-26
    2
  • kilien
    不好意思问个低级问题,
    python -mtimeit -s'xs=range(1000000)' 'map(lambda x: x*2, xs)'
    这句代码在windows的dos环境里跑的话,会报SyntaxError: EOL while scanning string literal, Python版本是3.6.3,-s后面好像只能接受一对单引号
    2019-06-10
    2
  • Steven
    我还以为列表推导式已经是公认的说法了,原来还没有统一呀😄 。
    不过之前也有看过流畅的python,好像说也是列表推导式比map更快。
    2019-06-02
    1
    2
  • catshitfive
    应用场景举个栗子:比如在 pandas 中对二维数据进行数据分析时,对于某些数据块我们需要用函数如apply applymap transform 等进行临时性一次性的转换变更以得到最终的分析结果,那么就可以用匿名函数配合着来使用,使代码更简洁易读高效
    2019-05-31
    2
  • 跑跑
    dict(sorted(d.items(),key=lambda x:x[1], reverse=True))
    2019-06-04
    1
  • rogerr
    可耻地抄了一遍答案
    sorted(d.items(),key=lambda x:x[1],reverse=True)

    对lambda函数的语法还是不太清楚,感觉可读性没有普通函数那么清晰易懂呢,只是为了简洁么
    2019-06-02
    1
  • 风居住的街
    # map 生成序列的效率是最高的, 若要保证类型一致,赋值效率更高
    a = timeit.timeit("map(lambda x: x*2, range(100))")
    b = timeit.timeit("list(map(lambda x: x*2, range(100)))")
    c = timeit.timeit("[i*2 for i in range(100) ]")
    d = timeit.timeit("list1 = map(lambda x: x*2, range(100))")
    print(a)
    print(b)
    print(c)
    print(d)
    # output
    # 0.7083226156547896
    # 16.946590069091638
    # 7.938522968590437
    # 1.0409960818161217
    2019-06-02
    1
  • Paul Shan
    感觉Python的map,filter,reduce,不如其他的语言直观,例如map filter reduce组合的时候,Kotlin语言是从前往后执行,比较符合直觉,Python是从中间往两边执行的,比较费解。
    2019-11-14
  • 轻风悠扬
    sorted(d.items(), key = lambda x: x[1], reverse = True) 返回的是list of tuple, 我觉得答案应该是dict(sorted(d.items(), key = lambda x: x[1], reverse = True))
    2019-11-02
  • 轻风悠扬
    老师,python3 里面调用reduce 方法需要引入functools
    2019-11-02
  • 且行且珍惜
    sorted(d.items(), key=lambda x: x[1])
    2019-10-31
  • 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}

    作者回复: 对

    2019-10-14
  • 自由民
    总结:匿名函数lambda,是一个表达式,用于简化代码。用于简单的功能,且仅用一次。
    函数式编程是代码只有函数,且不改变的。在python中主要使用map,filter,reduce函数以及匿名函数,优点是比较高效。(匿名函数,函数式编程,跟闭包一样,以前就知道,但是从来没用过,真的了解了貌似没我想象的那么复杂。)
    思考题
    # 1 将字典按值从大到小排序
     import operator
     d = {"mike":10, "lucy":2, "ben":30}
     sort_d = sorted(d.items(), key=operator.itemgetter(1), reverse=True)
     print(sort_d)
    2.之前没用过,主要在很简短的一行代码而只需要用一次的地方。
    另外,python3中reduce移入functools库里了,要先import。
    课程的练习代码: https://github.com/zwdnet/PythonPractice
    2019-09-25
收起评论
72
返回
顶部