You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:43:29