2014-12-06 62 views
3

所以我需要有2个值来回摆动。 第一次说2,第二次说4。从顶部重复。在Python中的振荡值

所以我写了下面的发电机功能的作品。每次通过next调用它时,都会返回后续值,然后从顶部重复。

为了学习,提高,不是意见,有没有更好的办法?在Python中似乎总有一种更好的方式,我喜欢学习它们以提高我的技能。

“主代码”是只是为了显示发生器,振荡器的例子,在使用中,且不是主要使用的振荡器。

## Main code 
go_Osci = g_Osci() 
for i in xrange(10): 
    print("Value: %i") %(go_Osci.next()) 

## Generator 
def g_Osci(): 
    while True: 
     yield 2 
     yield 4 

回答

7

是的,还有更好的办法。 itertools.cycle是明确设计完成这个任务:

>>> from itertools import cycle 
>>> for i in cycle([2, 4]): 
...  print i 
... 
2 
4 
2 
4 
2 
4 
2 
# Goes on forever 

您还可以使用enumerate只循环一定的次数:

>>> for i, j in enumerate(cycle([2, 4])): 
...  if i == 10: # Only loop 10 times 
...   break 
...  print j 
... 
2 
4 
2 
4 
2 
4 
2 
4 
2 
4 
>>> 
+0

好东西感谢。使用我可以删除我在实际代码中使用的“while循环”。在Python中总是一个更好的方法。 – 2014-12-06 21:00:42

+1

@iCodez也表示他使用枚举并在10 – Hackaholic 2014-12-06 21:06:36

+0

@Hackaholic中断 - 呃,他没有要求这样做,但提及它听起来很不错。 – iCodez 2014-12-06 21:09:01

0

近两年提出这个问题后,我想和大家分享什么我最终想出了适合我的需求。使用内联for循环来循环通过一些交替的值通常太静态和不灵活,我所需要的。

我一直回到我的发生器解决方案,因为它证明在我的应用程序中更加灵活 - 我可以随时随地从我的脚本中调用next()

我然后打在我的发电机使用cycle。在实例开始时,通过使用所需值列表“启动”发生器,我可以在脚本中的任何位置访问需要的交替值。我也可以根据需要用不同的值“填充”更多的实例。

的额外好处是,底层代码被一般化,并且因此能够被视为可导入模块。

我称这种构造为使用发生器产生交替值“振荡器”。

我希望这会对未来的人有好处。

的Python 2.7.10

# Imports # 
from __future__ import print_function 
from itertools import cycle 

    # Generators 
def g_Oscillator(l_Periods): 
"""Takes LIST and primes gen, then yields VALUES from list as each called/next()""" 
g_Result = cycle(l_Periods) 
for value in g_Result: 
    yield value 

    # Main Code 
go_52Oscillator = g_Oscillator([5, 2]) ## Primed Ocscillator 
go_34Oscillator = g_Oscillator([3, 4]) ## Primed Ocscillator 
go_ABCOscillator = g_Oscillator(["A", "B", "C"]) ## Primed Ocscillator 
for i in xrange(5): 
    print(go_34Oscillator.next()) 
print() 

for i in xrange(5): 
    print(go_52Oscillator.next()) 
print() 

for i in xrange(5): 
    print(go_ABCOscillator.next())