如何以 pythonic 方式处理交换变量?
How to handle swapping variables in a pythonic way?
我经常遇到使用两个变量的情况,其中一个是某物的 "current" 值,另一个是 "newly retrieved" 一个。
检查相等性(并采取相关操作)后,它们被交换。然后循环重复。
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)
这个解决方案有效,但我觉得这是一种幼稚的方法,我想我记得(对于 "write pythonic code" 系列会谈)还有更好的方法。
处理这种机制的 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)
current_source, new_source = tee(iter(get_new, None))
for current, new in zip(cons(None, current_source), new_source)):
...
我经常遇到使用两个变量的情况,其中一个是某物的 "current" 值,另一个是 "newly retrieved" 一个。
检查相等性(并采取相关操作)后,它们被交换。然后循环重复。
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)
这个解决方案有效,但我觉得这是一种幼稚的方法,我想我记得(对于 "write pythonic code" 系列会谈)还有更好的方法。
处理这种机制的 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)
current_source, new_source = tee(iter(get_new, None))
for current, new in zip(cons(None, current_source), new_source)):
...