2.5 序列解包


  在實際開發中,序列解包是一個非常重要和常用的一個功能,可以使用非常簡潔的形式完成復雜的功能,大幅度提高了代碼的可讀性,並且減少了程序員的代碼輸入量。例如,可以使用序列解包功能對多個變量同時進行賦值,下面都是合法的Python賦值方法。

 1 >>> x,y,z = 1,2,3                      #多個變量同時賦值
 2 >>> 
 3 >>> v = (False,3.5,'exp')  4 >>> 
 5 >>> (x,y,z) = v  6 >>> 
 7 >>> x,y,z = v  8 >>> 
 9 >>> x,y,z = range(3)                   #可以使用range對象進行序列解包
10 >>> 
11 >>> x,y,z = map(str,range(3))          #使用迭代對象進行序列解包

 

  序列解包也可以使用列表和字典,但是對字典使用是,默認是對字典“鍵”進行操作,如果需要對“鍵:值”對進行操作,需要使用字典的item()方法說明,如果需要對字典“值”進行操作,則需要使用字典的values()方法明確指定。下面的代碼演示了列表與字典的序列解包操作:

 1 >>> a = [1,2,3]  2 >>> b,c,d = a                  #列表也支持序列解包的用法
 3 >>> b  4 1
 5 >>> 
 6 >>> x,y,z = sorted([1,3,2])    #sorted()函數返回排序后的列表
 7 >>> 
 8 >>> s = {'a':1,'b':2,'c':3}  9 >>> 
10 >>> b,c,d = s.items() 11 >>> 
12 >>> b           #這里的結果如果和你的不一樣是正常的,因為字典是無序序列
13 ('a', 1) 14 >>> 
15 >>> b,c,d = s   #使用字典就不要考慮元素的順序問題了
16 >>> 
17 >>> b 18 'a'
19 >>> 
20 >>> b,c,d = s.values() 21 >>> 
22 >>> b 23 1
24 >>> 
25 >>> print(b,c,d) 26 1 2 3
27 >>> 

 

  使用序列解包可以很方便地同時遍歷多個序列。

 

 1 >>> keys = ['a','b','c','d']  2 >>> 
 3 >>> values = [1,2,3,4]  4 >>> 
 5 >>> for k,v in zip(keys,values):  6     print(k,v)  7 
 8     
 9 a 1
10 b 2
11 c 3
12 d 4
13 >>> 
14 >>> 
15 >>> #下面代碼演示了對內置函數enumerate()返回的迭代對象進行遍歷時序列解包的用法:
16 >>> 
17 >>> x = ['a','b','c'] 18 >>> 
19 >>> for i,v enumerate(x): 20     
21 SyntaxError: invalid syntax 22 >>> 
23 >>> for i,v in enumerate(x): 24     print('The value on position {0} is {1}'.format(i,v)) 25 
26     
27 The value on position 0 is a 28 The value on position 1 is b 29 The value on position 2 is c 30 >>> 
31 >>> 
32 >>> 
33 >>> #下面對字典的操作也使用到序列解包:
34 >>> s = {'a':1,'b':2,'c':3} 35 >>> 
36 >>> for k,v in s.items():    #字典的每個元素都包含“鍵”和“值”兩部分
37     print(k,v) 38 
39     
40 a 1
41 b 2
42 c 3
43 >>> 
44 >>> 
45 >>> #另外,序列解包還支持下面的用法:
46 >>> 
47 >>> print(*[1,2,3],4,*(5,6)) 48 1 2 3 4 5 6
49 >>>  
50 >>> * range(4),4
51 (0, 1, 2, 3, 4) 52 >>> 
53 >>> 
54 >>> * range(4), 55 (0, 1, 2, 3) 56 >>> 
57 >>> { * range(4),4, * (5,6,7)} 58 {0, 1, 2, 3, 4, 5, 6, 7} 59 >>> 
60 >>> {'x':1,**{'y':2}} 61 {'x': 1, 'y': 2} 62 >>> 

 

  小提示:

    (1)序列解包的有些用法在低版本Python中不支持;

    (2)在調用函數時,在實參前面加上一個星號(*)也可以進行序列解包,從而實現將序列中的元素值依次傳遞給相同數量的形參,詳見3.3節。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM