我最近发布了a question,在你们中的一些人以及我的阅读书的帮助下,我了解到:
我最初发布的问题是-for item in b
是什么意思。尽管我知道for i in something
的工作原理,但是我不明白为什么我们将b
放在b.volume
中而不是b
中的情况下(见下面的代码)。如果我们从不在b
中放东西(而是放到b.volume
中,python怎么知道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
因此,我认为应该是for i in b.volume
,而不是for i in b
。
我认为这是正确的:
我认为,当我们调用__iter__
时,它会为__next__
调用object b
和__iter__
方法。它告诉您转到__next__
的{{1}}和b
(就像只是指定对象,这样它就不会转到其他对象的__iter__
方法(如果已定义))< / p>
因此,在for i in b
之后,先调用对象__iter__
的{{1}}方法,然后再调用b
方法。 __next__
方法返回一些值,恰好是__next__
的值。
此外,这里的Python不知道它将执行多少次迭代,因为没有为i (for i in b)
生成任何列表。对于eq
来说,生成的列表为[0,1,2,3,4]反复进行。
完成该操作,直到引发停止迭代为止。
为i in range(5)
做事是可行的,但随后将破坏i in b.volume
和__iter__
的目的。
这是正确的吗?
答案 0 :(得分:2)
您认为与代码有关的所有内容都是正确的,但也只是告诉您,与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
。