程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python 星號的妙用 —— 靈活的序列解包

編輯:Python

活動地址:CSDN21天學習挑戰賽


        星號,就是( * ),在 Python 裡面是乘法的意思就不用我多說了,但除此之外,它還有其它含義,今天要講的就是靈活的序列解包(不是一般的序列解包哦)

序列解包

含義

在 Python 裡面,有許多數據結構能被稱為序列,如字符串、列表、元組和字典,它們的解包的方式不完全相同但也差不多。那什麼是序列解包呢?一個序列包含多個元素,它們作為一個序列是一個整體,而解包就是要把它們分開(不一定是完全分開)。在 Python 裡面解包後產生的數據結構默認為列表,可以把大的列表解包成小的列表,元組和字典也差不多。

實現方式

【完全序列解包】

解包有兩種方式,一種是完全解包,將序列完全拆成一個一個的元素,這在函數裡面會見到

溫馨提示:Python裡多個值並列放在一起用逗號隔開,實際是形成了一個元組

def function(a,b):
return a,b#此處返回的實際為元組
print(type(function(1,2)))
#輸出:<class 'tuple'>
c,d = function(1,2)#等價於 c,d = (1,2) 也等價於 c,d = 1,2
print(c,d)
#輸出:1,2

元組 (1,2) 被完全拆開成了兩個元素,按順序分別賦值給了變量 c 和 d,這就是我們一般的賦值時也會用到的操作 —— 一般的序列解包

這種完全解包的方式是在賦值的時候才會出現,還有一種就是在序列前面加上星號,在我們函數調用參數的時候會用到,在輸出值的時候(print)也可以用的,而且,這樣很秀!

函數調用參數,就是可變參數,如下

def function(*args):
print(type(args))
#輸出:<class 'tuple'>
print(args)
#輸出:(1, 2, 3)
function(1,2,3)#1,2,3變成了元組傳入到了函數裡

還有一種超級帥的操作,輸出值時利用序列解包!

給定一個列表 lis = [1,2,3,4,5] ,要輸出 1 2 3 4 5,你們一般可能會像下面這樣做

lis = [1,2,3,4,5]
for i in lis:
print(i,end=' ')
#輸出:1 2 3 4 5

有人會說,哇塞!你居然還知道 print 函數的 end 參數等的用法诶!牛啊!

然鵝 ......,“你見過一套從天而降的掌法嗎???” 下面的操作帥爆了!

lis = [1,2,3,4,5]
print(*lis)#等價於print(1,2,3,4,5) sep參數默認為一個空格
#輸出:1 2 3 4 5

想必上面的方法大多數人沒見過吧!操作簡潔,這才是 Python 應該有的風格! 

這裡解釋一下,實際上把一個星號加在列表或者元組前面,就是完全解包了!會將序列拆散成一個一個的元素,而 print 函數有兩個默認的參數,一個是 end 參數,還有一個是 sep 參數。這裡利用了 sep 參數的默認值(默認為一個空格),表示每個元素之間間隔的值,end 參數的值表示在輸出的末尾的值(默認為一個換行符,所以 print 後會自動換行)

【不完全序列解包】

先來看段代碼

a,*b = 1,2,3
print(a,b)
#輸出:1 [2, 3]

在賦值的時候,未加星號的變量所獲得的值只能是一個整體,即,要麼是序列的一個元素,要麼是整個序列。而有星號的變量可以獲得部分的序列!前面說過了,解包後以列表形式呈現,所以這裡 b 是一個列表(盡管 1, 2, 3 是元組形式)

a,*b,c = 1,2,3,4
print(a,b,c)
#輸出:1 [2, 3] 4

上面的這段代碼應該就不難理解了,不過一個賦值語句裡面不可以出現多個這樣帶星號的變量,因為 Python 解釋器會無法進行合理的元素分配,沒有確切的分配規則了。以上的這種方法對列表、元組、字符串有效

特殊說明

【字典序列解包】

字典的解包較為特殊,是用兩個星號進行操作的 

在函數調用裡面,有一個雙星號的可變參數,它相比於單星號的可變參數,就高級多了

字典的鍵化為函數的參數,字典鍵對應的值就化為參數的值,可以直接調用,傳參時以字典形式作為一個整體進行傳遞,而單星號的是作為元組進行傳遞的

def function(**kwargs):
print(type(kwargs))
#輸出:<class 'dict'>
print(kwargs['a'])
#輸出:1
function(a=1,b=2)

【字符串特殊操作】

先來看段不為人知的代碼

string = '12345'
lis = []
lis += string#等價於 lis = list(string)
print(lis)
#輸出:['1', '2', '3', '4', '5']

這個不能算是序列解包,但是它很有用,可以將字符串分解為一個字符列表,方便我們快速對其進行修改(如特定位置增加元素,特定位置刪減元素),對字符串而言,有些操作是很麻煩的(因為其本身無法修改)

本來呢,加法賦值運算符是對同類型而言的數據才有效,但字符串對列表進行這樣的操作時,字符串卻會成為單個單個的元素,然後被添加到列表中,這等價於用 list 函數,這或許就是 Python 的智能之處吧!

經典案例

輸出以下內容(提示:序列解包的循環使用)

A ['B', 'C', 'D', 'E', 'F', 'G', 'H']
B ['C', 'D', 'E', 'F', 'G', 'H']
C ['D', 'E', 'F', 'G', 'H']
D ['E', 'F', 'G', 'H']
E ['F', 'G', 'H']
F ['G', 'H']
G ['H']
H []
string = 'ABCDEFGH' #字符串
while string: #當string不為空字符串時
x, *string = string #循環序列解包
print(x, string) #輸出

【都看到這裡了,不如點個贊吧!】


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved