一、序列解包

Python赋值语句技巧之序列解包(sequence unpacking),是Python语言赋值语句的一种技巧方法,在给多个Python变量命名同时赋值时是很有效率的一种方法。简单说就是通过一条命令把string/list/tuple的元素分别赋值给多个变量。

# string解包;

>>> s = 'Hello'

>>> a, b, c, d, e = s

>>> print(a, b, c, d, e)

H e l l o

# list解包;

>>> user = ['dkey', 22, 170]

>>> name, age, height = user

>>> print(name, age, height)

dkey 22 170

# tuple解包;

>>> user = ('dkey', 22, 170)

>>> name, age, height = user

>>> print(name, age, height)

dkey 22 170

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

# string解包;

>>>s='Hello'

>>>a,b,c,d,e=s

>>>print(a,b,c,d,e)

Hello

# list解包;

>>>user=['dkey',22,170]

>>>name,age,height=user

>>>print(name,age,height)

dkey22170

# tuple解包;

>>>user=('dkey',22,170)

>>>name,age,height=user

>>>print(name,age,height)

dkey22170

这种解包有什么好处呢?可以通过这种拆包把string/list/tuple的数据它的一个位置给它对应出一个属性。可以避免通过索引多次赋值。

解包在循环语句中的使用方法:

>>> user = [('a', 1, 170), ('b', 2, 175)]

>>> for name, age, height in user:

... print(name, age, height)

...

a 1 170

b 2 175

>>> for name, *other in user:

... print(name, *other)

...

a 1 170

b 2 175

1

2

3

4

5

6

7

8

9

10

11

12

>>>user=[('a',1,170),('b',2,175)]

>>>forname,age,heightinuser:

...print(name,age,height)

...

a1170

b2175

>>>forname,*otherinuser:

...print(name,*other)

...

a1170

b2175

不光如此,解包对于获取字典的key和value非常有用,如下:

>>> user = {'name':'dkey', 'age':'25'}

>>> for k, v in user.items():

... print(k, v)

...

age 25

name dkey

1

2

3

4

5

6

>>>user={'name':'dkey','age':'25'}

>>>fork,vinuser.items():

...print(k,v)

...

age25

namedkey

最后,再说一种解包指定元素的方法:

>>> user = ['dkey', 22, 170, 'shanghai']

>>> _, age, _, _ = user

>>> age

22

1

2

3

4

>>>user=['dkey',22,170,'shanghai']

>>>_,age,_,_=user

>>>age

22

二、参数解包

解包除了这个简单应用外,也有一些复杂应用方式,比如使用“*”,“**”进行参数解包。这是Python 3.5添加的新特性(PEP 448),使得*a、**d可以在函数参数之外使用:

>>> print(*range(5))

0 1 2 3 4

>>> lst = [0, 1, 2, 3]

>>> print(*lst)

0 1 2 3

>>> a = *range(3), #这里的逗号不能漏掉

>>> print(a)

(0, 1, 2)

>>> d = {"hello": "world", "python": "rocks"}

>>> print({**d}["python"])

rocks

1

2

3

4

5

6

7

8

9

10

11

12

13

14

>>>print(*range(5))

01234

>>>lst=[0,1,2,3]

>>>print(*lst)

0123

>>>a=*range(3),#这里的逗号不能漏掉

>>>print(a)

(0,1,2)

>>>d={"hello":"world","python":"rocks"}

>>>print({**d}["python"])

rocks

哪里会应用呢?比如说对于user元组,我只想提取它其中的name属性,后面的都不需要,我们可以这么做。

>>> user = ('dkey', 22, 170)

>>> name, *other = user

>>> print(name, *other) #带*号的

dkey 22 170

>>> print(name, other) #不带*号的

dkey [22, 170]

1

2

3

4

5

6

>>>user=('dkey',22,170)

>>>name,*other=user

>>>print(name,*other)#带*号的

dkey22170

>>>print(name,other)#不带*号的

dkey[22,170]

这种“*other”的用法可以在前-中-后任何位置使用。这么做的好处就是,可以不用关心这个list/tuple的元素增多或减少而抛异常,因为按照上面那种使用方法属性跟元素必须一一对应,多或少都会抛异常。

参数解包在函数中使用的比较多,如下:

>>> list = [1,2,3]

>>> def add_fn(a, b, c):

... return a + b + c

...

>>> print(add_fn(*list))

6

1

2

3

4

5

6

>>>list=[1,2,3]

>>>defadd_fn(a,b,c):

...returna+b+c

...

>>>print(add_fn(*list))

6

所谓的解包(Unpacking)实际上可以看做是去掉()的元组或者是去掉{}的字典。这一语法也提供了一个更加 Pythonic 地合并字典的方法:

