【Python】 序列解包实例分析

序列解包

任何的可迭代对象(iterable)都可以通过一个简单的赋值语句(或者说序列解包功能)同时赋值给多个变量,但前提是变量个数可可迭代对象中的元素个数要一致,否则会抛出异常。

  • 使用序列解包功能对多个变量同时赋值:
>>>x,y,z=1,2,3
>>>x,y,z=range(3)    #使用range对象进行序列解包
>>>tuple=(1,2,'3')
>>>x,y,z=tuple     #变量与元素个数要一致
>>>x,y,z=map(str,range(3))    #使用可迭代对象进行序列解包
  • 使用序列解包同时遍历多个序列:
>>>keys=['a','b','c']
>>>values=['1','2','3']
>>>for k,v in zip(keys,values):
       print(k,v)
a 1
b 2
c 3
  • 序列解包对字典操作
    序列解包用于操作字典是默认是对字典“键”进行操作,如果需要对“键:值”操作需要用items()方法说明,如果需要对“值”进行操作则需要使用values()方法明确指定。
>>>s={'a':1,'b':2,'c':3}
>>>b,c,d=s.items()   #items()方法明确是对“键:值”操作
>>>print(b)
('a', 1)
  • 在做unpack时候对于想舍弃的值可以将其赋值给用不到的变量(如:“_”)
  • “*表达式” 的应用(可结合用不到的变量滤掉无用的值)
    在可迭代对象元素较多时对于不需要的元素可以解包存入 列表 中赋给*表达式
    *表达式 在序列解包中可以位于开头,中间和结尾,但注意一个序列解包语句中只能有一个 *表达式,否则会抛出如下异常
  File "C:\Users\asus\Desktop\py-script", line 2
    a,*b,*c=s
    ^
SyntaxError: two starred expressions in assignment
#位于结尾
>>>s=[1,2,3,4,5,6,7,8,9]
>>>a,b,*c=s
>>>print(a)
>>>print(b)
>>>print(c)
1
2
[3, 4, 5, 6, 7, 8, 9]
#位于中间
>>>s=[1,2,3,4,5,6,7,8,9]
>>>a,*b,c=s
>>>print(a)
>>>print(b)
>>>print(c)
1
[2, 3, 4, 5, 6, 7, 8]
9
#位于开头
>>>s=[1,2,3,4,5,6,7,8,9]
>>>*a,b,c=s
>>>print(a)
>>>print(b)
>>>print(c)
[1, 2, 3, 4, 5, 6, 7]
8
9

不难发现这种星号加表达式的语法可以很容易实现递归算法(这种星号加表达式的分割用法在算法中用得很多)

>>> items = [1, 10, 7, 4, 5, 9]
>>> def sum(items):
        head, *tail = items
        return head + sum(tail) if tail else head
 
>>> sum(items)
36
  • 另外,序列解包还支持下面的用法:
>>>print(*[1,2,3],4,*(5,6))
1 2 3 4 5 6
>>>print(*range(4),4)
0 1 2 3 4
>>>{*range(4),4,*(5,6,7)}
{1,2,3,4,5,6,7}
>>>{'x':1,**{'y':2}}   #注意是双星号
{'x': 1, 'y': 2}

对于序列解包的这几种用法其实我也不是很明白,找了很久也没找到相关的用法的讲解,就照搬书上的这几种用法了!有看到相关知识点会第一时间在这篇博客更新!有知道的大神麻烦评论区或者私我!谢谢大嘎!

注:部分代码来自清华大学董付国老师编著的《Python可以这样学》,特别感谢!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值