【问题标题】:Python: Return tuple or list?Python:返回元组还是列表?
【发布时间】:2011-11-16 21:38:07
【问题描述】:

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

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

【问题讨论】:

  • 所以函数names 需要返回as_type 参数中调用者所表示的一种或另一种类型?为什么调用者不能从names(事后)开始强制结果?

标签: python


【解决方案1】:

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))

【讨论】:

  • 是的,我也想到了。我只想添加一个文档字符串,记录它返回一个迭代器并删除 as_type 参数的事实。
  • 我最终使用了这个解决方案,因为它的灵活性不会影响性能(尽管这不太可能成为我的应用程序的瓶颈)。然而,作为一个 Python 初学者,这对我来说有点不寻常。
【解决方案2】:

大部分时间返回调用者想要的任何东西。如果他们希望能够对项目进行排序、删除或删除等,请使用列表。如果他们想将其用作字典键,请使用元组。如果主要用途是迭代,则返回一个迭代器。如果它对调用者无关紧要,它不会比你想象的更频繁,然后返回使代码最简单的任何内容。通常这将是一个列表或迭代器。

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

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

【讨论】:

    【解决方案3】:

    保持简单:

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

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

    names = tuple(obj.names(section))
    

    【讨论】:

    • 最好反其道而行之,以利用生成表达式。
    • 是的,返回一个生成器表达式是个好主意。我只是不会将其称为“其他方式”,因为生成器表达式与元组无关,即使它们都使用 () 语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多