为什么需要使用生成器?

'''
generator生成器
通过列表推导式,我们可以创建一个新的列表,但是,受内存限制,列表的容量是有限的。
而且,创建一个包含100万个元素的列表,不仅占用很大存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都
白白浪费。所以,如果列表元素可以按照某种算法推算出来,那么我们是可以在循环的过程中不断推算出后续的元素。
这样就不必创建完整的list,从而节省大量的空间。在python中,这种一遍循环一遍计算的机制,称为生成器:generator。得到生成器的方式:
1、通过列表推导式得到一个生成器
'''

测试01

# [x for x in range(1000000000)]
#[0,3,6,9,12,15,18,21,......,27]
newlist = [x*3 for x in range(10)]
#得到生成器
g = (x*3 for x in range(30))
print(type(g)) #generator
#方式一:通过调用__next__()方式得到元素
#每调用一次产生一个一个元素
print(g.__next__())
print(g.__next__())
#方式二:next() 系统内置函数builtins
#每调用一次产生一个一个元素
print(next(g))
print(next(g))
print(next(g))

测试02

g = (x*3 for x in range(30))while True:try:e = next(g)print(e)except:print('没有更多元素了')break#定义生成器的方式二:借助函数生成#斐波那切数列#yield就是一个生成器
def func():n=0while True:n += 1yield ng = func()# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))def fib(length):a,b =0,1n=0while n<length:yield b  #return b + 暂停a,b = b,a+bn += 1return '没有更多元素了' #return 就是得到StopIteration的提示信息g = fib(8)
print(next(g))
print(next(g))

测试03

'''
生成器方法:
__next__():获取下一个元素
send(value):向每次生成器调用中传值 注意:第一次调用send(None)'''
def gen():i = 0while i < 5:tem = yield i   #return + 暂停  tem = 1或者2print('tem',tem)i += 1return '没有更多数据'g = gen()#g.__next__()
#为什么第一次一定要传一个NONE值,第一次还没进入yeild,不能传值
print(g.send(None))
g1 = g.send("1")
print(g1)
g2 = g.send("2")
print(g2)

04生成器应用

'''
#进程 > 线程 > 协程(一个进程包含多个线程,一个线程包含多个协程)
#迅雷可以设置线程个数
#生成器应用'''def task1(n):for i in range(n):print('正在搬第{}块砖!'.format(i))yield  Nonedef task2(n):for i in range(n):print('正在听第{}首歌!'.format(i))yield Noneg1 = task1(10)
g2 = task2(5)
#交替完成
while True:try:g1.__next__()g2.__next__()except:pass'''
定义生成器方式:
1、通过列表推导方式
g = (x+1 for x in range(6))
2、函数 yeild
def func():...yeildg =func()产生元素:
1、next(generator)  ---> 每次调用都会产生一个新的元素,如果元素产生完毕,再次调用的话就会产生异常
2、生成器自己的方法:g.__next__()g.send(value)应用:协程
'''

生成器总结:

'''
定义生成器方式:
1、通过列表推导方式
g = (x+1 for x in range(6))
2、函数 yeild
def func():...yeildg =func()产生元素:
1、next(generator)  ---> 每次调用都会产生一个新的元素,如果元素产生完毕,再次调用的话就会产生异常
2、生成器自己的方法:g.__next__()g.send(value)应用:协程
'''

迭代器测试:

#可迭代的对象:1、生成器 2、元组 列表 集合 字典 字符串
#如何判断一个对象是否是可迭代的?
from collections import Iterablelist1 = [1,4,7,8,8]
f = isinstance(list1,Iterable) #判断列表是否可迭代
print(f)# f1 = isinstance('abc',Iterable)
# f2 = isinstance(100,Iterable)g = (x+1 for x in range(10))
f3 = isinstance(g,Iterable)
'''
迭代是访问集合元素的一种形式。迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器只能往前不会退后。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
只要调用next(),得到下一个元素,就是迭代器
生成器是可以迭代的,也是迭代器
list是可以迭代的,但是不是迭代器,但是可以把他变成一个迭代器iter()
元组、列表、集合、字典、字符串通过iter()转换成迭代器
'''
lit1 = [1,2,3,4]
lit = iter(lit1)print(next(lit))
print(next(lit))

注意:

生成器是可以迭代的,也是迭代器
list是可以迭代的,但是不是迭代器,但是可以把他变成一个迭代器iter()
元组、列表、集合、字典、字符串通过iter()转换成迭代器

