Python中的振荡值

时间:2014-12-06 20:56:24

标签: python python-2.7 cycle

所以我需要来回振动2个值。 第一次说2,第二次说4。从顶部重复。

所以我编写了下面的生成器函数。每次通过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

2 个答案:

答案 0 :(得分: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
>>>

答案 1 :(得分: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())