我经常遇到这样的情况:我使用两个变量,其中一个是某个东西的“当前”值,另一个是“新检索的”。
检查相等性(以及采取的相关措施)后,交换它们。然后循环重复。
import time
import random
def get_new():
# the new value is retrieved here, form a service or whatever
vals = [x for x in range(3)]
return random.choice(vals)
current = None
while True:
# get a new value
new = get_new()
if new != current:
print('a change!')
else:
print('no change :(')
current = new
time.sleep(1)
这个解决方案有效,但我觉得这是一种天真的方法,我想我(记得“写pythonic代码”系列会谈)有更好的方法。
处理此类机制的pythonic方法是什么?
答案 0 :(得分:2)
实际上,您所拥有的只是对序列的简单迭代,并且您希望检测从一个项目到下一个项目的更改。首先,定义一个提供get_new
的值的迭代器:
# Each element is a return value of get_new(), until it returns None.
# You can choose a different sentinel value as necessary.
sequence = iter(get_new, None)
然后,获取迭代器的两个副本,一个用作当前值的源,另一个用作新值。
i1, i2 = itertools.tee(sequence)
从其中一个迭代器中抛出第一个值:
next(i2)
最后,迭代两个拉链在一起。把它们放在一起:
current_source, new_source = tee(iter(get_new, None))
next(new_source)
for current, new in zip(current_source, new_source):
if new != current:
...
else:
...
time.sleep(1)
current_source, new_source = tee(iter(get_new, None))
for current, new in zip(cons(None, current_source), new_source)):
...