Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Iter返回自我作为占位符_Python_Python 3.x_Iteration - Fatal编程技术网

Python Iter返回自我作为占位符

Python Iter返回自我作为占位符,python,python-3.x,iteration,Python,Python 3.x,Iteration,我看到了很多示例,其中\uu iter\uu方法返回self,我也做了自己的示例: class Transactions: def __init__(self): self.t = [1,2,9,12.00] self.idx = 0 def __iter__(self): return self def __next__(self): pos = self.idx self.idx += 1

我看到了很多示例,其中
\uu iter\uu
方法返回
self
,我也做了自己的示例:

class Transactions:
    def __init__(self):
        self.t = [1,2,9,12.00]
        self.idx = 0
    def __iter__(self):
        return self
    def __next__(self):
        pos = self.idx
        self.idx += 1
        try:
            return self.t[pos]
        except IndexError:
            raise StopIteration

>>> list(iter(Transactions()))
[1, 2, 9, 12.0]

“返回
self
”如何使对象变得可编辑?那到底是干什么的

您正在制作的是一个迭代器和一个可编辑的
Transactions
类的实例将同时具有使其成为Iterable的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,以及使其成为迭代器的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuu

因此,当您从
\uuuuu iter\uuuuuu
返回
self
时,您基本上是在指示返回的对象是一个Iterable,因为它具有
\uuuuuuuu iter\uuuuuuuuu
,并且在调用
\uuuuuuuuuuu iter\uuuuuu
时,它必须返回迭代器的一个实例,因此您已经为同一实例定义了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,使其行为类似于迭代器

这一点在以下文件中突出显示:

Iterable

一种能够一次返回一个成员的对象。例子 iterables包括所有序列类型(如list、str和tuple) 还有一些非序列类型,如dict、文件对象和 使用iter()方法或 实现序列语义的方法。 Iterables可用于for循环和许多其他需要序列的地方(zip()、map()、…)当一个可编辑的对象 作为参数传递给内置函数iter(),它返回 对象的迭代器。这个迭代器适合一次遍历 值的集合。使用iterables时,通常不需要 调用iter()或自己处理迭代器对象。为 语句会自动为您执行此操作,并创建一个临时 未命名变量,用于在循环期间保持迭代器。 另请参见迭代器、序列和生成器

迭代器

表示数据流的对象重复呼叫 迭代器的\uuuuuuuuuuuuuuuuu next()方法(或将其传递给内置函数 next())返回流中的连续项。当没有更多的数据时 可用时,将引发StopIteration异常。在这一点上,, 迭代器对象已耗尽,任何进一步调用其 下一步()方法只需再次引发StopIteration。迭代器需要有一个返回迭代器对象的iter()方法 因此,每个迭代器也是可迭代的,可以在大多数情况下使用 可接受其他iterables的地方。一个显著的例外是 尝试多次迭代的代码。容器对象 (例如列表)每次传递时都会生成一个新的迭代器 或在for循环中使用它。尝试使用 迭代器将只返回使用的相同迭代器对象 在上一个迭代过程中,使其看起来像一个空的 容器


给出了一个很好的答案,我想展示一个实际的例子

问题中定义的
事务
是一个迭代器。它可以只迭代一次

虽然典型迭代的形式是……:
中x的
,但让我们继续使用较短的
列表()
进行演示:

>>> t=Transactions()
>>> list(t)
[1, 2, 9, 12.0]
>>> list(t)
[]
>>> list(t)
[]
对于一个真正的班级来说,这不是人们所期望的。为了每次迭代数据,必须为每次迭代创建一个新的迭代器,使原始类成为一个可重用的类:

class TransactionsIterator:
    def __init__(self, t): 
        self.t = t 
        self.idx = 0 
    def __iter__(self):
        return self
    def __next__(self):
        pos = self.idx
        self.idx += 1
        try:
            return self.t[pos]
        except IndexError:
            raise StopIteration

class Transactions:
    def __init__(self):
        self.t = [1,2,9,12.00]
    def __iter__(self):
        return TransactionsIterator(self.t)
这与其他类通常的行为相同:

>>> t=Transactions()
>>> list(t)
[1, 2, 9, 12.0]
>>> list(t)
[1, 2, 9, 12.0]
>>> list(t)
[1, 2, 9, 12.0]
>>> list(t)
最后,您不必重新发明列表迭代器,这就是您所需要的:

class Transactions:
    def __init__(self):
        self.t = [1,2,9,12.00]
    def __iter__(self):
        return iter(self.t)


回到问题上来。我们可以使用迭代器对数据进行一次迭代,每次使用iterable。在
\uuuu iter\uuuu
中,迭代器返回
self
的全部要点是,迭代代码不必区分这两种情况。

因此,如果我理解正确,定义
\uuuuuu iter\uuuuu
告诉我们类是否可迭代;而定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
实际上给了我们。这是否准确?是的,定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。