1 回答
TA贡献1859条经验 获得超6个赞
在这种情况下,.__iter__它被实现为生成器函数(而不是生成器迭代器),它返回一个生成器迭代器。
每次Tokenizer.advance被调用时,都会创建一个新的 生成器迭代器并由 返回.__iter__。相反,迭代器应该Tokenizer在初始化阶段由对象存储以供所有后续使用。
例如:
import re
class Tokenizer:
def __init__(self, input_file):
self.in_file = input_file
self.tokens = []
self.current_token = None
self.next_token = None
self.line = 1
def split_tokens(self):
''' Create a list with all the tokens of the input file '''
self.tokens = re.findall("\w+|[{}()\[\].;,+\-*/&|<>=~\n]", self.in_file)
self.iterator = self.__iter__()
def __iter__(self):
for token in self.tokens:
if token != '\n':
yield token
else:
self.line += 1
def advance(self):
self.current_token = self.next_token
self.next_token = next(self.iterator)
另一个可以解释的最小例子:
def fib():
a = 0
b = 1
while True:
yield b
a, b = b, a + b
# 1, 1, 2, ...
fibs = fib()
next(fibs)
next(fibs)
next(fibs)
# 1, 1, 1, ...
next(fib())
next(fib())
next(fib())
顺便说一句,我看不出混合使用.__iter__魔术方法和单独.advance方法的原因。它可能会引起一些混乱。
添加回答
举报
