python之生成器的初识
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在使用生成器时对延迟操作提供了支持.所谓延 ...
随机推荐
- 无监督学习:Deep Generative Mode(深度生成模型)
一 前言 1.1 Creation 据说在费曼死后,人们在他生前的黑板上拍到如图画片,在左上角有道:What i cannot create ,I do not understand. Generat ...
- ue4 打个log难如狗
注意: 把log相关两个宏写到类中,并编译后,在输出日志的位置的Categories关键字过滤的位置看不到自己的标签是因为需要先运行一次,输出一些这个标签的log后,这个自定义的标签才会显示在这 原文 ...
- 3dmax切割平行线
1 选择物体(可编辑多边形),选择边 ,然后点击切片平面 2 然后会出现黄色线框 3 移动旋转黄色线框到合适位置,然后点切片 4 结果
- 通过node.js读取html页面及其页面中引入的css样式
Node 是什么? Node 是一个基于Chrome V8 引擎的JavaScript 运行环境. Node 不是一种独立的语言.Node不是 JavaScript 框架, Node是一个除了浏览器之 ...
- BZOJ 1069: [SCOI2007]最大土地面积(旋转卡壳)
题目链接~ 1069: [SCOI2007]最大土地面积 思路很简单,极角排序求完凸包后,在凸包上枚举对角线,然后两边分别来两个点旋转卡壳一下,搞定! 不过计算几何的题目就是这样,程序中间的处理还是比 ...
- MyBatis入门Bug集锦X1
- python进阶04 装饰器、描述器、常用内置装饰器
python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...
- 2017 Multi-University Training Contest - Team 7 Just do it
http://acm.hdu.edu.cn/showproblem.php?pid=6129 题意:一次操作就是i从1~n有 A[i]=A[i]^A[i-1]^A[i-2]...^A[1] 那么这样操 ...
- 063 Unique Paths II 不同路径 II
这是“不同路径” 的进阶问题:现在考虑网格中有障碍物.那样将会有多少条不同的路径从左上角到右下角?网格中的障碍物和空位置分别用 1 和 0 来表示.例如,如下所示在 3x3 的网格中有一个障碍物.[ ...
- (转)io优化
原文:http://blog.csdn.net/gzh0222/article/details/9227393 1.系统学习 IO性能对于一个系统的影响是至关重要的.一个系统经过多项优化以后,瓶颈往往 ...