如何在类的循环中打印变量?如何在__iter__/__next__中输出self.n?
解决迭代类中打印self.n的问题
首先得指出你代码里的核心错误:你在for循环里写的str(iter(self.n))里的self根本不在当前作用域里——这个self是类内部方法里的引用,在循环的外部代码中根本没定义,所以才会抛出NameError。而且iter(self.n)完全是多余的,self.n是整数,直接转字符串就行,不需要用iter()。
下面给你两种可行的解决方案,按需选择:
方案一:在类的__iter__或__next__方法内部打印self.n
这种方式最直接,每次迭代时在类内部自动输出self.n的值,外部循环只需要处理结果即可:
class PowTwo: def __init__(self, max = 0): self.max = max def __iter__(self): self.n = 1 # 初始化迭代器时打印初始的self.n print(f"迭代器初始化,当前self.n: {self.n}") return self def __next__(self): if self.n <= self.max: result = 2 ** self.n # 计算结果后,先打印当前的self.n print(f"当前迭代对应的self.n: {self.n}") self.n += 1 return result else: raise StopIteration # 外部循环只需要打印迭代结果 for item in PowTwo(4): print(f"Item = Result: {item}\n")
运行这段代码,你会看到每次迭代时都会输出对应的self.n,逻辑清晰且不需要外部关心迭代器内部的变量。
方案二:在外部循环中访问迭代器实例的n属性
如果你想在外部自定义输出格式,需要先获取迭代器的实例,然后直接访问它的n属性。不过要注意:__next__方法里是先计算结果,再将self.n自增,所以当你在循环里拿到item时,self.n已经加1了,需要减1才能对应当前item的n值:
class PowTwo: def __init__(self, max = 0): self.max = max def __iter__(self): self.n = 1 return self def __next__(self): if self.n <= self.max: result = 2 ** self.n self.n += 1 return result else: raise StopIteration # 先创建迭代器实例 pow_iterator = PowTwo(4) for item in pow_iterator: # 因为self.n在__next__里已经自增,所以要减1才能对应当前item的n值 print(f"Self.n: {pow_iterator.n - 1} Item = Result: {item}")
这样就能在外部循环里自定义输出包含self.n的内容了。
内容的提问来源于stack exchange,提问作者PhyAH
相关产品推荐
相关产品推荐

