Python生成器与迭代器详情
作者:一碗周 发布时间:2022-04-09 15:36:27
目录
1、生成器
2、迭代器与可迭代的生成器
1、生成器
现在可以通过生成器来直接创建一个列表,但是由于内存的限制,列表的容量肯定是有限的,如果我们需要一个包含几百个元素的列表,但是每次访问的时候只访问其中的几个,那剩下的元素不使用就很浪费内存空间。
这个时候生成器(Generator
)就起到了作用,他是按照某种算法不断生成新的数据,直到满足某一个指定的条件结束
得到生成式的方式有如下几种:
通过列表生成式来得到生成器,示例代码如下:
g = (x for x in range(10)) # 将列表生成列的[]改变成为()
# 打印其类型
print(type(g)) # <class 'generator'>
# 调用其元素
print(g.__next__()) # 0
print(g.__next__()) # 1
print(g.__next__()) # 2
print(g.__next__()) # 3
print(g.__next__()) # 4
# 使用.__next__的方式调用
print(next(g)) # 5
print(next(g)) # 6
print(next(g)) # 7
print(next(g)) # 8
print(next(g)) # 9
# 使用next()的方法调用
print(next(g)) # 当数据调用不到时会报出错误 StopIteration
需要多少调用多少,不调用的不会生成,也就不会占用内存空间,可以使用循环结构来按照需要来调用
g = (x for x in range(10)) # 将列表生成列的[]改变成为()
skip = True # 判断条件
count = 0 # 调用次数
while skip:
count += 1 # 循环一次+1
print(next(g))
if count > 9:
break # 跳出循环
使用函数借助yield
关键字来完成一个生成器,生成斐波那契数列的前20个数,示例代码如下:
def fun(length):
a, b = 0, 1
for _ in range(length):
a, b = b, a + b
yield a
fib = fun(20)
print(type(fib)) # <class 'generator'> # 打印类型
count = 0
while count < 20:
# 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
print(next(fib), "", end="")
count += 1
流程如下:
在执行过程中,遇到yield
关键字就会暂停执行,下次调用则继续从上次暂停的位置继续执行,因为是一个循环语句,所有会直接跳到for
语句
如果在调用yield
,需要给它传值,就要使用.send()
方法了。
示例代码如下:
def fun(num):
n = 0
for i in range(num + 1):
n += i
ret = yield n
print(f"这是+到{ret}的第{i + 1} 次")
g = fun(3)
print(g.send(None))
print(g.send('3'))
print(g.send('3'))
print(g.send('3'))
'''
---输出结果---
0
这是+到 3 的第 1 次
1
这是+到 3 的第 2 次
3
这是+到 3 的第 3 次
6
'''
send
的加入可以使生成器更加灵活,但是需要注意的是第一次调用生成器的send()
方法时,参数只能为None
,否则会抛出异常。当然也可以在调用send()
方法之前先调用一次next()
方法,目的是让生成器先进入yield
表达式。
2、迭代器与可迭代的生成器
可迭代的对象有生成器、元组、列表、集合、字典和字符串等
通过collections
的Iterable
函数结合isinstance
(object, classinfo)来判断一个对象时不是可迭代的对象
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。很生成器也是迭代器。
可以被next ()
函数调用并不断返回下一个值的对象称为迭代器: Iterator
,可以使用isinstance()
判断一个对象是否是Iterator
对象:
注意:可迭代的不一定是生成器,但是生成器一定第可迭代的。
把元组、列表、集合、字典和字符串等Iterable
变成Iterator
可以使用iter()
函数
Iterable
和Iterator****
的区别是Iterable
是可以作为for
循环对象的统称;而Iterator
对象需要被next()函数调用才不断返回下一个数据,直到没有数据时抛出StopIteration
错误,而在这之前是不会知道其长度的,所以Iterator的计算是惰性的,只有next()
函数叫他才会返回结果,Iterator
甚至可以表示一个无限大的数据流,例如全体自然数。
from collections.abc import Iterable, Iterator
a = [1, 2, 3]
b = {1, 2, 3}
c = (1, 2, 3)
d = "123"
e = 123
f = (x for x in range(5))
# 打印数据类型
print(type(a)) # <class 'list'>
print(type(b)) # <class 'set'>
print(type(c)) # <class 'tuple'>
print(type(d)) # <class 'str'>
print(type(e)) # <class 'int'>
print(type(f)) # <class 'generator'>
print("-" * 20)
# 打印是否为可迭代对象
print(isinstance(a, Iterable)) # True
print(isinstance(b, Iterable)) # True
print(isinstance(c, Iterable)) # True
print(isinstance(d, Iterable)) # True
print(isinstance(e, Iterable)) # False
print(isinstance(f, Iterable)) # True
print("-" * 20)
# 除了字符串都是可迭代对象
# 打印是否是迭代器
print(isinstance(a, Iterator)) # False
print(isinstance(b, Iterator)) # False
print(isinstance(c, Iterator)) # False
print(isinstance(d, Iterator)) # False
print(isinstance(f, Iterator)) # True
# 只有f(生成器)是迭代器
print("-" * 20)
# 通过iter()将可迭代转换为迭代器
print(isinstance(iter(a), Iterator)) # True
print(isinstance(iter(b), Iterator)) # True
print(isinstance(iter(c), Iterator)) # True
print(isinstance(iter(d), Iterator)) # True
来源:https://juejin.cn/post/7024045651361169445


