编写一行python生成器表达式

时间:2019-06-09 10:44:23

标签: python

我正在尝试编写一个单行Python生成器表达式,该表达式提供无限的1至99之间的奇数随机数流。有人可以帮助我吗?

3 个答案:

答案 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)来更改最小值和最大值。