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之生成器的初识的更多相关文章

  1. python迭代器,生成器,推导式

    可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: ...

  2. python 列表生成器

    python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 ...

  3. python 迭代器 生成器

    迭代器 生成器 一 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  4. python中和生成器协程相关的yield from之最详最强解释,一看就懂(四)

    如果认真读过上文的朋友,应该已经明白了yield from实现的底层generator到caller的上传数据通道是什么了.本文重点讲yield from所实现的caller到coroutine的向下 ...

  5. python中和生成器协程相关yield from之最详最强解释,一看就懂(二)

    一. 从列表中yield  语法形式:yield from <可迭代的对象实例> python中的列表是可迭代的, 如果想构造一个生成器逐一产生list中元素,按之前的yield语法,是在 ...

  6. python中和生成器协程相关的yield之最详最强解释,一看就懂(一)

    yield是python中一个非常重要的关键词,所有迭代器都是yield实现的,学习python,如果不把这个yield的意思和用法彻底搞清楚,学习python的生成器,协程和异步io的时候,就会彻底 ...

  7. Python中生成器和迭代器的区别(代码在Python3.5下测试):

    https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...

  8. Python的生成器进阶玩法

    Python的生成器进阶玩法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.yield的表达式形式 #!/usr/bin/env python #_*_coding:utf-8 ...

  9. python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解

    一.生成器 1.什么是生成器? 在python中,一边循环一边计算的机制,称为生成器:generator. 2.生成器有什么优点? 1.节约内存.python在使用生成器时对延迟操作提供了支持.所谓延 ...

随机推荐

  1. 洛谷P1044 栈(Catalan数)

    P1044 栈 题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). 栈的重要 ...

  2. 2014-8-5 NOIP(雾)模拟赛

    皇帝的烦恼(二分答案) Description 经过多年的杀戮,秦皇终于统一了中国.为了抵御外来的侵略,他准备在国土边境安置n名将军.不幸的是这n名将军羽翼渐丰,开始展露他们的狼子野心了.他们拒绝述职 ...

  3. python序列化模块 json&&pickle&&shelve

    #序列化模块 #what #什么叫序列化--将原本的字典.列表等内容转换成一个字符串的过程叫做序列化. #why #序列化的目的 ##1.以某种存储形式使自定义对象持久化 ##2.将对象从一个地方传递 ...

  4. yii2.0下,JqPaginator与Pjax实现无刷新翻页

    控制器部分 <?php namespace backend\controllers; use common\models\Common; use Yii; use yii\base\Contro ...

  5. Python 工具包 werkzeug 初探

    首先,先向大家介绍一下什么是 werkzeug,Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库.这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架, ...

  6. 去掉word文档两边的空白

    1.设置-页面布局-页边距,把左边距和右边距的数据设置到最小就好,一般为0.43CM 2.把WORD页面顶部标尺,左右拉到最底,如图: 3.在打印预览里,设置页边距,操作方法同 上述 1,如图:

  7. 044 Wildcard Matching 通配符匹配

    实现一个支持 '?' 和 '*' 的通配符匹配.'?' 匹配任何单个字符.'*' 匹配任何数量的字符 (包括0个).匹配应覆盖 整个 输入字符串(而不是部分).这个函数原型为:bool isMatch ...

  8. shell下批量除去文件名中的空格

    rename 's/ /_/g' * 上述命令可以将当前文件夹内所有文件的名字中得所有空格替换为_.其中g代表所有,如果不加g,如果文件名字中有多个空格,仅替换第一个.

  9. 算法导论课后习题解答 第一部分 练习1.1-1->1.1-5

    很高兴能和大家一起共同学习算法导论这本书.笔者将在业余时间把算法导论后面的题解以博文的形式展现出来希望能得到大家的支持谢谢.如果有可能我会做一些教学视频免费的供大家观看. 练习题选自算法导论中文第三版 ...

  10. c# 类名不同,字段相同,如何快速给类赋值

    1,相关的两个类如下:现在我们知道短信的值,如何给微信来赋值呢,需要用到我们的反射,当然字段一一赋值也可以,但是如果字段有100个,这个方法就不行啦 /// <summary> /// 短 ...