哪些Python可重用?

2024-09-28 01:23:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  • Iterables=__iter__()已实现
  • 迭代器=__iter__()返回self&__next__()已实现
  • 生成器=使用yield语句或生成器表达式创建的迭代器

问题:上述类别是否总是/从不可消费

我所说的消耗品,是指迭代它们“破坏”了iterable;比如zip()(耗材)和range()(非耗材)


Tags: self表达式range语句zipiterable类别next
1条回答
网友
1楼 · 发布于 2024-09-28 01:23:08

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

for x in [1,2,3]:

for循环正在幕后为您创建一个新的迭代器。事实上,list不是迭代器iter([1,2,3])返回类型为list_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

它的副作用是在返回迭代器时修改迭代器,我会这样做

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

现在,修改对象状态的唯一方法是显式修改(即使这样做也不应轻率,因为_n_restart都被标记为不属于公共接口)

名称的更改提醒您,这首先是一个迭代器,而不是一个可以从中提供独立迭代器的iterable

相关问题 更多 >

    热门问题