Python 之 for循环中的lambda
第一种
f = [lambda x: x*i for i in range(4)] (如果将x换成i,调用时候就不用传参数,结果都为3)
对于上面的表达式,调用结果:
>>> f = [lambda x:x*i for i in range(4)]
>>> f[0](1)
3 # 1*3
>>> f[1](1)
3 # 1*3
>>> f[2](1)
3 # 1*3
>>> f[3](1)
3 # 1*3
>>> f[0](3)
9 # 3*3
>>> f[1](3)
9 # 3*3
>>> f[2](3)
9 # 3*3
>>> f[3](3)
9 # 3*3
上面的表达式展开如下:
def func():
fs = []
for i in range(4):
def lam(x):
return x*i
fs.append(lam)
return fs
当调用 func() 时,每循环一次,将 lam 函数的地址存到 fs 中。因为在每次循环中 lam函数都未绑定 i 的值,所以直到循环结束,i 的值为3,并将 lam 中所用到的 i 值定为 3 ,因此真正调用(例如f[0](3))的时候 i 值保持不变(为3)。
展开后的调用方法:
>>> def func():
... fs = []
... for i in range(4):
... def lam(x):
... return x*i
... fs.append(lam)
... return fs
...
>>> f = func()
>>> f[0](3)
9
>>> f[2](3)
9
>>> f[1](3)
9
另一种将x换成i,就与传入的x值无关了。(这里 lambda 后面什么参数都不跟)
>>> f = [lambda :i*i for i in range(4)]
>>> f[0]()
9
>>> f[1]()
9
>>> f[2]()
9
>>> f[3]()
9
解释同上面。
第二种
f1 = [lambda i=i: i*i for i in range(4)]
对于上面的表达式,调用结果:
>>> f1 = [lambda i=i: i*i for i in range(4)]
>>> f1[0]()
0
>>> f1[1]()
1
>>> f1[2]()
4
>>> f1[3]()
9
上面的表达式展开如下(为了更直观,替换了变量):
def func():
fs = []
for i in range(4)
def lam(x=i): # 即 i=i
return x*x # 即 i*i
fs.append(lam)
return fs
当调用 func() 时,每循环一次,将 lam 函数的地址存到 fs 中。但是在每次循环中 lam函数都将 i 值绑定到了 x 上,所以直到循环结束,不同地址的 lam 函数的 x 值为都不一样,因此真正调用(例如 f[0]())的时候 x 值都为当时被绑定的值。
但如果给 lam 函数传了参数,例如 f[0](8),那么所有的调用结果都为传参的平方。与上面解释并不冲突,只是将传的参数绑定到了 x 上。
>>> f1 = [lambda i=i: i*i for i in range(4)]
>>> f1[0](8)
64
>>> f1[1](8)
64
>>> f1[2](8)
64
>>> f1[3](8)
64
最后一种
f2 = [lambda x=i: i*i for i in range(4)]
哈哈哈哈,和第二种好像,只是变了一个字符,那么结果就大不一样了,哈哈哈哈
对于上面的表达式,调用结果:
>>> f2 = [lambda x=i: i*i for i in range(4)]
>>> f2[0]()
9
>>> f2[1]()
9
>>> f2[2]()
9
>>> f2[3]()
9
>>> f2[0](7)
9
>>> f2[1](7)
9
>>> f2[2](7)
9
传不传参数都不影响结果。展开后:
def func():
fs = []
for i in range(4)
def lam(x=i):
return i*i
fs.append(lam)
return fs
虽然 lam 函数将 i 的值绑定到了 x 上,但函数体中并未使用 x,所以直到循环结束,i 的值变为3,才会在调用时使用。其实同第一种情况是一样的。
最后:我写的也好乱,还是多试试吧。
Python 之 for循环中的lambda的更多相关文章
- python:笔记for循环中的else
我们常常会在for循环遍历一个序列或者字典后,接着语句else,很多新手会误以为是判断执行else后面的 代码,其实不然,for循环里面也不存在判断,而已执行完遍历的对象后,再执行else后面的代码. ...
- Python3 循环_break和continue语句及循环中的else子句
break和continue语句及循环中的else子句break语句可以跳出for和while的循环体.如果你从for或while循环中终止,任何对应的循环else块将不执行. continue语句被 ...
- for循环中i--的妙用 及 两变量互换数值的问题
int[] array = new int[4]; for(int i = 0; i < array.length; i++){ array[i] = (int)(Math.random() * ...
- 在jquery中each循环中,要用return false代替break,return true代替continue。
在jquery中each循环中,要用return false代替break,return true代替continue. $.each(data, function (n, value) { if(v ...
- JavaScript形而上的For循环中的Break
break相当于循环中的GOTO,需避免使用. 下面是一个break使用例子. 找出第一个months小于7的项目. const cats = [ { name: 'Mojo', months: 84 ...
- vue 如何在循环中 "监听" 的绑定v-model数据
vue 如何在循环中 "监听" 的绑定v-model数据 阅读目录 vue 如何在循环中 "监听" 的绑定v-model数据 1. 普通属性的值进行监听 2. ...
- Java循环中try...finally...遇到continue
一段很简单的代码,先自己在大脑中给出结果: for (int i = 0; i < 5; i++) { System.out.println("enter: i=" + i) ...
- 浅谈循环中setTimeout执行顺序问题
浅谈循环中setTimeout执行顺序问题 (下面有见解一二) 期望:开始输出一个0,然后每隔一秒依次输出1,2,3,4. for (var i = 0; i < 5; i++) { setTi ...
- django for 循环中,获取序号
模板的for循环中,如何获取序号? 想过用enumerate,但是在模板中会报错 Could not parse the remainder xxx: 后来搜到 forloop.counter,完美解 ...
随机推荐
- 关于Ciarlet的泛函的一道homework的一个想法
[转载请注明出处]http://www.cnblogs.com/mashiqi 2016/11/21 有一道题是证明$(\mathbb{R}^n,\|\cdot\|_p)$当$p : 1< p ...
- 用python+selenium从百度获取本地明日的天气信息并根据温度情况设置提醒
从百度天气获取当地明天的天气情况,如果明天下雨,请发送邮件通知全体同事带伞, 如果明天气温低于10度,请邮件提醒同事注意保暖,如果气温高于30度则提醒同事注意高温. 假设存在发送邮件的方法self.s ...
- linux 常见问题&解决方案
Q1: 错误重现: linux下 用tar -zxf xxx.tar.bz2 报错: gzip: stdin: not in gzip format tar: Child returned statu ...
- C#编程语言与面向对象——类与对象
由于ASP.NET技术是全面向对象的,因此,要掌握这一技术,必须具备有扎实的面向对象理论基础 使用C#编程,所有的程序代码几乎都放在类中,不存在独立于类中之外的函数,因此,类是面向对象编程的基本单元 ...
- debain 8安装为知笔记(how to install wiznote in debain 8)
刚装了debain8后想安装为知笔记,百度之后发现为知笔记原来是开源软件.代码托管在github上:https://github.com/WizTeam/WizQTClient 但是上面只有Ubunt ...
- input 边框颜色
border 的属性 有三个 border:5px solid red; 如果上述值缺少一个没有关系,例如border:#FF0000;是允许的. 分别对应:border-width, border- ...
- 安装Nginx的Dockerfile实例
#################################################Dockerfile to build Nginx Installed Containers##Bas ...
- Xcode开发openCV for iOS 时#include <list> not found
分析 在做混合编译之前一定要把编译器的Compile Sources As选项改为Objective C++. 默认的选项是According to file type,用这个的话,你后面每个不在交叉 ...
- php操作Memcache
一.memcache基本的介绍 是一个高性能的分布式内存对象缓存系统. 和mysql比较,进行理解memcache (1)该软件是一个c/s架构, (2)mysql的数据是存储到哪里的?是存储到磁盘里 ...
- memory corruption
今天遇到了一个比较弱的问题,但是涉及到一些东西,所以记录一下. 问题表现为,系统BOSD,在析构函数进行free的时候,有的时候是在使用buffer的过程中就BSOD. 之前是怀疑因为分配的是page ...