2011-11-29 103 views
6

在記錄一個Python函數,我覺得更Python說:Python文檔:多次迭代?

def Foo(i): 
    """i: An interable containing…""" 

...不是...

def Foo(i): 
    """i: A list of …""" 

i真的不需要成爲一個list。 (Foo將愉快地運行在set,tuple等)問題是發電機。生成器通常只允許1次迭代。 大多數函數都可以使用只允許一次傳遞的生成器或迭代器,但有些不是。

對於那些不能接受生成器/只能迭代一次的函數,有沒有一個清晰的,一致的Python術語來說「只能迭代多次的東西」?

Python詞彙表iterableiterator似乎有一個「一次,但如果幸運的話可能更多」的定義。

+1

「集合」?它似乎在這裏描述了所有的示例類型。 – ephemient

+0

對容器的使用+1,似乎以最簡潔的方式捕捉底層的想法,但是......我不認爲我看過任何Python文檔中使用過的「容器」? –

+1

容器是帶有__contains __()方法的對象,對於可重用的迭代既不必要也不足夠。 http://docs.python.org/library/collections.html#collections.Container –

回答

2

我不知道這個標準術語,至少不是非正式的,但我認爲如果您需要一個簡短的短語,「可重複使用的可迭代」會得到滿意的結果。

實際上,通常可以構造函數,以便不需要多次迭代i以上。或者,您可以從迭代器中創建一個列表,然後根據需要多次迭代列表。或者您可以使用itertools.tee來獲取迭代器的多個獨立「副本」。即使您需要多次使用,也可以接受發電機。

+1

請注意,正如[文檔](https://docs.python.org/3/library/itertools.html# itertools.tee),「通常,如果一個迭代器在另一個迭代器啓動之前使用大部分或全部數據,則使用list()而不是tee()會更快。」在這種情況下,'tee()'會複製/存儲內容多次,而'list()'只會存儲一次。 – waterproof

1

這可能更多的是風格和偏好,而不是其他任何東西......我對我的文檔有不同的看法:我總是根據程序上下文中的預期輸入編寫文檔字符串。

例如:如果我寫的期望去了字典的鍵,而忽略它的價值我寫一個函數:

arg : a dictionary of... 

即使for e in arg:將與其他iterables工作。我選擇這樣做,因爲在我的代碼的上下文中,我不在乎功能仍然工作 ...我更關心的是,閱讀文檔的人知道該功能是如何使用意圖使用

在另一方面,如果我寫一個效用函數可以通過設計iterables的廣泛應付,我去的這兩種方法之一:

  1. 文件是什麼樣的異常在一定條件下可以上升[例如:「提升類型錯誤,如果迭代不能被重複多次」]
  2. 執行一些先發制人的論點處理,這將使與功能兼容'一次只能'迭代。

換句話說,我嘗試要麼使我的功能足夠牢固,能夠處理邊緣的情況下,或者是在其侷限性很直率。

再一次:你想採取的方法沒有錯,但我認爲這是「explicit is better than implicit」:其中提到「可重複使用的迭代」的文檔的確切準確的情況之一,但形容詞可以很容易被忽視。

HTH!