如何从一个函数返回多个值?[关闭]

  • 问题:

  • Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.

    Closed 2 years ago.

    在支持它的语言中返回多个值的规范方法通常是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}只是作为返回值的内部dict_u216;code>中的条目

    不过,Python还为微小对象提供了一个附加特性,即插槽特性。类可以表示为:

    class ReturnValue(object):
    __slots__ = ["y0", "y1", "y2"]
    def __init__(self, y0, y1, y2):
    self.y0 = y0
    self.y1 = y1
    self.y2 = y2

    Python Reference Manual公司名称:

    \uuSlots\声明接受一系列实例变量,并在每个实例中保留足够的空间来保存每个变量的值。节省空间是因为没有为每个实例创建\uyu dict_u

    使用Python3.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

    不过,这是我最不喜欢的方法。我想我受到了Haskell的影响,但是混合类型列表的想法一直让我感到不舒服。在这个特定的例子中,列表是-不是-混合类型,但可以想象它可能是

    据我所知,以这种方式使用的列表并不能获得与元组相关的任何信息。Python中列表和元组之间唯一真正的区别是列表是mutable,而元组不是

    我个人倾向于继承函数式编程的惯例:对同一类型的任意数量的元素使用列表,对预定类型的固定数量的元素使用元组

    在冗长的序言之后,是一个不可避免的问题。你认为哪种方法最好?在

  • 答案: