6

在记录 Python 函数时,我发现它更像 Pythonic:

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

……而不是……</p>

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

当真i的不需要是一个list. (Foo会很高兴地在 a set,tuple等上操作)问题是生成器。生成器通常只允许 1 次迭代。大多数函数都可以使用只允许单次传递的生成器或迭代器,但有些则不行。

对于那些不能接受只能迭代一次的生成器/事物的函数,是否有一个清晰、一致的 Python 术语来表示“只能迭代多次的事物”?

可迭代迭代器的 Python 词汇表似乎有一个“一次,但如果幸运的话可能更多”的定义。

4

2 回答 2

2

我不知道这个的标准术语,至少不是临时的,但我认为如果你需要一个简短的短语,“可重复使用的迭代”会明白这一点。

在实践中,通常可以构造您的函数,以便您不需要i多次迭代。或者,您可以从可迭代对象中创建一个列表,然后根据需要多次迭代该列表;或者您可以使用itertools.tee获取迭代器的多个独立“副本”。即使您确实需要多次使用它,这也可以让您接受一个生成器。

于 2011-11-29T06:07:48.350 回答
1

这可能更多的是风格和偏好问题,但是......我对我的文档有不同的看法:我总是根据程序上下文中的预期输入来编写文档字符串

示例:如果我编写了一个希望遍历字典键并忽略其值的函数,我将编写:

arg : a dictionary of...

即使for e in arg:可以与其他迭代一起使用。我选择这样做,因为在我的代码上下文中,我不在乎该函数是否仍然有效……我更关心阅读文档的人是否了解该函数的用途

另一方面,如果我正在编写一个可以通过设计处理广泛的可迭代对象的实用函数,我会采用以下两种方式之一:

  1. 记录在特定条件下会引发什么样的异常[例如: “如果可迭代对象不能被多次迭代,则引发 TypeError” ]
  2. 执行一些先发制人的参数处理,使函数与“一次性”可迭代对象兼容。

换句话说,我要么让我的功能足够稳固以处理极端情况,要么对它的局限性直言不讳

再说一遍:您想采用的方法没有问题,但我认为这是“显式优于隐式”的情况之一:提到“可重用可迭代”的文档绝对准确,但形容词很容易被忽视。

于 2011-11-29T06:48:27.823 回答