python unpacking_Python解包(Unpacking)
一、序列解包
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)相关推荐
- 详解Python序列解包(5)
如果一个函数需要以多种形式来接收参数,定义时一般把位置参数放在最前面,然后是默认值参数,接下来是一个星号的可变长度参数,最后是两个星号的可变长度参数:调用函数时,一般也按照这个顺序进行参数传递.调用函 ...
- Python的解包知识
在Python中的代码中经常会见到 *args 和 **kwargs.args 是 arguments 的缩写,*args表示位置参数:kwargs 是 keyword arguments 的缩写 ...
- python序列解包_python中解包
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 序列解包(sequence unpacking)是python中非常重要和常用的 ...
- 详解Python序列解包(4)
本文主要介绍调用函数传递参数时序列解包的用法.在定义函数时在形参前面加2个星号**表示可变长度参数,可以收集若干关键参数形式的参数传递并存放到一个字典之中.与之相对,如果实参是个字典,可以使用两个星号 ...
- 详解Python序列解包(3)
本文主要介绍调用函数传递参数时序列解包的用法.在调用函数传递参数时,可以在实参序列前加一个星号*进行序列解包,或在实参字典前加两个星号**进行解包,本文介绍第一种用法,第二种用法后面再单独发文介绍. ...
- python赋值语句(解包赋值、多目标赋值及共享引用)
python赋值语句(解包赋值.多目标赋值及共享引用) 序列解包赋值语句,赋值一系列整数给一组变量 red,green,blue=range(3) red,blue #(0, 2) 元组赋值语句在循环 ...
- Python * ** 打包解包详解
里边出现的英文都来自于python官网的开发者指南 本文主要就是介绍*和**对此展开详细介绍. Unpacking is proposed to be allowed inside tuple, li ...
- Python * ** 打包解包 详解
里边出现的英文都来自于python官网的开发者指南1 本文主要就是介绍*和**对此展开详细介绍. Unpacking is proposed to be allowed inside tuple, l ...
- python 链式比较 2._特色的Python序列解包、链式赋值、链式比较
一.序列解包 序列解包(或可迭代对象解包):解包就是从序列中取出其中的元素的过程,将一个序列(或任何可迭代对象)解包,并将得到的值存储到一系列变量中. 一般情况下要解包的序列包含的元素个数必须与你在等 ...
最新文章
- matlab神经网络2:数据拟合
- 29.C++- 异常处理
- c语言无线网络抓包程序,c语言实现抓包
- bower——库管理工具
- whey some page need header when your fetch that page and some don't need
- 关于二进制的起源,莱布尼茨以及中国伏羲八卦图
- vue里面使用图片的懒加载
- Pycharm:解决点击重运行(Rerun)没有反应
- 计算机应用基础网络大学,天津大学网络教育 网上作业 计算机应用基础
- Reversing.kr-Ransomware
- nvidia旧版驱动_鸡血驱动已发布,可新买的显卡打不上驱动?这事儿别急
- cad lisp程序大集_cad lisp程序
- ccsa安学网小程序_CCSA安学网安全题库完整
- Java二叉树(递归实现)
- Ubuntu 的软件管理工具
- 一文弄懂JVM内存结构,垃圾回收器和垃圾回收算法
- 【2021-03-17】JS逆向之某实时票房榜数据解密
- Python 邮件发送之嵌套图片发送附件
- oracle 如何按季统计,【统计】Oracle按季度统计(详细)
- 小米技术教父离职,雷军武大舍友在小米已所剩无几!