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

如何在类的循环中打印变量?如何在__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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:48:50