【发布时间】:2020-09-18 04:19:19
【问题描述】:
yield i 从迭代 和 return (i for i in range(10)) 之间的正确区别是什么。
def generator1():
for i in range(10):
yield i
def generator2():
return (i for i in range(10))
例如,这些函数generator1() 和generator2() 的写法不同,但都返回一个生成器。
IDLE 的输出:-
>>> generator1()
>>> <generator object generator1 at 0x107870468>
>>> generator2()
>>> <generator object generator2.<locals>.<genexpr> at 0x107870db0>
>>> import sys
>>> sys.getsizeof(generator1())
>>> 88
>>> sys.getsizeof(generator2())
>>> 88
正如我们所知,generator2() 的 LOC(代码行)比 generator2 少,而且对象的大小相同,我有一些问题。
- 这两个函数有什么区别?
- 打印
generator2()时<genexpr>是什么意思? - 哪种方法更适合、更有效地创建生成器?
【问题讨论】:
-
有趣的问题,但你的问题的标题不太有意义。
(i for i in range(10))是 generator expression,而不是“元组迭代”。 -
这能回答你的问题吗? Python: generator expression vs. yield
-
但是如果你像这样引入
tuple(),你就从根本上修改了函数,这样它就不再类似于第一个了。不要纠结于生成器表达式中的圆括号。它们与元组无关。 -
<genexpr>表示generator expression -
@Amitai
range只是一个虚拟的可迭代对象。如果你想要更多汁的东西,你可以这样做,例如,math.sqrt(i) for i in range(0, 10)
标签: python python-3.x generator