Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:返回元组还是列表?_Python - Fatal编程技术网

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

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

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程序员,这对我来说有点不寻常。