在函数中,return x,y和return (x,y)有什么区别?

3
我正在观看麻省理工学院公开课程中的《计算机科学与Python编程导论》。在介绍元组的第5讲中,教授说“在函数中只允许返回一个对象”,然后她说,元组对于返回多个对象值非常方便(任何想观看此短讲的人可以从06:15分钟开始)。问题是关于麻省理工学院的讲座:
是的,我们可以使用元组来返回和收集一些值。另一方面,Python中的函数已经可以通过用逗号分隔它们来返回多个值。因此,我对讲师所说的感到困惑。用逗号分隔返回2个或更多值是否意味着这些对象成为元组的一项,尽管没有明确声明?我错过了什么?换句话说,用逗号分隔和用括号分隔返回值之间有什么区别,例如x,y(x,y)。您可以使用下面的函数进行解释。谢谢。
def smth(x,y):

   x = y % 2
   y = x % 5

   return x, y

2
在你的例子中,实际上是返回了一个元组。元组的标识特征是逗号,而不是括号。如果你使用 print(type(smth(5,5))) 查看返回值的类型,你会发现它会显示 <class 'tuple'> - Ahmet
这个回答解决了你的问题吗?为什么在变量名后添加尾随逗号会使其成为元组? - kaya3
不是,但是@Ahmet回答了。顺便说一下,谢谢。 - Ender Ayhan
5个回答

3

你的返回语句 return x, y 实际上只是 return (x, y) 的简写。

Python 解释器将两者都解释为相同的含义。

>>> def smth(x,y):
...    x = y%2
...    y = x%2
...    return x,y

>>> smth(1,2)
(0, 0)
>>> type(smth(1,2))
<class 'tuple'>

自动解包参数的方式也是相同的:

a,b = smth(1,2)(a, b) = smth(1,2)是等价的代码。

然而,第一个代码更易读。

关于这两个语句为何相等的具体解释可以在这个类似问题的答案中找到。


2

是的,它们正在变成元组。 如果运行以下代码,您会发现类型为元组。

def smth(x,y):

   x = y % 2
   y = x % 5

   return x, y

x=smth(10,20)
print(x)
print(type(x))

1
你写的函数实际上是返回一个元组。只有空元组需要使用括号。请参见文档中的此部分: 6.2.3. Parenthesized forms

0
通过用逗号分隔它们,可以创建一个元组。但是你不能用这种方式创建一个空的元组,你需要使用括号。
请注意,当您打印一个元组时,无论您是使用括号还是不使用括号创建它,Python 都会将其输出包围在括号中:
>>> mytuple = (1, 2)
>>> print(mytuple)
(1, 2)

>>> mytuple = ()
>>> print(mytuple)
()

>>> mytuple = 1,2
>>> print(mytuple)
(1, 2)

>>> mytuple = 1,
>>> print(mytuple)
(1,)

出于这个原因,我个人更喜欢在大多数地方使用括号,这样更明显和一致。但是,其他人可能会有不同的看法。无论如何,并不总是必需的。
因此,在您的代码中,无论您使用:
return x, y

或者

return (x, y)

...结果是返回一个包含两个元素的元组。

在调用函数时,您可以解包元组或保持不变:

使用解包:

x_value, y_value = smth(x, y)

不解包:

xy_tuple = smth(x, y)

x_value = xy_tuple[0]
y_value = xy_tuple[1]

0
如果您按照您提到的方式定义一个函数,使用

标签。
return x, y

或者

return (x, y)

Python解释器会以相同的方式识别它们

type(smth(21,11))

将会是

<class 'tuple'>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接