【发布时间】:2018-05-02 22:52:41
【问题描述】:
我一直在尝试将此生成器函数转换为生成器表达式,但没有成功。生成器表达式是否可以具有相同的输出?
def gen5(num):
for i in range(num):
yield i *2
yield i *10
yield i *i
g = gen5(4)
list(g)
[0, 0, 0, 2, 10, 1, 4, 20, 4, 6, 30, 9]
我尝试了以下方法,但得到了这个 (None, None, None) 输出。
gen_exp2 = (((yield u*2), (yield u*10) ,(yield u*u)) for u in range(4))
list(gen_exp2)
[0,
0,
0,
(None, None, None),
2,
10,
1,
(None, None, None),
4,
20,
4,
(None, None, None),
6,
30,
9,
(None, None, None)]
我也这样做了,但它提供了 4 个嵌套元组,而不是上面的列表。
gen_exp3 = (((i*2), (i*10), (i*i)) for i in range(4))
list(gen_exp3)
[(0, 0, 0), (2, 10, 1), (4, 20, 4), (6, 30, 9)]
另外,如何向生成器表达式添加参数? 非常感谢。
【问题讨论】:
-
你不需要在生成器表达式中使用
yield语句,用括号括住循环就足够了。 -
这不会像生成器函数那样生成相同的输出。它给出了 4 个元组。
-
您将需要另一个嵌套的 for 循环来“解包”您的元组。
-
(x for i in range(num) for x in (i*2, i*10, i*i))有效,但读起来令人困惑。itertools.chain.from_iterable((i*2, i*10, i*i) for i in range(num))太 -
太棒了。谢谢帕特里克。我想了一会儿,我无法将生成器函数转换为 gen 表达式。
标签: python generator yield generator-expression