我对带有迭代器和生成器的此类的理解-如果我错了,请纠正我

时间:2018-11-04 08:15:24

标签: python python-3.x python-2.7

我最近发布了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

我认为这是正确的:

  1. 我认为,当我们调用__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]反复进行。

    完成该操作,直到引发停止迭代为止。

  2. i in range(5)做事是可行的,但随后将破坏i in b.volume__iter__的目的。

这是正确的吗?

1 个答案:

答案 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