Python中return iter()与yield from的差异及可多次迭代类代码验证
Python可迭代类中
__iter__方法:return iter()与yield from的区别及代码验证 问题描述
我希望自己编写的Python类能够被多次迭代,请问在此场景下,__iter__方法中使用return iter()和yield from有什么区别?同时请验证我编写的两段代码是否正确?
实现代码验证
两段代码均正确,都能让类成为合法的可迭代对象,且支持多次独立迭代。运行代码后,两个isinstance判断都会输出True。
实现代码
from typing import Iterable class My_yield_from: def __init__(self): self.data = [1,2,3] self.tag = 'happy' def __iter__(self): yield from self.data print('My_yield_from is Iterable?', isinstance(My_yield_from(), Iterable)) class My_iter: def __init__(self): self.data = [1,2,3] self.tag = 'happy' def __iter__(self): return iter(self.data) print('My_iter is Iterable?', isinstance(My_iter(), Iterable))
两者核心区别
1. 实现原理
return iter(self.data):直接返回self.data(列表)内置的迭代器对象。每次调用__iter__都会生成一个全新的迭代器,指向列表的起始位置,因此多次迭代、多个迭代器之间完全独立。yield from self.data:__iter__是一个生成器函数,调用时会返回一个生成器迭代器。每次调用__iter__都会创建新的生成器,从头遍历self.data,同样支持多次独立迭代。
2. 灵活性
yield from支持在遍历流程中插入自定义逻辑,比如遍历前后的日志打印、数据预处理等:def __iter__(self): print("开始遍历数据") yield from self.data print("数据遍历完成")return iter()仅复用原可迭代对象的迭代器,无法直接在遍历过程中添加自定义逻辑,若需扩展需手动实现完整的迭代器协议(即__next__方法)。
3. 性能与底层机制
iter(self.data)返回的是Python内置的列表迭代器,属于底层优化实现,性能略优。yield from是生成器的语法糖,本质是生成器迭代,性能差异在常规场景下可忽略,但超大规模迭代时会有细微差距。
测试代码及结果
两段实现运行以下测试代码,输出完全一致,均能支持多次独立迭代:
测试代码
my = My_yield_from() # 替换为My_iter()结果相同 print('first loop') for i in my: print(i) print('second loop') for i in my: print(i) print('another iter') it = iter(my) print(next(it)) print(next(it)) print(next(it)) try: print(next(it)) except StopIteration: print('StopIteration') print('another iter') it = iter(my) print(next(it)) print(next(it)) print(next(it)) try: print(next(it)) except StopIteration: print('StopIteration') print('two iters') it1 = iter(my) it2 = iter(my) print(next(it1)) print(next(it2)) print(next(it1)) print(next(it2)) print(next(it1)) print(next(it2))
测试输出
first loop 1 2 3 second loop 1 2 3 another iter 1 2 3 StopIteration another iter 1 2 3 StopIteration two iters 1 1 2 2 3 3
内容的提问来源于stack exchange,提问作者Huaijun Jiang
相关产品推荐
相关产品推荐

