【问题标题】:Iterator and/or iterable difference and similarites?迭代器和/或可迭代的区别和相似之处?
【发布时间】:2018-03-23 16:12:50
【问题描述】:

有人能解释一下迭代器和可迭代对象之间的区别吗?

此外,拥有一个同时定义 dunder 方法 __iter____next__ 的类是否是一个好习惯?

    class MyIter:
        def __init__(self, n):
            self.n = n

        def __iter__(self):
            return self

        def __next__(self):
            self.n /= 2
            if self.n < 1:
                raise StopIteration
            return self.n 

【问题讨论】:

  • which 问题的最佳解决方案究竟是什么?您的所有示例都是预期的行为。
  • A 有一个大类,我多次使用迭代器,所以实际上以上都没有真正适合我
  • 为什么迭代器到达终点后要重置自己?迭代器本身无法区分它被list(x)(您似乎希望它重置)和for i in x:)(重置本身会产生无限循环)之间的区别。
  • 听起来你不明白迭代器和可迭代对象的区别。也许你从那些糟糕的教程中学到了,他们通过将对象变成自己的迭代器来使对象可迭代。如果要反复吃蛋糕,就不要买可重复使用的蛋糕;你需要一个蛋糕的来源,比如面包店,它本身并不是蛋糕。如果要反复迭代,则不需要可重用的迭代器;你需要一个迭代器的,它本身不是一个迭代器。

标签: python iterator itertools


【解决方案1】:

仅当您希望您的实例像生成器一样运行时才实施__next__,因此可以用尽。在这里,你想要的是 MyIter.__iter__ 返回一个生成器,否则任何改变实例的东西都会影响迭代。

class MyIter:

    def __init__(self, n):
        self.n = n

    def __iter__(self):
        n = self.n
        while n >= 1:
            yield n
            n /= 2

obj = MyIter(10)
list(obj) # [10, 5.0, 2.5, 1.25]
list(obj) # [10, 5.0, 2.5, 1.25]

还要注意,带有__next__ 的类实例可以用尽不是问题。这实际上是使 itertools.product 这样的类如此有用的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 2021-08-24
    • 2010-12-04
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多