Python自定义类实现迭代器报TypeError及返回值格式调整问题
问题修复方案
1. 报错原因及修复
你收到的MyClass不可迭代的报错是两处问题叠加导致:
- 首先确认你实际运行的代码确实在
MyClass内部定义了__iter__方法,你给出的示例代码中该方法是存在的,理论上已经满足类的可迭代要求,若实际运行版本漏写该方法,补全即可消除类不可迭代的报错。 - 你写的三层嵌套列表推导式存在逻辑错误:迭代
MyClass实例时,第一个返回的值是id(整数类型),你后续尝试对整数做for item in subsublist的迭代操作,整数本身不可迭代,这才是报错的根本原因。
2. 格式调整及代码优化
你期望返回[id值, [x坐标, y坐标]]的格式,核心修改两处逻辑即可:
- 把
__init__里生成location的逻辑中size=(1,2)改为size=2,去掉多余的一维嵌套,生成的列表直接是[x,y]格式 - 简化列表推导式逻辑,不需要三层嵌套,直接将每个
MyClass实例转成列表即可
修复后的完整代码
import numpy as np import itertools class MyClass(): id = itertools.count() def __init__(self, location = None): self.id = next(MyClass.id) # 修改size参数,去掉多余的嵌套维度 self.location = np.random.uniform(0, 1, size=2).tolist() def __iter__(self): for _ in self.__dict__.values(): yield _ def create(): # 简化生成逻辑,直接生成20个实例 return [MyClass() for _ in range(20)] objects = create() # 直接迭代每个实例转列表,不需要复杂嵌套推导 objects = [list(obj) for obj in objects]
运行后每个元素的格式就是你期望的[20, [0.2552026126490259, 0.48489389169530417]]样式。
内容的提问来源于stack exchange,提问作者user1393214
相关产品推荐
相关产品推荐

