python拆包——获取列表/元组/字典元素、快速交换变量值

使用拆包提取元素,不需要我们自己动手通过索引从序列中来提取元素,可以减少出错的可能,同时也方便使用。

拆包也可以用来交换变量值,不需要中间变量。

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
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值