python的生成器
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的生成器相关推荐
- python使用生成器生成浮点数列表、使用生成器生成(正)负的浮点数列表
python使用生成器生成浮点数列表.使用生成器生成(正)负的浮点数列表 目录 pyth
- [转载] Python的生成器
参考链接: Python中的生成器Generator Python的生成器 什么是生成器 创建python迭代器的过程虽然强大,但是很多时候使用不方便.生成器是一个简单的方式来完成迭代.简单来说,Py ...
- python 迭代器 生成器_Python迭代器和生成器
迭代器认知 迭代器 (iterator): 如果一个对象同时有__iter__()和__next__()魔术方法的话,这个对象就可以称为是迭代器. __iter__()的作用是可以让for循环遍历.而 ...
- [转载] Python中生成器和迭代器的区别
参考链接: Python迭代器 Python中生成器和迭代器的区别(代码在Python3.5下测试): Num01–>迭代器 定义: 对于list.string.tuple.dict等这些容器对 ...
- python圆形生成器_python中的生成器
什么是生成器? 生成器是一个包含了特殊关键字yield的函数.当被调用的时候,生成器函数返回一个生成器.可以使用send,throw,close方法让生成器和外界交互. 生成器也是迭代器,但是它不仅仅 ...
- Python中生成器是什么?
何为生成器 生成器的wiki页:https://en.wikipedia.org/wiki/Generator_(computer_programming) 在计算机科学中,生成器是特定的迭代器,它完 ...
- python中生成器的惰性机制
生成器有一个惰性机制,只有当你需要的时候才给你(一个个的取),而不是一下字全部给你.可能有些抽象,来一个例子 吧. 普及一个小知识**:一只母鸡并不是生一辈子鸡蛋,有一个时间段.** 例:小明和小红两 ...
- python迭代器生成器 学会再缩短一半开发效率 看看大牛是怎么写的
一.迭代 什么叫做迭代? 比如在 Java 中,我们通过 List 集合的下标来遍历 List 集合中的元素,在 Python 中,给定一个 list 或 tuple,我们可以通过 for 循环来遍历 ...
- python怎么打印列表长度_关于python:生成器输出的长度
本问题已经有最佳答案,请猛点这里访问. Python提供了一种很好的方法来获取渴望的可迭代len(x)的长度. 但是对于以生成器理解和函数表示的惰性可迭代对象,我找不到类似的东西. 当然,写这样的东西 ...
最新文章
- 格式化_icecream_python
- 修改PHP上传文件大小限制的方法
- 数据结构——栈——中缀表达式和后缀表达式
- SQL错误提示档案(3):SQL Server连接中的四个最常见错误
- Android自动化测试(UiAutomator)简要介绍
- android使用handler记录
- 基于JXTA开发的组内聊天和共享文件P2P软件
- 攒机笔记十六:制作pe盘
- 机器学习笔记(12)— K均值算法
- 通过hutool工具包实现将数据库中的全量数据导出,一张表一个sheet页,包含目录页,目录页和sheet页之间可以互相跳转
- Xcode No account for team . Add a new account in the Accounts preference pane or verify
- 使用print.js进行分页打印
- 计算机网络技术—知识点汇总
- 平面解析几何----余弦定理求焦点三角形的面积
- 360云盘丢失资料,官方承诺的永不删除丢失和绝对保密纯属忽悠
- PostgreSQL 之 学籍管理示例
- response导出html到word
- 即将到来的风暴 ― SDN/NFV探讨
- 汉字unicode码表范围和常用汉字unicode码
- 神奇怪兽在哪里 DFS
热门文章
- tomcat实现session集群及tomcat+memcached共享session存储(四)
- 面试奇葩——交换两变量值的一些邪门歪道
- 基于条件随机场的命名实体识别
- Request.Url.Port 获取不到正确的端口号
- Android网络框架OK3,Android网络框架---OkHttp3
- oracle 11gr2 bbed 安装,oracle11gR2 安装bbed工具
- mysql 迁移表时忽略索引_Mysql迁移新环境索引损坏
- RuntimeError at /admin 解决办法(亲测)
- Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '=
- Docker启动tomcat,访问首页出现404错误