【问题标题】:Difference between different generators, "yield" and returning tuple iteration in a function函数中不同生成器、“yield”和返回元组迭代之间的区别
【发布时间】: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()&lt;genexpr&gt;是什么意思?
  • 哪种方法更适合、更有效地创建生成器?

【问题讨论】:

  • 有趣的问题,但你的问题的标题不太有意义。 (i for i in range(10))generator expression,而不是“元组迭代”。
  • 这能回答你的问题吗? Python: generator expression vs. yield
  • 但是如果你像这样引入tuple(),你就从根本上修改了函数,这样它就不再类似于第一个了。不要纠结于生成器表达式中的圆括号。它们与元组无关。
  • &lt;genexpr&gt; 表示generator expression
  • @Amitai range 只是一个虚拟的可迭代对象。如果你想要更多汁的东西,你可以这样做,例如,math.sqrt(i) for i in range(0, 10)

标签: python python-3.x generator


【解决方案1】:

区别在于定义生成器的位置。 generator1 是一个特殊的生成器函数,因为它包含一个yield 语句。生成器函数总是返回生成器。生成器是在您调用 generator1 时定义的。 generator2 是一个常规函数,它使用生成器表达式构造生成器,然后返回它。生成器是在执行(i for i in range(10)) 行时定义的。但是,如果您添加更多逻辑,generator2 可以返回任何其他内容,例如 None。例如:

def generator2(do_generator):
    if do_generator:
        return (i for i in range(10))
    else:
        return "I quit"

你不能用 generator1 做这样的事情。除了生成器,它不能返回任何东西。

&lt;genexpr&gt;生成器表达式 的缩写。在你的情况下,那是(i for i in range(10))。生成器表达式与列表推导非常相似,但它们生成的是生成器而不是列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 2010-12-14
    相关资源
    最近更新 更多