Loading

Python的解包

元组解包

a, b, c = (1, 2, 3)
# a:1 b:2 c:3

字符串解包

a, b, c = "xyz"
# a:x b:y c:z

字典解包

字典解包后,只会把字典的key取出来,value则丢掉了。

a, b, c = {"a":1, "b":2, "c":3}
# a:'a' b:'b' c:'c'

等号左右元素不等时的解包

在 Python2 中,如果等号左边变量的个数不等于右边可迭代对象中元素的个数,是不允许解包的。但在 Python3 可以这么做了。这个特性可以在 PEP 3132 中看到。

这种语法就是在某个变量面前加一个星号,而且这个星号可以放在任意变量,每个变量都分配一个元素后,剩下的元素都分配给这个带星号的变量。

a, b, *c = [1, 2, 3, 4]
# a:1 b:2 c:[3, 4]

# *号可以在任意位置
a, *b, c = [1, 2, 3, 4]
# a:1 b:[2, 3] c:4

函数调用时的解包

  • 元组,列表,字符串等传入函数时的解包:

    def func(a, b, c):
        print(a, b, c)
    
    func(*[1, 2, 3])
    func(*(1, 2, 3))
    func(*"123")
    # 以上三条语句都等同于
    func(1, 2, 3)
    
  • 字典会以key=value的格式解包传入函数:

    func(**{"a": 1, "b": 2, "c": 3})
    # 等同于
    func(a=1, b=2, c=3)
    

    字典的key必须和形参名保持一致,否则会报错

  • Python3.5开始,在函数调用中可以有任意多个解包操作:

    func(*(1,), *[2], **{"c": 3})
    

表达式中的解包

*range(4), 4
# (0, 1, 2, 3, 4)

[*range(4), 4]
# [0, 1, 2, 3, 4]

{*range(4), 4}
# {0, 1, 2, 3, 4}

{"x": 1, "y": 2, **{"z": 3}}
# {'x': 1, 'y': 2, 'z': 3}

[*[1, 2, 3], *range(4, 8)]
# [1, 2, 3, 4, 5, 6, 7]

a = {"x": 1, "y": 2}
b = {"z": 3}
{**a, **b}
# {'x': 1, 'y': 2, 'z': 3}

总结

  1. 自动解包支持一切可迭代对象。
  2. python3中,支持更高级的解包操作,用星号操作使得等号左边的变量个数可以少于右边迭代对象中元素的个数。
  3. 函数调用时,可以用 * 或者**解包可迭代对象,作为参数传递。
  4. python3.5,函数调用和表达式中可支持更多的解包操作。
posted @ 2021-05-02 14:45  七年i  阅读(371)  评论(0)    收藏  举报