猜你喜欢
- 质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。一、判断一个数是否为素数:基于定义def
- Python 提供了 日期和时间模块用来处理日期和时间,还可以用于格式化日期和时间等常见功能。时间间隔是以秒为单位的浮点小数。每个时间戳都以
- 格式请使用 gif 或 jpg 或swf (flash)同一组广告请使用一种格式。命名命名方式:宽x高.图片格式x 必须小写 ; 图片格式
- 前端开发中两个很不错的小技巧, CSS三角形与圆角背景. 的确, 它们都可以通过图片来实现, 但, 抛开用代码实现可以减小图片加载量不说,
- 前言在Windows上编写python程序时,有时候需要对输出的文字颜色进行设置,特别是日志显示,不同级别的日志设置不同的颜色进行展示可以直
- [1]定义:正则又叫规则或模式,是一个强大的字符串匹配工具,在javascript中是一个对象[2]特性:[2.1]贪婪性,匹配最长的[2.
- shapefile转换geojsonimport shapefileimport codecsfrom json import dumps#
- 如今大部分网站仍然采用表格嵌套内容的方式来制作网站,虽然此方法对于我们来说比较熟悉、比较上手;但是,它却阻碍了一种更好的、更有亲和力的、更灵
- 本文实例讲述了Python实现将HTML转成PDF的方法。分享给大家供大家参考,具体如下:主要使用的是wkhtmltopdf的Python封
- 使用expdp时,遇到”ORA-39002、ORA-39070......”连续报错。1、 遇到的问题C:\Users\Admi
- 一般不建议做第4,6两步,第4步不安全,有可能损坏数据库或丢失数据。第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复。
- 前言pandas对数据框也可以像excel一样进行数据透视表整合之类的操作。主要是针对分类数据进行操作,还可以计算数值型数据,去满足复杂的分
- <!doctype html><html><head><meta charset="ut
- 我为一大型网站做了一个论坛,也顺利通过了测试。由于是第一次做这方面的数据库,我不知道比其它网站上数据库差距有多大,是不是够优化。能推荐或介绍
- 本文主要给大家介绍了关于webpack中publicPath路径问题的相关内容,分享出来供大家参考学习,下面来看看详细的介绍:output:
- 1.必需的参数:必须参数须以正确的顺序传入函数,调用的数量必须和声明时的一样def f(name,age):print('I am
- 1、yield,将函数变为 generator (生成器)例如:斐波那契数列def fib(num): a, b, c = 1,
- 一 什么是XML?python与json数据的交互详情 在这篇文章中我们介绍了json是一种独立于编程语言和平台的数据存储和交换方
- 在开发应用程序时,客户端(前端页面或APP)与服务端交互是在所难免的,在交互过程传递数据时,最通用和流行格式便是JSON,Go语言提供了en
- 最近几天,学习python3的对FTP操作,做下总结!!!!1.FTP链接这样写的好处就是如果报错,很快就能找到错在哪里,方便找到问题。2.