使用拆包提取元素,不需要我们自己动手通过索引从序列中来提取元素,可以减少出错的可能,同时也方便使用。
拆包也可以用来交换变量值,不需要中间变量。
1. 交换变量值
语法:arg_name_1,arg_name_2 = arg_name_2,arg_name_1
>>> a=1
>>> b=(2,3)
>>> a,b = b,a
>>> a
(2, 3)
>>> b
1
2. 拼接列表/元组与新元素
语法:*'obj: list | tuple', 'element', ...
注意:除待拆包元素外,需要有其他元素,否则会报错
>>> *[1,2,3],4
(1, 2, 3, 4)
>>> *[1,2,3] # 只有一个待拆包列表,会报错
File "<stdin>", line 1
SyntaxError: can't use starred expression here
>>> *[1,2,3],[4] # 待拼接元素可以是任何类型
(1, 2, 3, [4])
>>> *[1,2,3],[4],*(5,6) # 元组和列表拆包语法相似
(1, 2, 3, [4], 5, 6)
3. 拼接字典与新键/值对
语法:{**'obj: dict', ...}
、{**'obj: dict, 'key':'value'}
注意:需要用大括号‘{}’括起来,返回一个字典
>>> {
**{
'a':1, 'b':2} } # 返回的是新字典
{
'a': 1, 'b': 2}
>>> {
**{
'a':1, 'b':2}, 'c':3 } # 使用字典与键/值对,生成一个新字典
{
'a': 1, 'b': 2, 'c': 3}
>>> {
**{
'a':1, 'b':2}, **{
'c':3} } # 也可以用来拼接多个字典
{
'a': 1, 'b': 2, 'c': 3}
>>> **{
'a':1, 'b':2} # 需要用大括号‘{}’括起来
File "<stdin>", line 1
**{
'a':1, 'b':2}
^^
SyntaxError: invalid syntax
>>> {
**{
'a':1, 'b':2}, {
'c':3} } # 待拼接元素必须为键/值对
File "<stdin>", line 1
{
**{
'a':1, 'b':2}, {
'c':3} }
^
SyntaxError: ':' expected after dictionary key
4. 使用列表/元组中的元素对多个变量进行赋值
语法:var_name, ..., *var_list, var_name, ...= 'obj: list | tuple'
注意:‘列表类型变量(*var_list)’最多只能出现一次;对列表/元组长度有要求
>>> a,b,c = [1,2,3] # 批量对变量赋值
>>> f'a:{
a}___a:{
b}___c{
c}'
'a:1___a:2___c3'
>>> a,b,c = [1,2] # 待赋值变量数大于列表长度,会报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 2)
>>> a,b,c = [1,2,3,4] # 待赋值变量数小于列表长度,会报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 3)
>>> *a,b,c = [1,2,3,4] # 优先对变量赋值,其余元素对列表赋值
>>> f'a:{
a}___a:{
b}___c{
c}'
'a:[1, 2]___a:3___c4'
>>> a,*b,c = [1,2,3,4] # 待赋值列表类型变量可以在任何位置
>>> f'a:{
a}___a:{
b}___c{
c}'
'a:1___a:[2, 3]___c4'
>>> *a,b,c = [1,2] # 变量数与列表长度相等时,待赋值列表为空
>>> f'a:{
a}___a:{
b}___c{
c}'
'a:[]___a:1___c2'
>>> *a,b,c = [1] # 待赋值变量数大于列表长度,会报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected at least 2, got 1)
5. 使用元组中的元素生成字符串
语法:'%s%s' % 'obj: tuple'
注意:仅适用于元组类型;元组长度需要与占位符个数相等
>>> '%s_%s_%f' % (1,2,3) # 使用元组内元素生成字符串
'1_2_3.000000'
>>> '%s_%s_%f' % (1,2) # 元组长度需要与占位符个数相等
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string
>>> '%s_%s_%f' % (1,2,3,4) # 元组长度需要与占位符个数相等
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting
>>> '%s_%s_%f' % [1,2,3] # 仅适用于元组类型
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string