Python迭代器-用于[something]中的i
在以下代码中:Python迭代器-用于[something]中的i,python,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 +=
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 NOTE - It is commented
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 item in b:
print('The {} weighs {} kg'.format(item.name.lower(), item.weight))
因此,我们制作一个Box类型的对象“b”,并向其中添加三项
问题1)对于b中的项意味着什么?它指的是什么?b中有什么?
问题2)假设它指的是我们添加到其中的三个项目。为什么它会在内线循环中继续卡在:
马铃薯重2公斤
不去其他2个元素?(如果我增加,效果很好)
谢谢
问题1)-b中的项目表示什么?它指的是什么?b是什么
这是记录在案的:
len(self.volume)
,因此迭代器总是生成相同的对象,并且永远不会引发StopIteration
编辑
当我们在卷变量中添加项目而不是在“b”中添加项目时,它不应该是“b.volume中的i”吗 好的,将
Box
设置为iterable(和迭代器)的目的实际上是隐藏项的存储方式()-注意客户端代码如何使用Box.add_Item()
,而不是Box.volume.append()
当前的实现是错误的,因为它将.volume
和index
公开为公共API的一部分,而这些API应该受到保护(名称的前缀是一个前导下划线,这是Python对“受保护”属性的约定),而且可能也有点不完整(它至少应该公开一种方法来知道该框是否为空/它包含多少项).我很困惑,为什么你要问b
中项目的是什么意思。你是否实现了\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
和\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuut在框中。当项目添加到b中时,它不应该是b中的i吗?这就是我想问的,b中要迭代的是什么?当我们在体积变量中而不是在“b”中添加项目时,它不应该是“b中的i”吗?