哪些Python可重用?

哪些Python可重用?,python,iterator,Python,Iterator,如果我理解正确,我们在Python中有: Iterables=\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 迭代器=\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 生成器=使用yield语句或生成器表达式创建的迭代器 问题:上述类别是否总是/从不可消费 我所说的消耗品,是指

如果我理解正确,我们在Python中有:

  • Iterables=
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
  • 迭代器=
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
  • 生成器=使用
    yield
    语句或生成器表达式创建的迭代器
问题:上述类别是否总是/从不可消费

我所说的消耗品,是指迭代它们“破坏”了iterable;像zip()(可消耗)和range()(非可消耗)一样。

所有迭代器都被消耗;您可能不这么认为的原因是,当您将iterable与以下内容一起使用时

for x in [1,2,3]:
class PowTwoIterator:    
    def __init__(self, max=0):
        self.max = max
        self._restart()

    def _restart(self):
        self._n = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self._n <= self.max:
            result = 2 ** self._n
            self._n += 1
            return result
        else:
            raise StopIteration
for
循环正在幕后为您创建一个新的迭代器。事实上,
列表
不是迭代器
iter([1,2,3])
返回类型为
list\u iterator
的内容,而不是列表本身


关于您在评论中链接到的示例,而不是

class PowTwo:    
    def __init__(self, max=0):
        self.max = max

    def __iter__(self):
        self.n = 0
        return self

    def __next__(self):
        if self.n <= self.max:
            result = 2 ** self.n
            self.n += 1
            return result
        else:
            raise StopIteration
第二类:
定义初始值(自,最大值=0):
self.max=max
定义(自我):
self.n=0
回归自我
定义下一个(自我):

if self.n Small correction:
yield
def
语句中创建一个生成器,但您也可以使用生成器表达式创建一个生成器,例如
(x代表[1,2,3]中的x])
!所以range()对象不是迭代器,而是iterable?正确;特别是,
range.\uuuu iter\uuuu
的CPython实现返回
range\u迭代器
类型的内容。非常感谢!最后一个问题:我看到自定义迭代器不是可消费的,因此我感到困惑(对于本教程中的类“powtoo:”)。那么,这被认为是不好的做法,还是所有内置Python迭代器都遵循非消耗性的经验法则?我认为这是不好的做法,如果仅仅因为
\uuu iter\uu
有副作用的话。看起来你可以创建这个类的两个独立迭代器(
p=powtow2();i1=iter(p);i2=iter(p)
),但是既然
i1是i2
是真的,那么推进一个就推进另一个。这是有意义的。非常感谢。