Python:返回元组还是列表?
我有一个返回列表或元组的方法。在参数中表示返回类型的最具Python风格的方式是什么Python:返回元组还是列表?,python,Python,我有一个返回列表或元组的方法。在参数中表示返回类型的最具Python风格的方式是什么 def names(self, section, as_type=()): return type(as_type)(([m[0] for m in self.items(section)])) python的方法是根本不关心类型。返回一个元组,如果调用函数需要一个列表,则让它对结果调用list()。反之亦然,以作为默认类型更有意义的为准 更好的是,让它返回一个生成器表达式: def names(se
def names(self, section, as_type=()):
return type(as_type)(([m[0] for m in self.items(section)]))
python的方法是根本不关心类型。返回一个元组,如果调用函数需要一个列表,则让它对结果调用
list()
。反之亦然,以作为默认类型更有意义的为准
更好的是,让它返回一个生成器表达式:
def names(self, section):
return (m[0] for m in self.items(section))
现在调用者得到了一个惰性计算的iterable。然后,他可以决定对其进行迭代:
for name in obj.names(section):
...
或者从头开始创建一个列表或元组-他从不需要将现有列表更改为元组,反之亦然,因此这在所有情况下都是有效的:
mylist = list(obj.names(section))
mytuple = tuple(obj.names(section))
保持简单:
def names(self, section):
"""Returns a list of names."""
return [m[0] for m in self.items(section)]
如果调用者想要一个元组而不是列表,他会这样做:
names = tuple(obj.names(section))
返回调用方大部分时间想要的任何内容。如果他们希望能够排序、删除或删除项目等,则使用列表。如果他们想将其用作字典键,请使用元组。如果主要用途是迭代,则返回一个迭代器。如果它对调用方不重要(调用方不会比您想象的更频繁),则返回使代码最简单的内容。通常这将是一个列表或迭代器 不要提供将输出转换为给定类型的方法。Python已经有了一个非常简单的方法来实现这一点,任何使用您的函数的程序员都会熟悉它。看看标准Python库。这些例行程序中有这样做的吗?不,因为没有理由这么做
例外:有时有一种方法可以获取迭代器或列表,即使将迭代器转换为列表很容易。通常,此功能作为两个单独的函数或方法提供。有时您可能会想效仿,尤其是如果您可以使用不同的算法实现这两个备选方案,从而为需要其中一个或另一个的调用方提供一些明显的好处。可能最好使用另一种方法来利用生成表达式。是的,返回生成器表达式是一个好主意。我不会称之为“另一种方式”,因为生成器表达式与元组无关,即使它们都使用
()
语法。所以函数names
需要返回调用方在as_type
参数中表示的一种或另一种类型?为什么调用方不能从名称(事实之后)开始强制执行结果?是的,我也想到了这一点。我只想添加一个docstring,记录它返回一个迭代器的事实,并删除as_type
参数。我最终使用了这个解决方案,因为它具有灵活性,不会影响性能(尽管这不太可能会使我的应用程序出现瓶颈)。然而,作为一名初级python程序员,这对我来说有点不寻常。