如何为从 1 到 99 的无限奇数流编写单行生成器表达式



>我正在尝试编写一个单行 Python 生成器表达式,该表达式提供 1 到 99 之间的无限奇数随机数流(包括 1 和 99(。

谁能帮我?

import random as rdm
g = (1+2*rdm.randint(0, 49) for r in iter(int, 1))

rdm.randint(0, 49) 给你一个介于 0 和 49 之间的随机 int。所以(1+2*rdm.randint(0, 49)给你一个介于 1 和 99 之间的随机数奇数。

iter(int, 1)是一个无限迭代器(始终为 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(不带迭代工具(:

from random import randint
for val in (i for i in iter(lambda: randint(1, 99), 0) if i % 2 != 0):
    print(val)

这样做:(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)一起去吧。
通过更改(1,99)来更改最小值和最大值。
真正的1行!可以更改最小值和最大值!

 ====
======= 添加 ===========

上面的版本不是一个严格的生成器 - 它是另一个类。 版本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)来更改最小值和最大值。

最新更新