python中for x in range_python教程:对 [lambda x: x*i for i in range(4)] 理解
题目:
lst = [lambda x: x*i for i in range(4)]
res = [m(2) for m in lst]
print res
实际输出:[6, 6, 6, 6]
想要输出 [0, 2, 4, 6] 应该怎么改?如下:
lst = [lambda x, i=i: x*i for i in range(4)]
res = [m(2) for m in lst]
print res
这个问题涉及到了Python的闭包及延时绑定的知识(Python作用域)。
在Python核心编程里,闭包的定义如下:
如果在一个内部函数里,对外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认定是闭包。
总结为三点:
1、是一个内嵌函数
2、对外部函数变量引用
3、外部函数返回内嵌函数
简单的闭包例子:
def counter(start_at=0):
count = [start_at]
def incr():
count[0] += 1
return count[0]
return incr
上面的那道题,可以写成这样:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func():
fun_list = []
for i in range(4):
def foo(x):
return x*i
fun_list.append(foo)
return fun_list
for m in func():
print m(2)
func()是一个包含四个函数的列表:
[, , , ]
当我们执行 m(2) 时,运行到foo()内部函数,发现变量 i 并不是foo()中的变量,于是就到外部函数func中寻找变量 i ,但此时外部的 for 已经循环完毕,最后的 i =3 。所以,每次
执行m(2),i 的值都是 3 ,因此,最终结果会是 [6, 6, 6, 6] 。
当在foo()中添加 i=i 后,即:
def func():
fun_list = []
for i in range(4):
def foo(x, i=i):
return x*i
fun_list.append(foo)
return fun_list
for m in func():
print m(2)
这样的话,for循环执行时,就已经把 i(0, 1, 2, 3) 的值传给了foo()函数,此时的 i 已经是foo()函数的内部变量,运行到foo()函数时,就不会到外部函数寻找变量 i ,直接运行
python中for x in range_python教程:对 [lambda x: x*i for i in range(4)] 理解相关推荐
- Python中使用BeautifulReport形成测试报告教程
Python中使用BeautifulReport形成测试报告教程 pyton中使用BeautifulReport形成测试报告需要先安装BeautifulReport模块 打开cmd窗口输入 pip i ...
- 在Python中使用HTML模版的教程
在Python中使用HTML模版的教程 转载 2018-02-12 作者:廖雪峰 这篇文章主要介绍了在Python中使用HTML模版的教程,HTML模版也是Python的各大框架下的一个基本功能 ...
- Python中安装PyOpenGL:详细教程
Python中安装PyOpenGL:详细教程 如果你对Python编程有一定的了解,并且在计算机图形学领域有所涉猎,你可能会使用到PyOpenGL.PyOpenGL是Python的一个OpenGL绑定 ...
- Python中常用最神秘的函数! lambda 函数深度总结!
今天我们来学习 Python 中的 lambda 函数,并探讨使用它的优点和局限性 Let's do it! 什么是 Python 中的 Lambda 函数 lambda 函数是一个匿名函数(即,没有 ...
- Python中深浅拷贝的案例教程
在本节中,您将通过运行Python中的浅拷贝和深拷贝实例来理解copy模块创造副本的不同. 在Python中复制对象 在Python中,我们使用=运算符来创建对象的副本.您可能会认为这会创建一个新对象 ...
- 如何在python中安装Gurobi(详细教程)
最近在python中需要用Gurobi ,看了一下别人的教程,感觉不太满意,自己安装了一下,顺便梳理一下过程. 第一步 :下载gurobi ( http://www.gurobi.com ) 下载教程 ...
- python教程实例-Python中函数的用法实例教程
本文以数值计算为例讲述了Python中函数的用法,分享给大家供大家参考借鉴之用.具体如下: 我们都知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需 ...
- python中format的用法菜鸟教程-初学者必知的Python中优雅的用法
枚举 之前我们这样操作: i = 0 for item in iterable: print i, item i += 1 现在我们这样操作: for i, item in enumerate(ite ...
- python中PIL的安装参考教程
相信不少同学想使用python处理一些RGB的图片,但是对于python又不熟悉,处于白菜阶段,没错就是和我一样,今天刚好有这样一个任务需要读取RGB图像的像素值,其实就是灰度值.之前采用matlab ...
最新文章
- 任正非最新内部信:过去只为赚点小钱,现在要用5G+AI战胜美国
- HTML5 应用程序缓存
- pass4side IBM 000-M15
- 语音识别:时间序列Damerau–Levenshtein距离
- jenkins active exited(待编辑)
- 在 MFC SDI 程序中实现多语言程序界面
- 【图文详解】JAVA字面量和变量
- 那些拧不开瓶盖的女生全都是装的?理工男这样想......
- 利用dbms_metadata.get_ddl查看DDL语句
- Vue2 模板template的四种写法总结
- 设置 ASP.NET 存储当前应用程序的临时文件(生成的源、编译了的程序集等)的目录的物理路径。...
- Android 中文件类型与MIME的匹配表
- win8系统装c语言编程软件哪个好,win8系统安装c语言方法
- 4.Node.js 微信消息管理
- PHP实现微博的同步发送(转)
- Rational ClearCase批量merge合并
- Flash遮罩——水波、瀑布
- Linux网络操作系统及应用教程( 项目式)项目二
- 国产性能最稳定NFC读卡器芯片FSV9520完美替代CV520 SPI接口 可免费提供软硬件DEMO 快速研发产品
- Safari浏览器兼容性问题处理
热门文章
- micrometer_具有InlfuxDB的Spring Boot和Micrometer第1部分:基础项目
- zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?
- java6 已安装更高版本_Java 10及更高版本的思考
- java8默认垃圾收集器_Java 8中最快的垃圾收集器是什么?
- if else 工厂模式_没有IF-ELSE的工厂
- 艾伦图灵_Java英雄:丹·艾伦
- 关于高效企业测试的思考(1/6)
- 使用ArchUnit验证代码和体系结构约束
- hibernate jpa_JPAHibernate替代方案。 如果JPA或Hibernate对于我的项目而言不够好,该怎么办?...
- AWS Messaging Services:选择合适的服务