我正在编程一个迭代器对象,它会返回对自身的修改,我希望原始对象是迭代过程的一部分,所以需要在修改之前返回它.

...但是:

  • 创建要返回的对象的deepcopy非常耗时.
  • 对象有很多属性,因此定义辅助变量似乎不是一个优雅的解决方案.
  • __next__中的yield将不起作用,因为它在每次迭代中返回不同的类型(生成器).
  • 我可以用__iter__中的yield来获得一个迭代器,但我不能用__next__来获得按需迭代(我的对象是一台图灵机,所以受控的一步一步打印磁带会很好).

工作但效率低下的代码示例:

from copy import deepcopy

class MyObject():
    def __init__(self, n):
        self.n = n
   
    def __str__(self):
        return str(self.n)

    def __iter__(self):
        return self

    def __next__(self):
        if self.n >= 10:
            raise StopIteration

        self_copy = deepcopy(self)
        self.n += 1
        return self_copy

for x in MyObject(n=7):
    print(x)

输出:

7
8
9

我可能错过了什么,但我想不出来.

推荐答案

发电机似乎是个好主意.用以下内容替换__iter____next__:

    def __iter__(self):
        while not self.n >= 10:
            yield self
            self.n += 1

(在这种情况下,我们当然可以 Select while self.n < 10:.)

或者,要使对象本身成为自己的迭代器,如我们在下面的 comments 中所讨论的,您可以使用一个标志:

class MyObject():
    def __init__(self, n):
        self.n = n
        self.iterated_original = False
   
    def __str__(self):
        return str(self.n)

    def __iter__(self):
        return self

    def __next__(self):
        if not self.iterated_original:
            self.iterated_original = True
        else:
            self.n += 1
        if self.n >= 10:
            raise StopIteration
        return self

for x in MyObject(n=7):
    print(x)

或者,由于理想情况下,iterated_original被设置为True after,原始版本已经被迭代,下面是我能做的最晚的事情:

    def __next__(self):
        if self.iterated_original:
            self.n += 1
        if self.n >= 10:
            raise StopIteration
        try:
            return self
        finally:
           self.iterated_original = True

Python相关问答推荐

即使在可见的情况下也不相互作用

试图找到Python方法来部分填充numpy数组

Django mysql图标不适用于小 case

使用setuptools pyproject.toml和自定义目录树构建PyPi包

如何在solve()之后获得症状上的等式的值

DataFrames与NaN的条件乘法

NumPy中条件嵌套for循环的向量化

Plotly Dash Creating Interactive Graph下拉列表

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题

如何使用两个关键函数来排序一个多索引框架?

python中csv. Dictreader. fieldname的类型是什么?'

GPT python SDK引入了大量开销/错误超时

一个telegram 机器人应该发送一个测验如何做?""

类型对象';敌人';没有属性';损害';

正在try 让Python读取特定的CSV文件

Pandas 删除只有一种类型的值的行,重复或不重复

Numpy`astype(Int)`给出`np.int64`而不是`int`-怎么办?

如何通过函数的强式路径动态导入函数?

生产者/消费者-Queue.get by list

如何将参数名作为参数传入到函数中?