python return多个值_python – 如何从函数中返回多个值?

在支持它的语言中返回多个值的规范方法通常是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__中的条目.

虽然对于微小的对象__slots__属性,但Python提供了一个附加功能.该课程可表示为:

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.

选项:使用dataclass(Python 3.7)

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

这是我最不喜欢的方法.我想我已经被Haskell暴露了,但混合型列表的想法一直让我觉得不舒服.在这个特定的例子中,列表是-not-混合类型,但可以想象它可以.

就我所知,以这种方式使用的列表实际上并没有获得关于元组的任何信息. Python中列表和元组之间唯一真正的区别是列表是mutable,而元组则不是.

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

在冗长的序言之后,出现了不可避免的问题.你觉得哪种方法最好?

我通常发现自己去了字典路线,因为它涉及较少的设置工作.但是,从类型的角度来看,你可能最好不要走类路线,因为这可以帮助你避免混淆字典所代表的内容.

那么,你如何在Python中返回多个值?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值