python_生成器
一、列表生成式:
列表生成式即python内置的非常简单且强大的生成list的生成式。
range(1,10)方法可以生成一个简单的list,
1 l = [] 2 3 for i in range(1,10): 4 l.append(i) 5 6 print(l) 7 >>>[1, 2, 3, 4, 5, 6, 7, 8, 9] 8 9 10 l = [] 11 12 for i in range(1,10): 13 l.append(i*i) 14 15 print(l) 16 >>>[1, 4, 9, 16, 25, 36, 49, 64, 81]
这样生成一个list有些许累赘,列表生成式就是为了简化这一过程:
l = [i for i in range(1,10)] print(l)>>>[1, 2, 3, 4, 5, 6, 7, 8, 9]L = [i * i for i in range(1,10)] print(L)>>>[1, 4, 9, 16, 25, 36, 49, 64, 81]
for后边还可以加if判断,过滤出列表中所有的奇数:
1 L = [i * i for i in range(1,10) if i % 2 != 0] 2 print(L) 3 4 >>>[1, 9, 25, 49, 81]
还可以两个for循环一起使用:
l = [ x * y for x in range(1,5) for y in range(6,10)] print(l)>>>[6, 7, 8, 9, 12, 14, 16, 18, 18, 21, 24, 27, 24, 28, 32, 36]
二、生成器(generator):
生成器是一种只有在调用时才会开始计算生成相应的数据,没调用时内存中只存储相关数据的计算方式和当前数据的相关位置。
生成器可以大大节省我的内存空间。
创建生成器的方法有很多种,方法一:只需要把列表生成式的“[ ]”改成“( )”即可
1 l = [i for i in range(10)] 2 print(l) 3 4 >>>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 5 6 g = (i for i in range(10)) 7 print(g) 8 9 >>><generator object <genexpr> at 0x000001DBE98C9888>
生成器输出的是可迭代的内存对象,可以理解为计算数据的方法。那么如何输出生成器中的数据呢 ?
使用 next() 方法可以一个个的输出数据:
g = (i for i in range(10)) print(g)print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g))>>><generator object <genexpr> at 0x000001C1102D9888>01234
next()方法会把生成器中的数据一个个输出,若是next()的次数大于range()值的次数,则报StopIteration的错误。
显然,用next()方法有点太low了,既然生成器是可迭代对象,那正确的取值方法是for循环:
1 g = (i for i in range(5)) 2 3 for i in g: 4 print(i) 5 6 >>>0 7 1 8 2 9 3 10 4
像这样的如此潇洒与直接。
方法二:yield
1 def yrd(): 2 print("this is 1") 3 yield 1 4 print("this is 2") 5 yield 5 6 print("this is 3") 7 yield 9 8 9 print(yrd()) 10 >>><generator object yrd at 0x00000204F9609888> 11 12 y=yrd() 13 next(y) 14 >>>this is 1 15 16 next(y) 17 >>>this is 2 18 19 next(y) 20 >>>this is 3
如果一个函数里有yield关键字,那个这个函数就不在是普通的函数了,而是摇身一变成为了生成器函数。
生成器函数与普通的函数执行顺序是不一样的,普通的函数遇到return,或是执行到结尾就返回,而迭代器函数是每次调用next()方法时遇到yield就返回,再次执行next()方法时从上次yield的位置继续执行。
同样,迭代器函数也可以使用for循环来取数据, for函数中其实也是封装的next()方法。当循环穷尽时for函数会自动获取报错退出。
1 def yrd(): 2 print("this is 1") 3 yield 1 4 print("this is 2") 5 yield 5 6 print("this is 3") 7 yield 9 8 9 for y in yrd(): 10 print(y) 11 12 >>> this is 1 13 1 14 this is 2 15 5 16 this is 3 17 9
转载于:https://www.cnblogs.com/Adairye/p/9028880.html
python_生成器相关推荐
- Python_生成器Generator
简介 生成器是用来创建Python序列的一个对象,可以用它迭代庞大的序列而不需在内存中创建和存储整个序列,因为它仅仅保存了这个序列的推算算法.Python3中range()是标准的一个生成器 主要作用 ...
- python_生成器简介
# Author : XueFeng # 直接全部准备好,效率低 # 列表生成器 a = [i*2 for i in range(10000)] a[10]# 生成器 # 只有在调用时才会生成相应的数 ...
- 材料模拟python_用Python模拟无限生成器
我正在尝试使用模拟库模拟无限生成器函数. (如果您使用Python 3.3,则为unittest.mock) 这是无限生成器的最小工作示例.如果我可以成功地模拟它,那么我希望能够模拟我正在使用的实际功 ...
- python_魔法方法(六):迭代器和生成器
迭代器 自始至终,都有一个概念一直在用,但是我们却没来都没有人在的深入剖析它.这个概念就是迭代. 迭代的意思有点类似循环,每一次的重复的过程被称为迭代的过程,而每一次迭代得到的结果会被用来作为下一次迭 ...
- Python_迭代器与生成器
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式.. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...
- Python_迭代器和生成器的复习_38
迭代器和生成器 迭代器: 双下方法:很少直接调用的方法,一般情况下,是通过其他方法触发的 可迭代的协议--可迭代协议 含有__iter__ 的方法 ('__iter__' in dir(数据)) 可迭 ...
- 9 9简单的数独游戏python_如何使用tkinter GUI python创建9*9数独生成器?
如何使用python和tkinter创建9*9数独生成器?,如何将其生成到gui?在 我试过这些:import random numbers = [1,2,3,4,5,6,7,8,9] def reg ...
- 9 9简单的数独游戏python_如何使用tkinter gui python创建一个9*9的数独生成器?
如何使用python和tkinter创建9*9数独生成器?,如何将其生成到gui? 我试过这些: import random numbers = [1,2,3,4,5,6,7,8,9] def reg ...
- 文案生成 python_用 Python 开发一个【视频营销号】生成器
原标题:用 Python 开发一个[视频营销号]生成器 之前小帅b在网上看到一个营销号文案生成器,把我给乐的: 其实这个用 Python 实现非常简单,根据用户输入的内容,简单替换一下关键字就可以了, ...
- c4d python_【C4D开发】C4D中的python生成器
python生成器是预制的python 插件的objectData的封装(就和脚本是插件commandData的封装一样).这样创建生成器对象就不用写全脚本了,注意这物体仅仅是生成器,想创建变形器,还 ...
最新文章
- Android学习笔记18-自定义Seekbar拖动条式样
- iOS开发基础-九宫格坐标(4)
- 肿瘤细胞信号转导: 肿瘤治疗的靶向信号通路 PDF
- boost::mp11::mp_any相关用法的测试程序
- g11 android 4.4,HTC G11 Incredible S 稳定流畅Android4.0.4华丽体验Sense4.1 省电耐用
- php ajax json post请求参数传递,javascript - ajax post 有个请求参数要用json 但请问js怎么转json的?...
- Linux中screen的用法
- Web笔记-移动前端开发笔记
- java web windows_WinSW让你的JavaWEB程序作为Windows服务启动!
- 手机学linux软件下载,Linux标准教科书下载
- 无法下载php怎办,php无法下载大文件怎么办
- 漫谈 MinIO 集群扩容方法
- Android studio for mac
- LeetCode算法题-House Robber(Java实现)
- Python2.x(3.x)安装及Ulipad的安装和使用
- chrome扩展设置代理
- windows主机加固(2)
- 物联网之MQTT3.1.1和MQTT5协议 (4) PUBLISH报文
- MySQL进阶:触发器
- 数仓工具—Hive实战之拉链表(3)