如何以pythonic方式处理交换变量



我经常遇到使用两个变量的情况,其中一个是某物的"当前"值,另一个是"新检索"的值。

在检查相等性(并采取相关操作(后,它们将被交换。然后在循环中重复此操作。

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)):
    ... 

最新更新