在Python中为变量赋值

时间:2014-11-17 21:29:10

标签: python variables conditional-statements generator

有没有办法在Python中为变量赋值?

具体来说,我正在编写一个默认无限的生成器,受限于选择。这段代码有效,但复制很难看:

def generate(start=0, stop=None):
    i = start

    if stop == None:
        while True:
            yield i
            i += 1
    else:
        while i <= stop:
            yield i
            i += 1

具体来说,我想表达这样的话:

def generate(start=0, stop=None):
    i = start

    if stop == None:
        condition = True
    else:
        condition = 'i <= stop' # Of course, this will throw an error

    while condition:
        yield i
        i += 1

实现这一目标的最佳方法是什么?

由于

2 个答案:

答案 0 :(得分:2)

看起来你正在重新实现itertools.count和itertools。

永远永远计算:

itertools.count()

数到最后停止:

itertools.takewhile(lambda a: a <= stop, itertools.count())

但也许这是一个愚蠢的例子,也许使条件成为你正在寻找的答案:

def generate(start=0, stop=None):
    i = start

    if stop == None:
        condition = lambda _: True
    else:
        condition = lambda x: x <= stop

    while condition(i):
        yield i
        i += 1

答案 1 :(得分:0)

 def gener(x):
     for item in range(x):
             if item == 5:
                     raise(StopIteration)
             yield(item)

这是一个不会超过5的生成器的例子。

>>> a = gener(7)
>>> [x for x in a]
>>>
[0, 1, 2, 3, 4]

这是有效的,因为StopIteration是内置异常,当您到达生成器输出的末尾时由生成器对象引发

>>> def gen(): #the most basic generator
...     for item in range(3): yield item
...
>>>
>>> a = gen()
>>> a.next()
0
>>> a.next()
1
>>> a.next()
2
>>> a.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

当它到达终点时,它会自然地提升StopIteration,因为你可以看到......所以如果你想停止迭代那么自己提高......我不确定这是多么pythonic ...对我而言,感觉还不错,哈哈,