为了账号安全,请及时绑定邮箱和手机立即绑定

如何从函数返回多个值?

如何从函数返回多个值?

白板的微信 2019-06-21 13:34:10
如何从函数返回多个值?在支持多个值的语言中返回多个值的规范方法通常是块茎.选项:使用元组考虑一下这个微不足道的例子: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 = y2def g(x):   y0 = x + 1   y1 = x * 3   y2 = y0 ** y3  return ReturnValue(y0, y1, y2)在Python中,前两者在管道方面可能非常相似-毕竟{ y0, y1, y2 }最终成为内部的条目__dict__.的.ReturnValue.Python为微小对象提供了另外一个特性,即__slots__属性。该类可表示为:class ReturnValue(object):   __slots__ = ["y0", "y1", "y2"]   def __init__(self, y0, y1, y2):      self.y0 = y0      self.y1 = y1      self.y2 = y2从Python参考手册:这个__slots__声明需要一个实例变量序列,并在每个实例中保留足够的空间来保存每个变量的值。节省空间是因为__dict__不是为每个实例创建的。选项:使用数据集(Python 3.7+)使用Python3.7的新数据类型,返回一个具有自动添加的特殊方法、键入和其他有用工具的类:@dataclassclass Returnvalue:     y0: int     y1: float     y3: intdef 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中列表和元组之间唯一真正的区别是列表是可变,而元组则不是。我个人倾向于继承函数式编程中的约定:对同一类型的任意数量的元素使用列表,对于预定类型的固定数量的元素使用元组。问题在冗长的序言之后,出现了一个不可避免的问题。你认为哪种方法最好?我通常会发现自己选择了字典的路线,因为它所涉及的设置工作较少。然而,从类型的角度来看,您最好选择类路径,因为这可能有助于您避免混淆字典所代表的内容。另一方面,Python社区中有一些人认为隐式接口应优于显式接口。此时,对象的类型实际上与此无关,因为您基本上依赖于这样的约定,即相同的属性总是具有相同的含义。那么,如何在Python中返回多个值呢?
查看完整描述

3 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

对于小型项目,我发现使用元组最容易。当这变得太难管理(而不是以前)时,我开始将事物分组为逻辑结构,但是我认为您建议使用字典和ReturValue对象是错误的(或者过于简单化)。

返回键Y0、y1、y2等键的字典并不比元组具有任何优势。返回一个具有属性.y0、.y1、.y2等属性的ReturValue实例也不会比元组具有任何优势。如果你想得到任何东西,你需要开始命名它,而且你可以使用元组来做这件事:

def getImageData(filename):
  [snip]
  return size, (format, version, compression), (width,height)size, type, dimensions = getImageData(x)

IMHO,除了元组之外,唯一好的技术就是用正确的方法和属性返回真实的对象,就像从re.match()open(file).


查看完整回答
反对 回复 2019-06-21
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

许多答案表明,您需要返回某种类型的集合,如字典或列表。您可以不使用额外的语法,只需写出以逗号分隔的返回值。注意:这在技术上返回一个元组。

def f():
    return True, Falsex, y = f()print(x)print(y)

给予:

TrueFalse


查看完整回答
反对 回复 2019-06-21
  • 3 回答
  • 0 关注
  • 484 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信