我经常遇到使用两个变量的情况,其中一个是某物的"当前"值,另一个是"新检索"的值。
在检查相等性(并采取相关操作(后,它们将被交换。然后在循环中重复此操作。
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方法是什么?
实际上,您所拥有的只是对序列的简单迭代,并且您希望检测从一个项目到下一个项目的变化。首先,定义一个迭代器,它提供来自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)
使用itertoolz.cons
:
current_source, new_source = tee(iter(get_new, None))
for current, new in zip(cons(None, current_source), new_source)):
...