【发布时间】:2020-03-10 08:52:24
【问题描述】:
所以我明白,有时不是在一个应该是可迭代的类中定义 iter 和 next 方法,而是使用一个 iter包含 yield 语句的方法就足够了。其实为什么?只是避免样板代码?
但是,我不明白为什么下面的 sn-p 会产生三个迭代
class BoundedRepeater:
def __init__(self, value, max_repeats):
self.value = value
self.max_repeats = max_repeats
self.count = 0
def __iter__(self):
return self
def __next__(self):
if self.count >= self.max_repeats:
raise StopIteration
self.count += 1
return self.value
如果这样调用
for item in BoundedRepeater("Hello", 3):
print(item)
但如果我将方法更改为
类有界中继器: def init(self, value, max_repeats): 自我价值=价值 self.max_repeats = max_repeats self.count = 0
class BoundedRepeater:
def __init__(self, value, max_repeats):
self.value = value
self.max_repeats = max_repeats
self.count = 0
def __iter__(self):
if self.count >= self.max_repeats:
raise StopIteration
self.count += 1
yield self.value
我只得到一个迭代而不是三个
【问题讨论】:
-
第二个代码应该有一个循环:
for _ in range(self.max_repeats): yield self.value。 What's the advantage of using yield in __iter__()?