python tips:生成器的小问题
在Python中,生成器和函数很像,都是在运行的过程中才会去确定各种变量的值,所以在很多情况下,会导致各种各样的问题。
def generator_test1():
# 0...9 generator
x = (i for i in range(10))
# 5..9 generator
x_filter = filter(lambda y: y >= 5, x)
# first use the x
L = list(x)
print("L, x", L)
# then use x_filter
l = list(x_filter)
print("l, x_filter", l) if __name__ == "__main__":
generator_test1()
输出结果为:
L, x [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l, x_filter []
上述代码中,x_filter是基于生成器x构建的生成器,但是由于x在x_filter使用之前先被用掉了,所以在使用x_filter的时候,才去获取x的值,而此时x已经用完了,最终导致x_filter转化成的列表是空的。
def generator_test2():
x = (i for i in range(10))
for i in range(10):
x = (j + i for j in x)
L = list(x)
print("L, x", L) if __name__ == "__main__":
generator_test2()
输出结果:
L, x [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
上述代码中,每次循环都基于原先的生成器构建一个新的生成器,由于并未使用,所以生成器x中的i并没有被赋值。在后面转化成列表的时候才去获取i的值,而此时由于i为9,所以所有的生成器x的i都为9,原始的x是0到9的生成器,接下来的10个生成器每个都在原始值上加9,导致每个值都增大了90。下面是此例的一个变体:
def generator_test3():
x = (i for i in range(10))
for i in range(10):
x = (j + i for j in x)
i = 20
L = list(x)
print("L, x", L) if __name__ == "__main__":
generator_test3()
输出结果:
L, x [200, 201, 202, 203, 204, 205, 206, 207, 208, 209]
上述代码表明,可以临时改变i从而让生成器发生改变。
python tips:生成器的小问题的更多相关文章
- 【转】Python 30个实用小Tips
		1. 原地交换两个数字 Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例: x, y = 10, 20 print(x, y) x, y = y, x print ... 
- 一些Python的惯用法和小技巧:Pythonic
		Pythonic其实是个模糊的含义,没有确定的解释.网上也没有过多关于Pythonic的说明,我个人的理解是更加Python,更符合Python的行为习惯.本文主要是说明一些Python的惯用法和小技 ... 
- Python Tips阅读摘要
		发现了一本关于Python精通知识点的好书<Python Tips>,关于Python的进阶的技巧.摘录一些比较有价值的内容作为分享. *args and **kwargs 在函数定义的时 ... 
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
		https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ... 
- python迭代器,生成器,推导式
		可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: ... 
- Python中生成器和yield语句的用法详解
		Python中生成器和yield语句的用法详解 在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" ... 
- python实用30个小技巧
		python实用30个小技巧 展开1.原地交换两个数字Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例: In [1]: x,y = 10 ,20 In [2]: ... 
- Python练习,网络小爬虫(初级)
		最近还在看Python版的rcnn代码,附带练习Python编程写一个小的网络爬虫程序. 抓取网页的过程其实和读者平时使用IE浏览器浏览网页的道理是一样的.比如说你在浏览器的地址栏中输入 www ... 
- python 列表生成器
		python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 ... 
随机推荐
- 2019-05-14 Python SSL
			解决SSL报错问题 -- 导库 import ssl import urllib.request context = ssl._create_unverified_context() --用urlli ... 
- PAT 1088. Rational Arithmetic
			For two rational numbers, your task is to implement the basic arithmetics, that is, to calculate the ... 
- 2.1  SVN的安装
			一.SVN客户端安装 运行TortoiseSVN-1.6.6.17493-win32-svn-1.6.6.msi程序, 开始安装 点击Next, 下一步 选择 I accept 接受, 点击Next ... 
- ecshop3 调用指定分类下推荐/热卖/新品商品,可指定调用数量
			第一步:--------------------------------------------------------------------------------------/** * 取指定分 ... 
- centos 7.2 安装php56-xml
			linux下, 使用thinkphp的模板标签,如 eq, gt, volist defined, present , empty等 标签时, 报错: used undefined function ... 
- OpenCV实现USM锐化与测试
			OpenCV实现USM锐化 [转]http://www.programdevelop.com/4964391/ USM (Unsharp masking) is a common operation ... 
- Android 源代码解析 之 setContentView
			转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41894125,本文出自:[张鸿洋的博客] 大家在平时的开发中.对于setCont ... 
- @RequiresPermissions 注解说明
			@RequiresAuthentication验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时.@RequiresUser验证用户是否被记忆,user有 ... 
- Spring+EhCache缓存实例(具体解说+源代码下载)
			一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有高速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ... 
- Android+Jquery Mobile学习系列-目录
			最近在研究学习基于Android的移动应用开发,准备给家里人做一个应用程序用用.向公司手机移动团队咨询了下,觉得使用Android的WebView上手最快,因为WebView等于是一个内置浏览器,可以 ... 
