python 可迭代对象-迭代器-生成器
程序员文章站
2024-01-15 12:42:22
...
迭代器的本质就是每次调用__next__()返回下个元素或抛出StopIteration的容器对象
迭代器对象可以调用close()方法关闭
只实现Iter方法(返回值类型需为迭代器类型), 为可迭代对象, 如列表、字典等
from collections.abc import Iterable, Iterator
class MyIteration:
def __init__(self, n=10):
self.n = n
self.lst = range(n)
def __iter__(self):
return iter(enumerate(self.lst))
if __name__ == '__main__':
for x in MyIteration(3):
print(x)
# """
# (0, 0)
# (1, 1)
# (2, 2)
# """
print(isinstance(MyIteration(), Iterable)) # True
print(isinstance(MyIteration(), Iterator)) # False
***注意***
class MyIteration3(object):
"""
实现getitem方法的对象可以用于for-in循环,但非可迭代对象
"""
def __init__(self, n=10):
self.lst = range(n)
def __getitem__(self, i):
if i < len(self.lst):
return self.lst[i]
raise IndexError
if __name__ == '__main__':
for x in MyIteration3(3):
print(x)
# """
# 0
# 1
# 2
# """
print(isinstance(MyIteration3(), Iterable)) # False
print(isinstance(MyIteration3(), Iterator)) # False
实现iter和next方法的对象,即迭代器对象
class MyIteration2:
def __init__(self, n=10):
self.n = n
self.count = 0 # 迭代器的初始化条件,放在init和iter不同效果
def __iter__(self):
"""
执行for-in时,会调用此方法,如果把初始化条件放到此,迭代器就可以多次执行for循环
如果放到init方法中,则每个迭代器对象只能做一次for-in操作
所以按迭代器的特性,迭代初始条件应该放到init中
:return:
"""
return self # 只需要返回自身即可
def __next__(self):
while self.count < self.n:
result = self.count
self.count += 1
return result
raise StopIteration
if __name__ == '__main__':
it = MyIteration2(3)
for x in it:
print(x)
# """
# 0
# 1
# 2
# """
print(isinstance(MyIteration2(), Iterable)) # True
print(isinstance(MyIteration2(), Iterator)) # True
生成器:是一种特殊的迭代器, 是迭代器类型的子集。即生成器一定是迭代器,迭代器不一定是生成器。
yield关键字把普通方法变为一个生成器(generator)
yield指令可以暂停一个函数并返回其中间结果,使用该指令的函数将保存执行环境,并在必要时恢复
def generation(n=10):
for x in range(n):
yield x
if __name__ == '__main__':
g = generation(3)
for x in g:
print(x)
# """
# 0
# 1
# 2
# """
print(isinstance(generation(), Iterable)) # True
print(isinstance(generation(), Iterator)) # True
生成器推导式
print(isinstance((x for x in range(2)), Iterable)) # True
print(isinstance((x for x in range(2)), Iterator)) # True
上一篇: 基于学生课堂管理签到的AI人脸识别系统