python的生成器

可以把生成器理解成是特殊的迭代器。

生成器一次只能产生一个值,这样消耗的内存数量将大大减小,而且允许调用函数可以很快的处理前几个返回值,因此生成器看起来像是一个函数,但是表现得却像是迭代器。

例子

下面我就举几个例子:

一:迭代器和生成器
list = [x for x in range(10)]
print(type(list))
print(list)
it = iter(list)
while True:try:print(next(it), end='\t')except StopIteration:print('迭代结束')breakgenerator = (x for x in range(10))
print(type(generator))
print(generator)
while True:try:print(next(generator), end='\t')except StopIteration:print('迭代结束')break

输出结果

<class 'list'>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
0   1   2   3   4   5   6   7   8   9   迭代结束
<class 'generator'>
<generator object <genexpr> at 0x000002840200B648>
0   1   2   3   4   5   6   7   8   9   迭代结束

​ 从代码和结果不难看出,生成器也是可以进行迭代的。并且生成器是一个类。

​ 生成器可以通过生成表达式生成。**generator = (x for x in range(10))返回的是一个生成器。通过生成器可以使用next()**来获取元素

二:yield字段

yield的作用是生成并返回一个值。

#普通的函数
def A():pass
print(type(A()))
print(A())print('====================================')#生成器
def MyGenerator():index = -1;ls = [0,1,2,3,4,5,6]while True:index += 1yield ls[index]MyG = MyGenerator()
print(type(MyGenerator()), type(MyG))
print(MyGenerator(), MyG)
for i in range(7):print(next(MyGenerator()), next(MyG))

运行结果:

<class 'NoneType'>
None
====================================
<class 'generator'> <class 'generator'>
<generator object MyGenerator at 0x0000018D3F84B648> <generator object MyGenerator at 0x0000018D3F84B9C8>
0 0
0 1
0 2
0 3
0 4
0 5
0 6

从结果可以知道,一个函数也能写成生成器,只要函数里有yield字段,而yield类似于函数的return,作用也是放回一个值。这里值得注意的是**type(MyGenerator()), type(MyG)并不是同一个对象,这里的MyGenerator()**类对象虽然是生成器,但是并不能进行迭代。也就是说要使用生成器必须实例化先。

三:类里面的生成器

生成器也可以写到类的里面

class MyGeneratorClass:def __init__(self,*args):self.list=[x for x in args ]def generate(self):for index in range(len(self.list)):yield self.list[index]G = MyGeneratorClass(1,2,3)
TG= G.generate()
print(type(G))
print(type(G.generate()), type(TG))
print(G.generate(), TG)
for i in range(3):print(next(G.generate()), next(TG))

运行结果:

<class '__main__.MyGeneratorClass'>
<class 'generator'> <class 'generator'>
<generator object MyGeneratorClass.generate at 0x00000237DBC5B648> <generator object MyGeneratorClass.generate at 0x00000237DBC5B9C8>
1 1
1 2
1 3

生成器也是可以写到类里面的,同样的要迭代就必须讲生成器实例化,这里的G虽然是MyGeneratorClass的实例化对象,但是其内部的生成器并没有实例化,所以G.generate()并不能进行迭代。

以上都是个人见解,有错请指出。

python的生成器相关推荐

  1. python使用生成器生成浮点数列表、使用生成器生成(正)负的浮点数列表

    python使用生成器生成浮点数列表.使用生成器生成(正)负的浮点数列表 目录 pyth

  2. [转载] Python的生成器

    参考链接: Python中的生成器Generator Python的生成器 什么是生成器 创建python迭代器的过程虽然强大,但是很多时候使用不方便.生成器是一个简单的方式来完成迭代.简单来说,Py ...

  3. python 迭代器 生成器_Python迭代器和生成器

    迭代器认知 迭代器 (iterator): 如果一个对象同时有__iter__()和__next__()魔术方法的话,这个对象就可以称为是迭代器. __iter__()的作用是可以让for循环遍历.而 ...

  4. [转载] Python中生成器和迭代器的区别

    参考链接: Python迭代器 Python中生成器和迭代器的区别(代码在Python3.5下测试): Num01–>迭代器 定义: 对于list.string.tuple.dict等这些容器对 ...

  5. python圆形生成器_python中的生成器

    什么是生成器? 生成器是一个包含了特殊关键字yield的函数.当被调用的时候,生成器函数返回一个生成器.可以使用send,throw,close方法让生成器和外界交互. 生成器也是迭代器,但是它不仅仅 ...

  6. Python中生成器是什么?

    何为生成器 生成器的wiki页:https://en.wikipedia.org/wiki/Generator_(computer_programming) 在计算机科学中,生成器是特定的迭代器,它完 ...

  7. python中生成器的惰性机制

    生成器有一个惰性机制,只有当你需要的时候才给你(一个个的取),而不是一下字全部给你.可能有些抽象,来一个例子 吧. 普及一个小知识**:一只母鸡并不是生一辈子鸡蛋,有一个时间段.** 例:小明和小红两 ...

  8. python迭代器生成器 学会再缩短一半开发效率 看看大牛是怎么写的

    一.迭代 什么叫做迭代? 比如在 Java 中,我们通过 List 集合的下标来遍历 List 集合中的元素,在 Python 中,给定一个 list 或 tuple,我们可以通过 for 循环来遍历 ...

  9. python怎么打印列表长度_关于python:生成器输出的长度

    本问题已经有最佳答案,请猛点这里访问. Python提供了一种很好的方法来获取渴望的可迭代len(x)的长度. 但是对于以生成器理解和函数表示的惰性可迭代对象,我找不到类似的东西. 当然,写这样的东西 ...

最新文章

  1. 格式化_icecream_python
  2. 修改PHP上传文件大小限制的方法
  3. 数据结构——栈——中缀表达式和后缀表达式
  4. SQL错误提示档案(3):SQL Server连接中的四个最常见错误
  5. Android自动化测试(UiAutomator)简要介绍
  6. android使用handler记录
  7. 基于JXTA开发的组内聊天和共享文件P2P软件
  8. 攒机笔记十六:制作pe盘
  9. 机器学习笔记(12)— K均值算法
  10. 通过hutool工具包实现将数据库中的全量数据导出,一张表一个sheet页,包含目录页,目录页和sheet页之间可以互相跳转
  11. Xcode No account for team . Add a new account in the Accounts preference pane or verify
  12. 使用print.js进行分页打印
  13. 计算机网络技术—知识点汇总
  14. 平面解析几何----余弦定理求焦点三角形的面积
  15. 360云盘丢失资料,官方承诺的永不删除丢失和绝对保密纯属忽悠
  16. PostgreSQL 之 学籍管理示例
  17. response导出html到word
  18. 即将到来的风暴 ― SDN/NFV探讨
  19. 汉字unicode码表范围和常用汉字unicode码
  20. 神奇怪兽在哪里 DFS

热门文章

  1. tomcat实现session集群及tomcat+memcached共享session存储(四)
  2. 面试奇葩——交换两变量值的一些邪门歪道
  3. 基于条件随机场的命名实体识别
  4. Request.Url.Port 获取不到正确的端口号
  5. Android网络框架OK3,Android网络框架---OkHttp3
  6. oracle 11gr2 bbed 安装,oracle11gR2 安装bbed工具
  7. mysql 迁移表时忽略索引_Mysql迁移新环境索引损坏
  8. RuntimeError at /admin 解决办法(亲测)
  9. Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '=
  10. Docker启动tomcat,访问首页出现404错误