有没有办法在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
实现这一目标的最佳方法是什么?
由于
答案 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 ...对我而言,感觉还不错,哈哈,