我最近发布了a question ,在你们中的一些人和我的阅读的帮助下,我了解到:
我最初发布的问题是 - for item in b
的含义是什么。虽然我知道 for i in Something
是如何工作的,但我不明白为什么我们在将项目(参见下面的代码)放入 b.volume 时使用
不在 b
b
中。如果我们从不向其中放入内容(而是放入 b.volume
中),Python 如何知道 b
中的内容。
class Box:
def __init__(self):
self.volume = []
self.index = -1
def add_item(self, item):
self.volume.append(item)
def __iter__(self):
return self
def __next__(self):
self.index +=1
if self.index >= len(self.volume):
raise StopIteration
return self.volume[self.index]
class Item:
def __init__(self, name, weight):
self.name = name
self.weight = weight
b = Box()
b.add_item(Item('Cat', 5))
b.add_item(Item('Nintendo Switch', 1))
b.add_item(Item('Potatoes', 2))
for i in b:
print('The {} weighs {} kg'.format(item.name.lower(), item.weight))
因此,我认为应该是 for i in b.volume
,而不是 for i in b
。
以下是我认为正确的:
我认为当我们调用
for i in b
时,它会调用对象b<的
。它告诉我们转到__iter__
和__next__
方法b
的__iter__
和__next__
(就像只是指定对象,这样它就不会转到其他对象的__iter__
方法(如果已定义)因此,在
for i in b
之后,调用对象b
的__iter__
方法,然后调用__next__
> 方法。__next__
方法返回一些内容,它恰好是i 的值(对于 b 中的 i)
。此外,这里的 Python 不知道它将执行多少次迭代,因为没有为
eq
生成列表 Fori in range(5)
生成一个列表[0,1,2,3,4] b 迭代。直到引发停止迭代为止。
在 b.volume 中执行 for
i
会起作用,但随后会破坏__iter__
和__next__
的目的。
这是正确的吗?
最佳答案
您认为代码中的所有内容都是正确的,但也只是告诉您,这适用于 b.volume
也将适用,因此:
for i in b.volume:
print('The {} weighs {} kg'.format(i.name.lower(), i.weight))
还给出:
The cat weighs 5 kg
The nintendo switch weighs 1 kg
The potatoes weighs 2 kg
注意:(如我的示例),在本例中(在最后一个循环中),item
应该是 i
。
关于python - 我对这个类的迭代器和生成器的理解 - 如果我错了,请纠正我,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53138929/