浅谈Python中的生成器和迭代器
作者:BlackMonkey 发布时间:2023-04-08 02:23:46
标签:Python,生成器,迭代器
迭代器
迭代器协议
对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代。(只能往前走,不能往后退!)
迭代器对象
遵循了(实现了)迭代器协议的对象。(对象内部实现了一个__next__方法,以实现迭代器协议)称为一个迭代器对象。他们的作用是逐个遍历容器中的对象。迭代器对象一定是可迭代对象
>>> from collections import Iterable, Iterator
>>> l = list([1,2,3]) # 定义列表
>>> l_iter = l.__iter__() # 调用列表的 __iter__ 方法
>>> isinstance(l, Iterable) # 列表可迭代对象
True
>>> isinstance(l, Iterator) # 列表不是迭代器
False
>>> isinstance(l_iter, Iterable) # 列表的__iter__ 方法返回 是可迭代对象
True
>>> isinstance(l_iter, Iterator) # 列表的__iter__ 方法返回 也是是迭代器对象
True
可迭代对象(iterable)
可迭代对象有很多种形式,只要满足可以每次取到容器对象中下一个对象的,都称为可迭代对象。
实现了 __iter__方法的对象称为可迭代对象。
range() 对象也是可迭代对象。
生成器对象也是可迭代对象。
>>> from collections import Iterable, Iterator
>>> isinstance(range(10), Iterator)
False
>>> isinstance(range(10), Iterable)
True
# 生成器对象一定是迭代器对象, 那么他也必然是可迭代对象
>>> isinstance((i for i in range(10)), Iterator)
True
>>> isinstance((i for i in range(10)), Iterable)
True
总结补充
列表、元组、集合、字符串、字典都是可迭代对象。
for 循环的本质:使用迭代器协议访问可迭代对象中的每一个对象。
生成器
生成器类似于一种数据类型,这种数据类型自动实现了迭代器协议,所以生成器也是迭代器。
生成器分类及在python中的表现形式:(Python有两种不同的方式提供生成器)
生成器函数
常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
>>> def generator(n):
... for i in range(n):
... yield i
...
>>> gener_obj = generator(10)
>>> gener_obj.__next__()
0
>>> gener_obj.__next__()
1
>>> gener_obj.__next__()
2
>>> type(gener_obj)
<class 'generator'>
生成器表达式
类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表,按需取出对象
注意生成器 用()包裹起来
>>> generator = (i for i in range(10))
>>> generator.__next__()
0
>>> generator.__next__()
1
>>> type(generator)
<class 'generator'>
来源:https://www.cnblogs.com/monkey-code/p/13158889.html
0
投稿
猜你喜欢
- jQuery.sheet 是一个用于创建 Web 电子表格的 jQuery插件,其功能及界面风格和微软的 Excel 非常相似,使得用户不至
- 本文实例为大家分享了Python实现学生信息管理系统的具体代码,供大家参考,具体内容如下要求描述:学生的信息包括:学号,姓名,年龄,性别,出
- 本文研究的主要是python处理csv数据动态显示曲线,分享了实现代码,具体如下。代码:# -*- coding: utf-8 -*- &q
- 一、基础介绍Go 是静态(编译型)语言,是区别于解释型语言的弱类型语言(静态:类型固定,强类型:不同类型不允许直接运算)例如 python
- 模式库 在模式库里,我将列出所有电子商务网站需要的模式.以下将罗列出经典常用的模式案例,我也试图让这些模式看起来更有趣味性与实用性。(Yah
- LyScript 插件默认提供了一个get_disasm_code()方法可以直接获取到指定行数的反汇编代码,但如果需要自定义获取或者是需要
- 原问题是这样的:如何用SQL语句(不是Oracle),求出下表每一行的5个字段中的最大值,最后生成一个新字段。例如:第一行最大值 -5.0
- iou33449999 文:一个链接 一个层 一个onMouseOver 一个onMouseOut然后这个层就会在onMouseOver这个
- 本文为大家分享了python2.7和NLTK安装教程,具体内容如下系统:Windows 7 Ultimate 64-bitsPython 2
- php魔术方法在php类保留方法中以 “__”两个下划线开头的函数称为魔术方法,我的理解为php类设
- 1. mmap内存映射文件建立一个文件的内存映射将使用操作系统虚拟内存来直接访问文件系统上的数据,而不是使用常规的I/O函数访问数据。内存映
- 目录实例演示1. axios上传普通文件:2. 大文件导入:结语这次我要讲述的是在React-Flask框架上开发上传组件的技巧。我目前主要
- 107条javascript(js)常用的方法技巧,十分的实用,相信看了下面的这些js编程技巧和方法,能够给javascript初学者解决很
- 作者:AngelGavin 出处:CSDNInternet Explorer 5.0 对 XML 提供哪个级别的支持?Inter
- 分页,就是按照某种规则显示分组数据集,但是在SQL Server 中,分页并不是十分容易就能够实现。在过去,开发人员通常需要自己编写程序,使
- 背景重装系统,发现之前装在E盘的python可以直接使用,就只是将python的安装目录加入到环境变量中,也一直没有管它,今天跟天软交互的时
- 段落已经讲完了,那么一些基本的应用方式也讲了一些,那么是否已经应用了呢?当然应用可以更为丰富,那么这些就需要自己在实际工作中不断的摸索与思考
- <%'该函数作用:按指定参数格式化显示时间。'numformat=1:将时间转化为yyyy-mm-dd h
- 用python实现FTP文件传输,包括服务器端和客户端,要求(1)客户端访问服务器端要有一个验证功能(2)可以有多个客户端访问服务器端(3)
- 描述微软开发的两个动态库存在后门允许用户查看ASP文件源程序和下载整个网站详细随IIS和Frontpage Extention server