簡體   English   中英

發電機是否可以調用? 哪個是發電機?

[英]Is a generator the callable? Which is the generator?

生成器只是一個函數,它返回一個可以在其上調用的對象,這樣每次調用它都會返回一些值,直到它引發一個StopIteration異常,表示已生成所有值。 這樣的對象稱為迭代器。

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

我從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 

因此,根據<1><2>g的類型是'generator',它不可調用。 但是生成器是可調用的,調用生成器會獲得一個迭代器對象這里發生了什么?

當我在尋找答案時,我會遇到每次定義函數時python都會創建一個可調用對象。

那么,我可以這樣說嗎? 當定義函數myGen時, myGen是一個引用可調用對象的名稱,該對象是具有__call__方法的類的實例 在這種情況下, myGen是一個生成器, myGen(6)是調用myGen時返回的迭代器。

但是為什么type(g)返回<type 'generator'>呢? 這個返回的iterator對我來說也很可疑,因為函數中沒有return語句。

是不是函數總是返回一些東西(至少是None ,當在執行期間沒有達到return語句並且到達函數結束時)

不幸的是,術語令人困惑,因為“生成器”通常用於指代函數或返回的迭代器,很難說一個用法更正確。 屈服聲明文件

yield語句僅在定義生成器函數時使用 ,並且僅在生成器函數的主體中使用。 在函數定義中使用yield語句足以使該定義創建生成器函數而不是正常函數。

當調用生成器函數時,它返回一個稱為生成器迭代器的迭代器 ,或者更常見的是生成器

最初的PEP介紹了這個概念

注意,當從上下文中清楚意圖時,非限定名稱“generator”可用於指代生成器函數或生成器迭代器

如果要明確區分,請對函數使用“generator function”,對迭代器使用“generator iterator”。

1) myGen是一個函數,當被調用時返回一個生成器對象 - 所以是的, myGen(6)是一個生成器對象。

2)生成器提供__iter__next()docs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM