Python:返回元组或列表?

时间:2011-11-16 21:38:08

标签: python

我有一个返回列表或元组的方法。在参数中表示返回类型的最pythonic方式是什么?

def names(self, section, as_type=()):
    return type(as_type)(([m[0] for m in self.items(section)]))

3 个答案:

答案 0 :(得分:27)

pythonic方式根本不关心类型。返回一个元组,如果调用函数需要一个列表,那么让它在结果上调用list()。反之亦然,以默认类型为准。

更好的是,让它返回一个生成器表达式:

def names(self, section):
    return (m[0] for m in self.items(section))

现在调用者得到一个懒惰评估的迭代。然后他可以决定迭代它:

for name in obj.names(section):
    ...

或从中创建一个列表或元组从头开始 - 他永远不必将现有列表更改为元组,反之亦然,因此这在所有情况下都是有效的:

mylist = list(obj.names(section))
mytuple = tuple(obj.names(section))

答案 1 :(得分:6)

保持简单:

def names(self, section):
    """Returns a list of names."""
    return [m[0] for m in self.items(section)]

如果调用者想要一个元组而不是列表,他会这样做:

names = tuple(obj.names(section))

答案 2 :(得分:3)

在大多数情况下返回调用者想要的任何内容。如果他们希望能够排序,删除或删除项目等,则使用列表。如果他们想将它用作字典键,请使用元组。如果主要用途是迭代,则返回迭代器。如果它对调用者来说无关紧要,那么它不会比你想象的更频繁,那么返回任何使代码最直接的东西。通常这将是一个列表或迭代器。

不要提供自己的方式将输出转换为给定类型。 Python有一个非常简单的方法可以做到这一点,任何使用你的函数的程序员都会熟悉它。看看标准的Python库。这些例程中的任何一个都这样做吗?不,因为没有理由。

异常:有时候有一种获取迭代器或列表的方法,即使将迭代器转换为列表也很容易。通常,此功能作为两个单独的功能或方法提供。 也许你有时可能想要效仿,特别是如果你能够使用不同的算法实现这两种选择,这些算法可以为想要一个或另一个的呼叫者提供一些明显的好处。