首页 > Python笔记 阅读数:28

Python return函数返回值详解

前面我们提到,Python 的函数可以利用 return 语句,选择性地返回一个特定值给调用方。如果没有使用 return 语句,系统会自动返回一个默认值 None。

现在我们的需求是,让 Python 函数返回多个值,那么这个需求可以实现吗?其实并不简单——从效果上看,是可以的;从本质上讲,是不行的。

我们先说第一个层面,从效果上看,通过 Python 语法糖的包装,的确可以达到让 return 语句返回多个值的目的,请参考例 1。

【例 1】函数返回多个值(return_n_val.py)
def return_mul_val():
    my_str = "Hello Python"
    num = 20
    return my_str, num       #返回 my_str 和 num 两个值

str_, x = return mul_val()   #用 str_ 和 x 两个变量接收函数返回的两个值
print(str_, x)
程序执行结果为:

Hello Python 20


从形式上看,代码第 04 行的确返回了多个值,而从第 06~07 行的输出效果来看,返回的值也的确被正确解析出来了。但这其实只是一种假象。在本质上,Python 函数返回的仍然是单一值。为什么这么说呢?

在前面的章节中,我们提到,对于元组而言,逗号甚至比那对圆括号更具有身份象征意义。在 Python 语法上,为了书写方便,去掉包裹元素的圆括号而仅保留逗号也能定义一个元组。根据这样的规定,第 04 行返回的实际上是“一个”元组——(my_str, num)。这里描述的重点是量词——一个!

如果细究 Python 语法,可以发现,在代码第 06 行,等号=左边的“str_, x”实际上也被 Python 定义为一个匿名的元组了。这样一来,第 06 行完成的实际上是两个元组之间的赋值。而元组之间的赋值,其实就是按照元素对应(element-wise)位置一一赋值。

第 04 行说的是返回一个元组,实际上,返回的是元组的引用(即它在内存中的编号)。为了方便理解,这里我们把内存编号比作宾馆房间的门牌号。假设现在我们规定,服务员一次性只能处理一个房间号(类似于函数只能返回一个值),而一个房间号通常只对应一个人。于是,我们就可以得出一个“临时性”的结论:服务员一次只能接待一个人。

但如果服务员处理的是总统套房的房间号呢?从表面上来看,服务员还是一次只能处理一个房间号,并没有违反规定,但接收方一旦收到这个总统套房的房间号,就可以按照套房中的内部结构,“按图索骥”,找到套房内各个小房间里的人,从而“间接”达到一次服务多个人的目的,类似于函数可以一次返回多个值。这种打包返回多个值的行为,可称为“集装箱”参数返回。

类似地,我们可以利用函数返回一个列表、一个字典、一个集合等。而列表、字典、集合等都属于复合数据类型,它们内部都可以包含多个元素。如此一来,同样能达到 Python 函数返回多个值的目的。

相关文章