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。