>>> user = {'name': "Trey", 'website': "http://treyhunner.com"}

>>> defaults = {'name': "Anonymous User", 'page_name': "Profile Page"}

>>> print({**defaults, **user})

{'name': 'Trey', 'page_name': 'Profile Page', 'website': 'http://treyhunner.com'}

1

2

3

4

>>>user={'name':"Trey",'website':"http://treyhunner.com"}

>>>defaults={'name':"Anonymous User",'page_name':"Profile Page"}

>>>print({**defaults,**user})

{'name':'Trey','page_name':'Profile Page','website':'http://treyhunner.com'}

如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。

python unpacking_Python解包(Unpacking)相关推荐

  1. 详解Python序列解包(5)

    如果一个函数需要以多种形式来接收参数,定义时一般把位置参数放在最前面,然后是默认值参数,接下来是一个星号的可变长度参数,最后是两个星号的可变长度参数:调用函数时,一般也按照这个顺序进行参数传递.调用函 ...

  2. Python的解包知识

      在Python中的代码中经常会见到 *args 和 **kwargs.args 是 arguments 的缩写,*args表示位置参数:kwargs 是 keyword arguments 的缩写 ...

  3. python序列解包_python中解包

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 序列解包(sequence unpacking)是python中非常重要和常用的 ...

  4. 详解Python序列解包(4)

    本文主要介绍调用函数传递参数时序列解包的用法.在定义函数时在形参前面加2个星号**表示可变长度参数,可以收集若干关键参数形式的参数传递并存放到一个字典之中.与之相对,如果实参是个字典,可以使用两个星号 ...

  5. 详解Python序列解包(3)

    本文主要介绍调用函数传递参数时序列解包的用法.在调用函数传递参数时,可以在实参序列前加一个星号*进行序列解包,或在实参字典前加两个星号**进行解包,本文介绍第一种用法,第二种用法后面再单独发文介绍. ...

  6. python赋值语句(解包赋值、多目标赋值及共享引用)

    python赋值语句(解包赋值.多目标赋值及共享引用) 序列解包赋值语句,赋值一系列整数给一组变量 red,green,blue=range(3) red,blue #(0, 2) 元组赋值语句在循环 ...

  7. Python * ** 打包解包详解

    里边出现的英文都来自于python官网的开发者指南 本文主要就是介绍*和**对此展开详细介绍. Unpacking is proposed to be allowed inside tuple, li ...

  8. Python * ** 打包解包 详解

    里边出现的英文都来自于python官网的开发者指南1 本文主要就是介绍*和**对此展开详细介绍. Unpacking is proposed to be allowed inside tuple, l ...

  9. python 链式比较 2._特色的Python序列解包、链式赋值、链式比较

    一.序列解包 序列解包(或可迭代对象解包):解包就是从序列中取出其中的元素的过程,将一个序列(或任何可迭代对象)解包,并将得到的值存储到一系列变量中. 一般情况下要解包的序列包含的元素个数必须与你在等 ...

最新文章

  1. matlab神经网络2:数据拟合
  2. 29.C++- 异常处理
  3. c语言无线网络抓包程序,c语言实现抓包
  4. bower——库管理工具
  5. whey some page need header when your fetch that page and some don't need
  6. 关于二进制的起源,莱布尼茨以及中国伏羲八卦图
  7. vue里面使用图片的懒加载
  8. Pycharm:解决点击重运行(Rerun)没有反应
  9. 计算机应用基础网络大学,天津大学网络教育 网上作业 计算机应用基础
  10. Reversing.kr-Ransomware
  11. nvidia旧版驱动_鸡血驱动已发布,可新买的显卡打不上驱动?这事儿别急
  12. cad lisp程序大集_cad lisp程序
  13. ccsa安学网小程序_CCSA安学网安全题库完整
  14. Java二叉树(递归实现)
  15. Ubuntu 的软件管理工具
  16. 一文弄懂JVM内存结构,垃圾回收器和垃圾回收算法
  17. 【2021-03-17】JS逆向之某实时票房榜数据解密
  18. Python 邮件发送之嵌套图片发送附件
  19. oracle 如何按季统计,【统计】Oracle按季度统计(详细)
  20. 小米技术教父离职,雷军武大舍友在小米已所剩无几!

热门文章

  1. vscode的seting配置
  2. line-height 的作用
  3. 日志分析篇---Linux日志分析
  4. 什么是overlay?如何定制overlay?
  5. Anaconda3、TensorFlow和keras简单安装方法(较详细)
  6. 在线JSON转XML工具
  7. 小白兔笑话全集笑死人不偿命(转+转)
  8. 检查内存泄露的利器--VLD使用指南
  9. 行业深耕、教育赋能,讯众股份BPO 华北区Q4启动大会成功召开
  10. GeoHash算法详解