2011-11-29 91 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!