python - 在 Python 中读取当前迭代器值而不递增

标签 python iterator python-itertools

我正在编写一个具有两种不同状态(英尺和米之间的可逆单位转换器)的程序,并且程序中的多个函数取决于当前状态(交替 itertools.cycle() 迭代器的当前值)。用户可以调用reverse函数来切换当前状态并反转计算转换函数。

目前,我使用 next(currentstate) 返回迭代器的下一个值,如下所示:

self.currentstate = cycle(range(2))    

def reverse(self):
    if next(self.currentstate) == 0:
        self.feet_label.grid(column=2, row=2, sticky=tk.W)
    if next(self.currentstate) == 1:
        self.feet_label.grid(column=2, row=1, sticky=tk.W)

def calculate(self, *args):
    if next(self.currentstate) == 0:
        # convert feet to meters
    if next(self.currentstate) == 1:
        # convert meters to feet

不幸的是,每当调用函数并计算 if 语句时,循环迭代器都会由下一个运算符递增,并且下一个调用将产生不同的结果。计算函数可能会在同一状态下被多次调用,因此我想要某种方法来检索迭代器的当前值,而无需修改或增加运算符。

def calculate(self, *args):
    if currentvalue(self.currentstate) == 0:
        # convert feet to meters
    if currentvalue(self.currentstate) == 1:
        # convert meters to feet

我发现了一个非常丑陋的解决方法,涉及在每个 if 语句中调用 next(currentvalue) 两次来重置二进制值。这可能是编写这样的两个状态程序的一种非常糟糕的方式,但似乎应该有一种方法可以做到这一点。我对 Python 很陌生,可能还没有完全理解迭代器的底层理论。

谢谢

最佳答案

听起来您不应该在这里使用迭代器。您应该使用必须明确更改状态的东西。将其全部包装在自己的类中可能会更好。

class StateMachine(object):

    STATE_ON = 1
    STATE_OFF = 0  # this could be an enum maybe?

    def __init__(self, starting_state=0):
        self.state = starting_state

    def self.change_state(self):
        if self.state = self.STATE_ON:
            self.state = self.STATE_OFF
        else:
            self.state = self.STATE_ON

现在,无论您在哪里使用状态机,都必须显式更改状态。

statemachine = StateMachine()

def calculate(*args):
    if statemachine.state == statemachine.STATE_ON:
        do_something
    if statemachine.state == statemachine.STATE_OFF:
        do_something_else

def switch_state(*args):
    do_something  # and...
    statemachine.change_state()

关于python - 在 Python 中读取当前迭代器值而不递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32958059/

相关文章:

python - 如何用自然数替换二进制数组中的 1,同时保持 0 的位置?

python - itertools 多个元素的所有可能组合

python - 防止 python 加载 pth 文件

c++ - 在 vector 中查找不相等的相邻索引

C++ STL 列表迭代器

PHP 的迭代器类

python - 如何使用 python itertools.groupby() 按第一个字符对字符串列表进行分组?

Python - 所有组合包括括号

python - 如何找出函数(的源代码)是否包含循环?

python - 在 python 文件之间共享代码