python - 我对这个类的迭代器和生成器的理解 - 如果我错了,请纠正我

标签 python python-3.x python-2.7

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

以下是我认为正确的:

  1. 我认为当我们调用for i in b时,它会调用对象b<的__iter____next__方法。它告诉我们转到 b__iter____next__ (就像只是指定对象,这样它就不会转到其他对象的 __iter__ 方法(如果已定义)

    因此,在 for i in b 之后,调用对象 b__iter__ 方法,然后调用 __next__ > 方法。 __next__ 方法返回一些内容,它恰好是 i 的值(对于 b 中的 i)

    此外,这里的 Python 不知道它将执行多少次迭代,因为没有为 eq 生成列表 For i in range(5) 生成一个列表[0,1,2,3,4] b 迭代。

    直到引发停止迭代为止。

  2. 在 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/

相关文章:

python - Typing.NamedTuple 和可变默认参数

python - snmp 响应程序安装错误 : ERROR: Could not find a version that satisfies the requirement pysnmp>=5. 0.0(来自 snmpresponder)

python - 如何忽略 Python 中所有潜在的异常?

python - Django REST Framework 中的自定义列表权限

python - 用另一个数据帧的值填充数据帧列

python - 使用 anaconda 5.2 在 pycharm 上安装tensorflow

Python:以全部大写显示输出,每个字符后有一个句点

python-3.x - DataDriver 库方法 _stats_suite 失败 : TypeError: 'encoding' is an invalid keyword argument for this function

python - 如何从 ctypes 使用 IFileOperation

python-2.7 - Tkinter TreeView 选择