1. 生成器的定义
生成器的本质就是迭代器.python社区生成器和迭代器是一种
2. 生成器和迭代器区别
迭代器:
都是Python给你提供的已经写好的工具或者通过数据转化得来的
生成器:
需要我们自己构建的工具
3. 生成器的产生方式
- 生成器函数
- 生成器表达式
- python给你提供的一些内置函数,返回一个生成器
4. 生成器函数 (***)
迭代器的return换成yield就是生成器,但是这个时候正常执行的结果是一个生成器的地址 (***)
# 生成器格式:***
def func():
print(111)
yield 22
yield 33
ret = func()
print(next(ret)) # 执行一次next返回一个值
print(next(ret))
# 输出结果
111
22
33
# 如果执行的时候再加一个print(next(ret))是会报错的,原因是生成器一个一个地往下执行,而且会记录位置,不走回头路,再加一个找不到值,就会报错.也就是一个yield对应一个next,next超过yield数量,就会报错.(***)
以下为帮助理解
# 讲解方法
def func():
print(111)
yield 22
gent = func()
ret = gent.__next__() # 这里要加一个方法.__next__()
print(ret)
def func():
print(111)
yield 22
ret = func()
print(ret) # 正常迭代器如果是这样的形式的话,到这一步是要进行执行的,打印结果先打印111,return 返回22 ,而在生成器中打印的是生成器的地址
如果要执行生成器需加一个方法:
print(next(ret))
# 执行结果
111
22
# 有几个yield就需要有几个print(next(ret)),yield少print多的话就会报错,就是print找不到了
5. 生成器的例题
# 吃包子
def bun():
for i in range(1,2001):
yield f'{i}号包子'
ret = bun()
for i in range(200): # 这个相当于执行next(ret)的次数
print(next(ret))
# 输出结果
1号包子
2号包子
3号包子
4号包子4
5号包子
...
200号包子
# 迭代器制作包子是一次性完成,会占用大量的空间,而生成器制作包子,是你需要一个包子我制作一个,非常节省内存
# 优点: 补全内容
6. yield(***)
用途
yield : 对应next给next返回值
只要函数中出现了yield那么他就不是函数,它是生成器函数
7. yield与return的区别(***)
return一般在函数中只设置一个,他的作用是终止函数,并且给函数的执行者返回值。
yield在生成器函数中可设置多个,他并不会终止函数,next会获取对应yield生成的元素。
8. yield from(***)
用途
以直接把可迭代对象中的每一个数据作为生成器的结果进行返回,代替for循环的作用
例题: 这个例题一看就会
def func():
lst = ['卫龙','老冰棍','北冰洋','牛羊配']
yield lst
g = func()
print(g)
print(next(g))
# 输出结果
<generator object func at 0x1095c95e8>
['卫龙', '老冰棍', '北冰洋', '牛羊配']
yield写两个列表同时运行也不会产生交替的效果
def func():
lst1 = ['卫龙','老冰棍','北冰洋','牛羊配']
lst2 = ['馒头','花卷','豆包','大饼']
yield from lst1
yield from lst2
g = func()
for i in g:
print(i)
# 输出结果
8. yield和yield from对比(***)
Yield: 对应next给next返回一个值
Yield from: 省代码 提升效率 代替for循环
python之生成器的初识的更多相关文章
-
python迭代器,生成器,推导式
可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: ...
-
python 列表生成器
python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 ...
-
python 迭代器 生成器
迭代器 生成器 一 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...
-
python中和生成器协程相关的yield from之最详最强解释,一看就懂(四)
如果认真读过上文的朋友,应该已经明白了yield from实现的底层generator到caller的上传数据通道是什么了.本文重点讲yield from所实现的caller到coroutine的向下 ...
-
python中和生成器协程相关yield from之最详最强解释,一看就懂(二)
一. 从列表中yield 语法形式:yield from <可迭代的对象实例> python中的列表是可迭代的, 如果想构造一个生成器逐一产生list中元素,按之前的yield语法,是在 ...
-
python中和生成器协程相关的yield之最详最强解释,一看就懂(一)
yield是python中一个非常重要的关键词,所有迭代器都是yield实现的,学习python,如果不把这个yield的意思和用法彻底搞清楚,学习python的生成器,协程和异步io的时候,就会彻底 ...
-
Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
-
Python的生成器进阶玩法
Python的生成器进阶玩法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.yield的表达式形式 #!/usr/bin/env python #_*_coding:utf-8 ...
-
python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解
一.生成器 1.什么是生成器? 在python中,一边循环一边计算的机制,称为生成器:generator. 2.生成器有什么优点? 1.节约内存.python在使用生成器时对延迟操作提供了支持.所谓延 ...
随机推荐
-
Exception-异常
异常(Exception)是程序执行过程中所产生的问题 产生原因:用户输入无效数字.找不到需要打开的文件.在通讯中网络连接中断.JVM发生了内存溢出 异常的三个种类:检查异常.运行时异常.错误(类似异 ...
-
用命令测试安装好的OpenStack环境
OpenStack三个节点icehouse-gre模式部署一文部署了一套OpenStack环境,接下来使用命令测试一遍. 首先要明确几个概念: 外网:可分配floating ip绑定到虚拟机,外部就可 ...
-
javaSE之线程联合
首先定义 : 一个线程A在占有CPU资源期间 ,可以让其他线程调用join()和本线程联合. 嗯哈,像书本这个列子: 如: B.join(); 我们称A在运行期间联合了B, 如果线程A在占有CPU资源 ...
-
一款jQuery特效编写的大度宽屏焦点图切换特效
一款jQuery编写的大度宽屏焦点图切换特效 焦点图显示区域有固定的宽度,当前显示宽度之外是一个半透明层显示的其它的焦点图片, 最好的是,此特效兼容IE6以及其它浏览器. 适用浏览器:IE6.IE7. ...
-
Html5 代码
随着HTML5的流行,许多网站开始介绍HTML5元素和属性的用法,以及各种教程,并且越来越多老的浏览器开始兼容HTML5. 本文作者编译了10段非常实用的HTML5代码片段,开发者可以直接拿过去使 ...
-
[再寄小读者之数学篇](2014-06-23 积分不等式 [中国科学技术大学2013年高等数学B 考研试题])
设 $f(x)$ 在 $[a,b]$ 上一阶连续可导, $f(a)=0$. 证明: $$\bex \int_a^b f^2(x)\rd x\leq \cfrac{(b-a)^2}{2}\int_a^b ...
- Prior Posterior和Likelihood的理解与几种表达方式
-
PHP黑魔法(该篇文章转自:http://www.91ri.org/12634.html 目的是作为自己的笔记方便查找)
那些年我们学过的PHP黑魔法 作者:Matrix_ling 序 这里必须得说一下==和===这俩货的重要性.==是比较运算,它不会去检查条件式的表达式的类型===是恒等,它会检查查表达式的值与类型是否 ...
-
RTS寻路相关资料收集
http://www.cocoachina.com/game/20150824/13174.html RVO算法 RVO避开agent
-
django之class Meta
通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(models.Model): bar = models.CharFi ...