在支持它的语言中,返回多个值的规范方法通常是tupling
考虑这个平凡的例子:
def f(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return (y0, y1, y2)
但是,随着返回的值数量的增加,这很快就会出现问题。如果要返回四个或五个值,该怎么办?当然,您可以继续对它们进行元组化,但很容易忘记哪个值在哪里。无论你想在哪里收到它们,把它们拆开也是相当难看的
下一个合乎逻辑的步骤似乎是引入某种“记录符号”。在Python中,实现这一点的明显方法是使用dict
考虑如下:
def g(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return {'y0': y0, 'y1': y1 ,'y2': y2}
(需要明确的是,y0、y1和y2只是作为抽象标识符。正如所指出的,在实践中,您将使用有意义的标识符。)
现在,我们有了一种机制,可以通过它投射出返回对象的特定成员。比如说,
result['y0']
然而,还有另一种选择。我们可以返回一个专门的结构。我已经在Python的上下文中构建了这个框架,但我确信它也适用于其他语言。事实上,如果你在C语言中工作,这很可能是你唯一的选择。下面是:
class ReturnValue:
def __init__(self, y0, y1, y2):
self.y0 = y0
self.y1 = y1
self.y2 = y2
def g(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return ReturnValue(y0, y1, y2)
在Python中,前两个在管道方面可能非常相似-毕竟{ y0, y1, y2 }
只是最终成为ReturnValue
的内部__dict__
中的条目
Python为微小对象提供了一个额外的特性,即__slots__
属性。该类可表示为:
class ReturnValue(object):
__slots__ = ["y0", "y1", "y2"]
def __init__(self, y0, y1, y2):
self.y0 = y0
self.y1 = y1
self.y2 = y2
The
__slots__
declaration takes a sequence of instance variables and reserves just enough space in each instance to hold a value for each variable. Space is saved because__dict__
is not created for each instance.
使用Python 3.7的新数据类,返回一个包含自动添加的特殊方法、键入和其他有用工具的类:
@dataclass
class Returnvalue:
y0: int
y1: float
y3: int
def total_cost(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return ReturnValue(y0, y1, y2)
我忽略的另一个建议来自蜥蜴比尔:
def h(x):
result = [x + 1]
result.append(x * 3)
result.append(y0 ** y3)
return result
这是我最不喜欢的方法。我想我受到了哈斯克尔的影响,但是混合类型列表的想法总是让我感到不舒服。在这个特定的示例中,列表不是混合类型,但可以想象它是混合类型
据我所知,以这种方式使用的列表实际上对元组没有任何好处。Python中列表和元组之间唯一的真正区别是列表是mutable,而元组不是
我个人倾向于继承函数式编程的惯例:对任意数量的相同类型的元素使用列表,对固定数量的预定类型的元素使用元组
在冗长的序言之后,出现了一个不可避免的问题。你认为哪种方法最好
对于小项目,我发现使用元组最简单。当这变得太难管理时(而不是之前),我开始将事情分组到逻辑结构中,但是我认为您建议使用字典和
ReturnValue
对象是错误的(或者过于简单化)返回带有键
"y0"
、"y1"
、"y2"
等的字典与元组相比没有任何优势。返回属性为.y0
、.y1
、.y2
等的ReturnValue
实例也不会比元组有任何优势。如果你想去任何地方,你需要开始命名东西,你也可以用元组来命名:依我看,除了元组之外,唯一好的技术就是用正确的方法和属性返回真实对象,就像从
re.match()
或open(file)
得到的那样许多答案表明您需要返回某种类型的集合,如字典或列表。您可以省去额外的语法,只需写出返回值,以逗号分隔。注意:这在技术上返回一个元组
给出:
相关问题 更多 >
编程相关推荐