ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python的解包

2021-05-02 15:01:32  阅读:158  来源: 互联网

标签:迭代 Python 函数调用 range 解包 func 字典


元组解包

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,函数调用和表达式中可支持更多的解包操作。

标签:迭代,Python,函数调用,range,解包,func,字典
来源: https://www.cnblogs.com/fade-color/p/14725698.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有