第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python - 下一個方法不能與生成器一起正常工作

Python - 下一個方法不能與生成器一起正常工作

呼啦一陣風(fēng) 2023-02-07 13:52:48
我在 python 中創(chuàng)建了一個類,它將代碼流拆分為令牌并逐個令牌推進令牌以與它們一起使用import reclass 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)    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.__iter__())初始化后:text = 'constructor SquareGame03 new()\n\       {let square=square;\n\       let direction=direction;\n\       return square;\n\       }'t = Tokenizer(text)t.split_tokens()t.advance()如果我打印令牌,它似乎有效print(t.current_token, t.next_token)None constructor但是 advance 方法的每一次調(diào)用都會給出這些結(jié)果:t.advance()print(t.current_token, t.next_token)constructor constructort.advance()print(t.current_token, t.next_token)constructor constructor所以它沒有進步,我不明白為什么。
查看完整描述

1 回答

?
慕絲7291255

TA貢獻1859條經(jīng)驗 獲得超6個贊

在這種情況下,.__iter__它被實現(xiàn)為生成器函數(shù)(而不是生成器迭代器),它返回一個生成器迭代器。


每次Tokenizer.advance被調(diào)用時,都會創(chuàng)建一個新的 生成器迭代器并由 返回.__iter__。相反,迭代器應(yīng)該Tokenizer在初始化階段由對象存儲以供所有后續(xù)使用。


例如:


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__魔術(shù)方法和單獨.advance方法的原因。它可能會引起一些混亂。


查看完整回答
反對 回復(fù) 2023-02-07
  • 1 回答
  • 0 關(guān)注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號