对 a = [lambda : x for x in range(3)] 的理解
- 上面的语句创建了一个列表 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)] 的理解相关推荐
- Python教程:对 a = [lambda : x for x in range(3)] 的理解
上面的语句创建了一个列表 a ,其中有三个元素,每个元素都是一个 lambda 匿名函数. >>> a = [lambda : x for x in range(3)] >&g ...
- python3 lambda函数字典排序_排序字典表理解中的lambda函数
我有以下词典:student_loan_portfolio = { 'loan1': {'rate': .078, 'balance': 1000, 'payment': 100, 'prepayme ...
- 关于Range()函数的理解及代码解释
(一)Range()函数理解 Range()函数是python中的一个内置函数,和intput(),print()类似.它的作用是按照某种规则来创建一个整数序列对象,共有三种创建方法,本文将会讲解这三 ...
- Python天天美味(35) - 细品lambda
lambda函数也叫匿名函数,即,函数没有具体的名称.先来看一个最简单例子: def f(x): return x**2 print f(4) Python中使用lambda的话,写成这样 g ...
- 零基础入门学习Python(20)-lambda表达式、filter()、map() BIF
lambda表达式 lambda关键字的使用 Python允许使用lambda关键字来创建匿名函数 基本语法:使用冒号(:)分隔函数的参数及返回值,冒号左边放置函数的参数,如果有多个参数,使用逗号(, ...
- Python特殊语法:filter、map、reduce、lambda [转]
filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决 ...
- 如何使用十进制range()步长值?
有没有办法在0和1之间以0.1步进? 我以为我可以像下面那样做,但是失败了: for i in range(0, 1, 0.1):print i 相反,它说step参数不能为零,这是我没有想到的. # ...
- python-匿名函数lambda
python-匿名函数lambda 有些时候,我们在传入函数时,不需要显示的定义函数,直接传入匿名函数更方便.在python中,对匿名函数提供了有限支持.以map()函数为例,计算f() = x2,使 ...
- python map lambda 分割字符串_python之lambda、filter、map、reduce的用法说明(基于python2)...
python中有一些非常有趣的函数,面试的时候可能会遇到.今天也来总结一下,不过该类的网上资料也相当多,也没多少干货,只是习惯性将一些容易遗忘的功能进行整理. lambda 为关键字.filter,m ...
- Python内置函数filter()和匿名函数lambda解析
一.内置函数filter filter()函数是 Python 内置的一个高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回由符合条件迭代器 ...
最新文章
- 使用mss2sql将SqlServer转换为Mysql
- Elasticsearch安装(Linux)
- python之datetime模块
- SOAP 1.1 - 学习
- html 长文本 截断 jquery 扩展脚本
- buffer 和cache的区别
- 8.2捷联惯导算法仿真 代码整理分析(一)
- 网格计算, 云计算, 集群计算, 分布式计算, 超级计算
- Flutter 实现切角渐变矩形
- 电子元器件贸易采购管理常见难题及解决方案
- 西安拟制定羊肉泡馍肉夹馍制作标准
- 利用Serv-u提权的简单思路
- 学习笔记 | 数据采集系统基本结构及参数
- DCHP 中继,攻击防范配置
- 【PraNet】主要架构解读-------wmilk
- iis7 php 5.4,laravel 5.4如何在iis 7环境中安装
- 用java代码计算BMI指数
- 03【设计模式的七大原则】
- vim使用ctrl+v与粘粘快捷键冲突无法进入可视化块怎么办
- 虚幻引擎图文笔记:官方模板中第三人称角色(ThirdPersonCharacter)的构成图解
热门文章
- 毕设 公式 格式 如何设置(WPS)
- 苹果无线网服务器改什么速度快,iPhone网速慢怎么办?苹果手机如何配置DNS?
- 速卖通关键词挖掘工具_谷歌优化关键词挖掘工具大全
- SAP 财务本地化-账结法
- opencv图像分析与处理(10)- 常见的噪声以及空间滤波器噪声消除方法
- (超详细)张正友标定法原理及公式推导
- c语言程序方差的计算公式,方差计算公式
- stata--异方差检验
- 【支付宝商家中心】支付功能签约,产品签约失败;修改经营类目;系统检测到您的账户不符合国家相关法律法规或《支付宝用户服务协议》约定
- 机器人算法工程师入门指南(三)机器人算法工程师需要学习哪些知识?(及教材推荐)