编程语言
首页 > 编程语言> > 【Python入门教程】第58篇 函数进阶之元组解包

【Python入门教程】第58篇 函数进阶之元组解包

作者:互联网

本篇我们介绍如何在 Python 中对元组进行解包(unpack),也就是将元组中的元素赋值给多个不同的变量。

元组回顾

第 29 篇介绍了元组的一些基本概念和操作。实际上,Python 使用逗号(,),而不是括号(())定义元组。例如,以下代码定义了一个包含两个元素的元组:

1,2 

同时,括号可以使得元组更加清晰:

(1, 2)

Python 使用括号创建空元组:

()

另外,我们也可以使用 tuple() 构造函数创建元组。例如:

tuple()

即使元组只包含一个元素,定义时也需要使用逗号。以下示例创建了一个单元素的元组:

1,

它和下面的定义作用相同:

(1, )

注意,下面的代码定义了一个整数,而不是元组:

(1)

元组解包

元组解包就是将元组的元素拆分给不同的变量。例如:

x, y = (1, 2)

等号左边时一个由变量 x 和 y 组成的元组,右边则是由两个整数 1 和 2 组成的元组。表达式的作用就是将右边元组 (1, 2) 的元素分别赋予右边元组 (x, y) 的两个元素。最终,x 的值为 1,y 的值为 2。

以下是另一个示例:

x, y ,z = 10, 20, 30

右边的元组包含三个元素:10、20 以及 30。我们可以查看它的类型:

numbers = 10, 20, 30
print(type(numbers))

输出结果如下:

<class 'tuple'>

在以上示例中,变量 x、y 以及 z 的值分别为 10、20 以及 30。

使用元组解包交换两个变量的值

使用传统方法交换两个变量的值需要定义一个临时变量,例如:

x = 10
y = 20

print(f'x={x}, y={y}')

tmp = x
x = y
y = tmp

print(f'x={x}, y={y}')

输出结果如下:

x=10, y=20
x=20, y=10   

而在 Python,我们可以利用元组解包实现相同的结果:

x = 10
y = 20

print(f'x={x}, y={y}')

x, y = y, x

print(f'x={x}, y={y}')

输出结果如下:

x=10, y=20
x=20, y=10  

下面的语法表示交换变量 x 和 y 的值:

x, y = y, x

在以上表达式中,Python 首先计算右边元组的值,然后将右边的值赋予左边的变量。

伪变量

以下示例对元组进行解包时返回了一个错误:

x, y = 10, 20, 30
ValueError: too many values to unpack (expected 2)

错误的原因是右边的元组包含三个元素,但是左边只有两个变量。

为了解决这个问题,我们可以增加一个变量 _ :

x, y, _ = 10, 20, 30

变量 _ 是 Python 中的一个普通变量,按照习惯,我们称之为伪变量(dummy variable)。

通常,如果我们不在乎变量的值,也不需要使用它的值,可以使用伪变量进行解包。

使用 * 运算符解包

某些情况下,我们并不需要解包元组中的所有元素。例如,我们可能只需要解包前两个元素。这种情况下,可以使用 * 运算符。例如:

r, g, *other = (192, 210, 100, 0.5)

输出结果如下:

192
210
[100, 0.5]

以上示例中,元素 192 被赋予变量 r,元素 210 被赋予变量 g。同时,剩余的元素 100 和 0.5 组成一个列表后被赋予变量 other。

注意,解包操作的左边只能出现一个 * 运算符。以下是一个错误示例:

x, y, *z, *t = (10, 20, 30, '10:30')
SyntaxError: two starred expressions in assignment

在等号右侧使用 * 运算符

Python 允许在等号右边使用 * 运算符。以下是两个元组:

odd_numbers = (1, 3, 5)
even_numbers = (2, 4, 6)

下面的示例使用 * 运算符对这两个元组进行解包并将它们合并成一个新的元组:

numbers = (*odd_numbers, *even_numbers)
print(numbers)

输出结果如下:

(1, 3, 5, 2, 4, 6)

总结

标签:10,20,变量,Python,元素,解包,元组,进阶
来源: https://blog.csdn.net/horses/article/details/122804932