我正在尝试编写一个单行Python生成器表达式,该表达式提供无限的1至99之间的奇数随机数流。有人可以帮助我吗?
答案 0 :(得分:0)
您可以使用itertools.count()
进行无限循环,并使用itertools.filterfalse
过滤不需要的值:
from random import randint
from itertools import count, filterfalse
f = filterfalse(lambda i: i % 2 == 0, [(yield randint(1, 99)) for i in count()])
for i in f:
print(i)
打印:
...
61
21
91
77
39
... and so on
版本2 (不带itertools):
from random import randint
for val in (i for i in iter(lambda: randint(1, 99), 0) if i % 2 != 0):
print(val)
答案 1 :(得分:0)
import random as rdm
g = (1+2*rdm.randint(0, 49) for r in iter(int, 1))
rdm.randint(0, 49)
为您提供0到49之间的随机整数。因此(1+2*rdm.randint(0, 49)
为您提供1到99之间的随机数字奇数。
iter(int, 1)
是一个无限迭代器(始终为0,仅用于保持生成器运行)。
答案 2 :(得分:-1)
执行此操作:(Python 3)
stream = (lambda min_, max_: type("randint_stream", (), {'__next__': (lambda self: 1+2*__import__('random').randint(min_-1,max_//2))}))(1,99)()
使用next(stream)
获取randint。
通过更改(1,99)
来更改最小值和最大值。
实1线!可以更改最小和最大!
=========== Adding ===========
以上版本不是严格的生成器,而是另一类。版本2:
stream = (lambda min_, max_: (1+2*__import__('random').randint(min_-1,max_//2) for x in iter(int, 1)))(1,99)
使用next()
获取随机奇数。
通过更改(1,99)
来更改最小值和最大值。