【问题标题】:Is a generator the callable? Which is the generator?生成器是可调用的吗?哪个是发电机?
【发布时间】:2014-03-25 18:46:50
【问题描述】:

生成器只是一个函数,它返回一个您可以在其上调用 next 的对象,这样每次调用它都会返回一些值,直到它引发 StopIteration 异常,表明所有值都已生成。这样的对象称为迭代器。

>>> def myGen(n):
...     yield n
...     yield n + 1
... 
>>> g = myGen(6)

我从Understanding Generators in Python?引用了这个

这是我想要弄清楚的:

  1. 哪个是生成器? myGenmyGen(6)?

    根据上面提到的引用,我认为生成器应该是myGen。而myGen(6) 是返回的迭代器对象。但我真的不确定。

  2. 当我尝试这个时:

    >>> type(myGen)
    <type 'function'>
    >>> type(g)         # <1>this is confusing me.
    <type 'generator'>  
    >>> callable(g)     # <2> g is not callable.  
    False               
    >>> callable(myGen)
    True
    >>> g is iter(g)    # <3> so g should an iterable and an iterator 
    True                # at the same time. And it will be passed as an argument
    >>> for i in g:     # to built-in function `next()` in a "for...in..." loop.
            print i     # (is that correct?)
    
    6
    7     
    

所以,根据&lt;1&gt;&lt;2&gt;g 的类型是“生成器”,它是不可调用的。 但是generators are callable, and calling a generator gets you an iterator object 这是怎么回事?

当我在寻找答案时,我遇到了Every time you define a function python creates a callable object.

那么,我可以这样说吗? 当函数myGen 被定义时,myGen 是一个引用可调用对象的名称,该对象是具有__call__ 方法的类的实例。 在这种情况下,myGen 是一个生成器,myGen(6) 是调用myGen 时返回的迭代器。

但是为什么type(g) 会返回&lt;type 'generator'&gt; 呢? 这个返回的iterator 对我来说也很可疑,因为函数中没有return 语句。

这不是Functions always return something (at least None, when no return-statement was reached during execution and the end of the function is reached)吗?

【问题讨论】:

  • +1 写得好。
  • 我相信生成器是一个创建对象的函数。该对象是生成器,该生成器是可迭代的。但是您可以调用动态生成可交互对象的函数,您可以对其进行迭代。

标签: python generator callable


【解决方案1】:

不幸的是,术语令人困惑,因为“生成器”通常用于指代函数或返回的迭代器,很难说一种用法更正确。 documentation of the yield statement

yield 语句仅在定义生成器函数时使用, 并且仅用于生成器函数的主体。使用产量 函数定义中的语句足以导致 定义创建生成器函数而不是普通函数 功能。

当调用生成器函数时,它会返回一个迭代器,称为 生成器迭代器,或更常见的是生成器

original PEP introducing the concept

请注意,当从上下文中明确意图时,未限定名称 “生成器”可用于指代生成器函数或 生成器迭代器

如果要明确区分,函数使用“生成器函数”,迭代器使用“生成器迭代器”。

【讨论】:

    【解决方案2】:

    1) myGen 是在调用时返回生成器对象的函数 - 所以是的,myGen(6) 是生成器对象。

    2) 发电机供电 __iter__next(): docs

    【讨论】:

    • 嗯..我仍然有点困惑为什么亚历克斯说生成器是可调用的。有什么解释吗?
    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    相关资源
    最近更新 更多