读取当前迭代器值而不递增 Python
Reading current iterator value without incrementing in Python
我正在编写一个具有两种不同状态的程序(英尺和米之间的可逆单位转换器),程序中的几个函数取决于当前状态(交替 itertools.cycle() 迭代器的当前值).用户可以调用reverse函数来切换当前状态,反转计算转换函数。
目前,我使用 next(currentstate) 来 return 迭代器的下一个值,如下所示:
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.
中
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()
我正在编写一个具有两种不同状态的程序(英尺和米之间的可逆单位转换器),程序中的几个函数取决于当前状态(交替 itertools.cycle() 迭代器的当前值).用户可以调用reverse函数来切换当前状态,反转计算转换函数。
目前,我使用 next(currentstate) 来 return 迭代器的下一个值,如下所示:
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.
中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()