当前位置 博文首页 > m0_51723227的博客:迭代器,生成器
迭代器:具有迭代对象的容器,一个可以记住遍历的位置的对象。
生成器:使用了 yield 的函数被称为生成器(generator)
字符串,元组,列表都可以创建迭代器
a = [1, 2, 3]
iteration = iter(a) #创建迭代器
print(next(iteration)) #开始输出迭代器的下一个元素
print(next(iteration))
print(next(iteration))
结果:
1
2
3
我们再试试多出列表元素的next函数
a = [1, 2, 3]
iteration = iter(a) #创建迭代器
print(next(iteration)) #开始输出迭代器的下一个元素
print(next(iteration))
print(next(iteration))
print(next(iteration))
结果:
1
2
3
Traceback (most recent call last):
File "C:/Users/魑魅魍魉/Desktop/飞机大战/main.py", line 6, in <module>
print(next(iteration))
StopIteration
发现报错:StopIteration,我们相信可以用什么方法解决报错?
那就是异常处理
例子:
try:
a = [1, 2, 3]
iteration = iter(a) #创建迭代器
print(next(iteration)) #开始输出迭代器的下一个元素
print(next(iteration))
print(next(iteration))
print(next(iteration))
except StopIteration:
pass
结果:
1
2
3
我们还可以使用迭代器模拟 for i in iteration
循环
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
a = iter(a)
try:
while True:
print(next(a))
except StopIteration:
pass
迭代器和可迭代对象从某种层面说是一个东西,只是迭代器(**iter(可迭代对象)**后)可以用next
实现一步一步的遍历内容.而可以使用next()的方法就是一个迭代器
本质上还是迭代器的一种
特点:
def func():
print("==========1==========")
yield 111111111111
print("==========2==========")
yield 222222222222
print("==========3==========")
yield 333333333333
print("==========4==========")
# 这就是类似于函数逻辑
a =func() #必须有这一步,类似实例化
print(next(a))
结果:
==========1==========
111111111111
如果执行两次呢?
print(next(a))
print(next(a))
结果:
==========1==========
111111111111
==========2==========
222222222222
这就是特点2,显式的暂停(yield)和恢复(next)
暂停在yield处
那么何为隐式的迭代协议呢???例:
def func():
print("==========1==========")
yield 111111111111
print("==========2==========")
yield 222222222222
print("==========3==========")
yield 333333333333
print("==========4==========")
a = func() # 必须有这一步,类似实例化
print(next(a))
print(next(a))
print(next(a))
print(next(a))
结果:
==========1==========
111111111111
==========2==========
222222222222
==========3==========
333333333333
==========4==========
Traceback (most recent call last):
File "C:/Users/魑魅魍魉/Desktop/飞机大战/main.py", line 15, in <module>
print(next(a))
StopIteration
这就是特点三,依然像迭代器一样顺序执行,当超出范围没有暂停就报错
生成器可以省内存,需要多少就执行多少,而不会像列表一样,需要提前写好一大串!
cs