• 上面的语句创建了一个列表 a ,其中有三个元素,每个元素都是一个 lambda 匿名函数。
>>> a = [lambda : x for x in range(3)]
>>> a
[<function <listcomp>.<lambda> at 0x7f79c874ae18>,
<function <listcomp>.<lambda> at 0x7f79c874aea0>,
<function <listcomp>.<lambda> at 0x7f79c874af28>]
>>> a[0]()
2
>>> a[1]()
2
>>> a[2]()
2
>>>
  • 可是为什么三个函数的返回值都为 2 呢?

  • 这是因为函数创建的时候,并没有传递参数,而只有当我们最后调用三个函数的时候,这时候 x 才被作为实参传递进 lambda 函数,而此时的 x = 2,所以三个函数的返回值都为 2。

  • 以下的例子就可以很清晰地说明这个问题。

>>> a = []
>>> for i in range(3):
...     a.append(lambda:i)
...
>>> a
[<function <lambda> at 0x7f79c88022f0>,
<function <lambda> at 0x7f79c8802378>,
<function <lambda> at 0x7f79c8802400>]
>>> a[0]()
2
>>> a[1]()
2
>>> a[2]()
2
>>> i
2
>>> i = 10
>>> a[2]()
10
>>>
  • Python 的 for 循环并不会引入新的作用域,因此当最后调用 lambda 函数的时候,实际上是把当前 i 的值 2 传递了进去,而当我们更改了 i 的值后,函数的返回值也就相应改变了。

  • 再看下面这个例子。

>>> a = [lambda x=x : x for x in range(3)]
>>> a[0]()
0
>>> a[1]()
1
>>> a[2]()
2
>>> a[2](10)
10
  • 这次,在循环过程中,我们创建函数的时候把 x 的值作为默认参数传递了进去,因此输出就变成了 0, 1, 2,相当于使用了默认参数。

  • 而如果我们将列表替换成元组,a 就变成了一个生成器,看下面的例子。

>>> a = (lambda:x for x in range(3))
>>> a
<generator object <genexpr> at 0x7f79c8f08200>
>>> next(a)
<function <genexpr>.<lambda> at 0x7f79ca827f28>
>>> next(a)
<function <genexpr>.<lambda> at 0x7f79c88022f0>
>>> next(a)
<function <genexpr>.<lambda> at 0x7f79ca827f28>
>>> next(a)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration
>>> a = (lambda:x for x in range(3))
>>> next(a)()
0
>>> next(a)()
1
>>> next(a)()
2
>>> next(a)()
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration
>>>

获取更多精彩,请关注「seniusen」!

对 a = [lambda : x for x in range(3)] 的理解相关推荐

  1. Python教程:对 a = [lambda : x for x in range(3)] 的理解

    上面的语句创建了一个列表 a ,其中有三个元素,每个元素都是一个 lambda 匿名函数. >>> a = [lambda : x for x in range(3)] >&g ...

  2. python3 lambda函数字典排序_排序字典表理解中的lambda函数

    我有以下词典:student_loan_portfolio = { 'loan1': {'rate': .078, 'balance': 1000, 'payment': 100, 'prepayme ...

  3. 关于Range()函数的理解及代码解释

    (一)Range()函数理解 Range()函数是python中的一个内置函数,和intput(),print()类似.它的作用是按照某种规则来创建一个整数序列对象,共有三种创建方法,本文将会讲解这三 ...

  4. Python天天美味(35) - 细品lambda

    lambda函数也叫匿名函数,即,函数没有具体的名称.先来看一个最简单例子: def f(x):     return x**2 print f(4) Python中使用lambda的话,写成这样 g ...

  5. 零基础入门学习Python(20)-lambda表达式、filter()、map() BIF

    lambda表达式 lambda关键字的使用 Python允许使用lambda关键字来创建匿名函数 基本语法:使用冒号(:)分隔函数的参数及返回值,冒号左边放置函数的参数,如果有多个参数,使用逗号(, ...

  6. Python特殊语法:filter、map、reduce、lambda [转]

    filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决 ...

  7. 如何使用十进制range()步长值?

    有没有办法在0和1之间以0.1步进? 我以为我可以像下面那样做,但是失败了: for i in range(0, 1, 0.1):print i 相反,它说step参数不能为零,这是我没有想到的. # ...

  8. python-匿名函数lambda

    python-匿名函数lambda 有些时候,我们在传入函数时,不需要显示的定义函数,直接传入匿名函数更方便.在python中,对匿名函数提供了有限支持.以map()函数为例,计算f() = x2,使 ...

  9. python map lambda 分割字符串_python之lambda、filter、map、reduce的用法说明(基于python2)...

    python中有一些非常有趣的函数,面试的时候可能会遇到.今天也来总结一下,不过该类的网上资料也相当多,也没多少干货,只是习惯性将一些容易遗忘的功能进行整理. lambda 为关键字.filter,m ...

  10. Python内置函数filter()和匿名函数lambda解析

    一.内置函数filter filter()函数是 Python 内置的一个高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回由符合条件迭代器 ...

最新文章

  1. 使用mss2sql将SqlServer转换为Mysql
  2. Elasticsearch安装(Linux)
  3. python之datetime模块
  4. SOAP 1.1 - 学习
  5. html 长文本 截断 jquery 扩展脚本
  6. buffer 和cache的区别
  7. 8.2捷联惯导算法仿真 代码整理分析(一)
  8. 网格计算, 云计算, 集群计算, 分布式计算, 超级计算
  9. Flutter 实现切角渐变矩形
  10. 电子元器件贸易采购管理常见难题及解决方案
  11. 西安拟制定羊肉泡馍肉夹馍制作标准
  12. 利用Serv-u提权的简单思路
  13. 学习笔记 | 数据采集系统基本结构及参数
  14. DCHP 中继,攻击防范配置
  15. 【PraNet】主要架构解读-------wmilk
  16. iis7 php 5.4,laravel 5.4如何在iis 7环境中安装
  17. 用java代码计算BMI指数
  18. 03【设计模式的七大原则】
  19. vim使用ctrl+v与粘粘快捷键冲突无法进入可视化块怎么办
  20. 虚幻引擎图文笔记:官方模板中第三人称角色(ThirdPersonCharacter)的构成图解

热门文章

  1. 毕设 公式 格式 如何设置(WPS)
  2. 苹果无线网服务器改什么速度快,iPhone网速慢怎么办?苹果手机如何配置DNS?
  3. 速卖通关键词挖掘工具_谷歌优化关键词挖掘工具大全
  4. SAP 财务本地化-账结法
  5. opencv图像分析与处理(10)- 常见的噪声以及空间滤波器噪声消除方法
  6. (超详细)张正友标定法原理及公式推导
  7. c语言程序方差的计算公式,方差计算公式
  8. stata--异方差检验
  9. 【支付宝商家中心】支付功能签约,产品签约失败;修改经营类目;系统检测到您的账户不符合国家相关法律法规或《支付宝用户服务协议》约定
  10. 机器人算法工程师入门指南(三)机器人算法工程师需要学习哪些知识?(及教材推荐)