python生成器generator和迭代器Iterator测试相关推荐

  1. Python中生成器generator和迭代器Iterator的使用方法

    一.生成器 1. 生成器的定义 把所需要值得计算方法储存起来,不会先直接生成数值,而是等到什么时候使用什么时候生成,每次生成一个,减少计算机占用内存空间 2. 生成器的创建方式 第一种只要把一个列表生 ...

  2. python生成器generator:深度学习读取batch图片

    在深度学习中训练模型的过程中读取图片数据,如果将图片数据全部读入内存是不现实的,所以有必要使用生成器来读取数据. 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而 ...

  3. python 生成器 generator

    生成器就是不把一个列表一下全部导入到内存中,而是一个一个生成 创建生成器 推导式创建生成器 []生成的是列表 ()生成的是生成器 In [1]: [x for x in range(5)] Out[1 ...

  4. Python生成器generator之next和send运行流程

    对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数. 然后第二个next调用,进入生成器函数后,从y ...

  5. python生成器yield原理_Python generator生成器和yield表达式详解

    前言 Python生成器(generator)并不是一个晦涩难懂的概念.相比于MetaClass和Closure等概念,其较为容易理解和掌握.但相对于程序结构:顺序.循环和分支而言其又不是特别的直观. ...

  6. python数据采集仪_数据采集卡支持python么深入理解Python生成器(Generator)

    我们可以通过列表生成式简单直接地创建一个列表,但是受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,而且如果我们仅仅需要访问前面几个元素,那后面绝大多 ...

  7. Python yield generator

    http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/, Python yield 使用浅析 这篇说的很清楚 主要看到F ...

  8. Python生成器next方法和send方法区别详解

    yield的语法规则是: 在yield这里暂停函数执行,并返回yield后面表达式的值(默认为None),直到被next()再次调用时,从上次暂停的yield代码处继续往下执行.当没有可继续next( ...

  9. Python组合数据类型:容器类型总览,(不)可变数据类型immutable、(不)可迭代对象iterable、迭代器iterator、生成器generator、语法糖

    一.组合数据类型container objects 组合数据类型container objects:能够表示多个数据的类型 集合类型:集合类型是一个元素集合,元素无序不重不变 序列类型:序列类型是一个 ...

最新文章

  1. mysql切换到使用openssl_OpenSSL可以用来调试到MySQL服务器的SSL连接吗?
  2. redis一般缓存什么样数据_门户数据展示_Redis缓存数据
  3. win内置ubuntu安装_win10安装内置ubuntu教程
  4. 个人管理:简单,我微博中的一句话,总有你喜欢的
  5. Wallace树专题研究
  6. Laravel5.2之Filesystem-从Dropbox中下载文件到AWS S3
  7. 论文阅读 R-FCN: Object Detection via Region-based Fully Convolutional Networks
  8. linux下使用sed批量替换关键词(带斜杠处理+kaggle路径批量替换)
  9. java-多线程-一道阿里面试题分析
  10. Ajax--art-template + 调用天气接口
  11. 【转载】一天之内上手.Net+WAP项目
  12. 90-40-010-源码-CUBE-引擎为MR写入Habse的构建
  13. python请输出如下图形的程序_编写一个python程序,输出如下图形效果。
  14. asp.net模板控件示例
  15. 搜狗输入法电脑版_年终福利 | 安卓可用的输入法皮肤 搜狗篇 / 近期日程 | iOS智能深色版。...
  16. 共建信创生态,助力组织国产化进程
  17. Rust vs. Go:为什么他们在一起更好
  18. 僵尸网络瞄准Linux服务器
  19. 如何给PDF文件添加页码
  20. 那一份无怨亦无悔的真情实意

热门文章

  1. Spring Boot配置文件application.properties
  2. python+Android+uiautomator的环境
  3. Martin Fowler 微服务的原文翻译(转载)
  4. mysql带唯一主建任然发生gap,mysql – 使用主键分块从大表中删除时仍然看到锁等待超时...
  5. linux防火墙安装httpd配置,CentOS7下 Apache的安装配置方法
  6. 屏幕距离和坐便转换工具_【软件推荐】你和大神的距离,只差这几个效率工具!...
  7. linux 定时器_通过linux源码分析nodejs的keep-alive
  8. c语言1076素数,大学C语言考试题库(答案)-20210412093908.docx-原创力文档
  9. openwrt打印机支持列表_共享打印机的三种安装连接方法
  10. Jenkins 流水线 获取git 分支列表_基于Jenkins的DevOps流水线实践教程