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

时间:2018-04-19 15:41:25

标签: python python-3.x loops infinite-loop

我经常遇到这样的情况:我使用两个变量,其中一个是某个东西的“当前”值,另一个是“新检索的”。

检查相等性(以及采取的相关措施)后,交换它们。然后循环重复。

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方法是什么?

1 个答案:

答案 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)

使用itertoolz.cons

current_source, new_source = tee(iter(get_new, None))
for current, new in zip(cons(None, current_source), new_source)):
    ...