壹、星號變量是什麽?最初,星號變量用於函數的參數傳遞。在下面的示例中,單星號表示接收任意數量的非關鍵字參數的位置,這些參數在函數的*b位置轉換為元組,而雙星號表示接收任意數量的關鍵字參數的位置,這些參數在**b位置轉換為字典:
#!/usr/bin/env python
#編碼=utf-8
# -
def one(a,*b):
" "" A是普通傳入參數,*b是非關鍵字星號參數" " "
打印(b)
壹(1,2,3,4,5,6)
# -
def二(a=1,**b):
" "" A是普通關鍵字參數,**b是關鍵字雙星號參數" " "
打印(b)
兩個(a = 1,b = 2,c = 3,d = 4,e = 5,f = 6) #程序輸出。
(2, 3, 4, 5, 6)
{'b': 2,' c': 3,' e': 5,' f': 6,' d': 4} #從輸出中可以看到,在第壹個函數中,可以在*b的位置傳入任意數量的不帶關鍵字的參數,而*b會將這些傳入的參數轉換成壹個元組,並進行下面的調用。
壹(1,2,3,4,5,6)
#傳入壹個(a,*b)後,相當於
壹(1,(2,3,4,5,6))
#在第二個函數中,**b的位置可以接收任意數量的關鍵字參數,進行如下調用。
兩個(a=1,b=2,c=3,d=4,e=5,f=6)
#傳入壹個(a,*b)後,相當於
兩個(a=1,{'b': 2,' c': 3,' e': 5,' f': 6,' d': 4})
了解了單星號和雙星號的基本用法後,我們再來看看它們的引申用法。
二、單星號變量實例單星號變量不僅可以用在函數的參數傳遞中,實際上壹個普通變量也可以通過使用單星號前綴拆分成單個元素。請看下面的例子:
#!/usr/bin/env python
#編碼=utf-8
# -
定義壹個(*x):
" ""輸出傳入的第壹個參數" " "
打印(x[0])
# -
lst=["a "," b "," c "," d"]
stri="www.pythontab.com "
壹(stri,lst)
壹個(*lst)
壹個(*stri)#程序輸出
www.pythontab.com
a
W#第壹次調用one(stri,lst),代入one(*x)後,相當於。
壹個((["a "," b "," c "," d"]," www.pythontab.com)))
#第二次調用one(*lst),代入one(*x)等價於。
壹(“a”、“b”、“c”、“d”))
#第三次調用one(*stri),代入one(*x)等價於。
壹((“w”、“w”、“w”、“w”、“w”等)。、“q”、“I”、“n”、“g”、“s”、“w”、“o”、“r”、“d”、“g”等。”、“c”、“o”、“m”))
#如果變量前面用了單個星號,實際上是對變量的反匯編操作。變量中的單個元素被分解,然後依次傳遞給one()函數。在傳入one()函數後,one()函數會將這些傳入的單個元素保存為壹個tuple,這就是為什麽我們可以提取print(x[0])中的第壹個元素。
為了驗證這壹點,我們將one()函數修改如下:
#!/usr/bin/env python
#編碼=utf-8
# -
定義壹個(*x):
" ""錯誤實例,試圖修改傳入的第壹個參數值,引發異常" " "
打印(x[0])
x[0]="pythontab "
lst=["a "," b "," c "," d"]
壹(*lst)#我們知道列表是可以改變的。我們拆分列表並將其傳遞給one()函數,嘗試更改函數內部第壹個元素的值。結果,我們觸發了壹個“TypeError”異常。妳可以自己試試。產生這種結果的原因已經在上面解釋過了。不管傳入參數的原始類型是什麽,one(*x)在*x位置接收到這些傳入參數後,
讓我們再看幾個例子:
#!/usr/bin/env python
#編碼=utf-8
# -
定義壹個(*x):
" ""打印出傳入的參數" " "
對於x中的a:
打印(壹份)
lst=["abc ",123," www.pythontab.com"]
stri="abcd "
dect={1:"壹",2:"二",3:"三" }
壹個(*lst)
壹個(*stri)
壹個(*dect)#程序輸出
字母表
123
www.pythontab.com
a
b
c
d
1
2
3#的前兩個調用很好理解。最後,我們傳入了壹個dictionary元素,發現只輸出了dictionary元素的鍵,但不包含值。事實上,單個星號無法讀取字典中的值,只會讀取字典中的鍵。如果要讀取字典中的值,需要使用雙星號。
三、雙星號變量示例在第2節的最後,我們拆分了壹個只有壹個星號的字典,並將其傳遞給函數,但只獲得了字典的鍵。下面演示了如何使用雙星號來獲取字典的值:
#!/usr/bin/env python
#編碼=utf-8
# -
定義壹個(**x):
" ""將傳入的關鍵字參數值保存為輸出元組" " "
打印(x)
b=()
對於x.keys()中的:
b+=(x[a],)
打印(b)
dect={ "壹":1,"二":2,"三":3}
壹個(**dect)#程序輸出
{ '三':3,'壹':1,'二':2}
(3,1,2)#對字典使用雙星前綴相當於將其拆分為關鍵字參數,**dect相當於將字典拆分為以下內容。
壹=1,二=2,三=3
#把這些關鍵字參數傳成壹個(**x),相當於(還記得我前面說的,雙星把它收到的所有關鍵字參數都存成字典了)。
壹個({ "壹":1,"二":2,"三":3})
#既然是字典,字典裏的所有方法都可以用。用壹個for循環遍歷字典的鍵,然後用壹個tuple把這些鍵對應的值相加,最後打印出這個tuple。
Ps:註意,使用該方法將字典傳入函數時,字典的鍵的命名要符合python變量的命名規則。通過上面的分析,不難看出,雙星號首先會將字典轉換成關鍵字參數的形式,相當於將字典中的關鍵字作為變量名。如果鍵不符合變量的命名規則,將拋出“TypeError”異常。妳可以試著把上面字典裏的鍵和值反過來,用數字當鍵,看看會發生什麽。
當“非關鍵字參數(位置參數)”和“關鍵字參數”同時出現在函數的接收參數中時,可以使用單個星號來分隔這兩個參數,例如:
#!/usr/bin/env python
#編碼=utf-8
# -
定義混合(a,b,*,x,y):
" ""位置參數與關鍵字參數混合" " "
返回a,b,x,y
星號前面的# A和B是位置參數,星號後面的X和Y是關鍵字參數。調用mix()函數傳入參數時,關鍵字參數必須以“變量名=值”的形式傳入數據。如果數據作為位置參數傳入,將引發TypeError異常。
Print(mix(1,2,x=3,y=4))#程序輸出
(1,2,3,4)#在上面的mix函數中,如果position參數和keyword參數之間已經有壹個單獨的星號position參數,那麽這個參數後面的所有參數都是keyword參數,不需要用星號來分隔。舉個例子,
#!/usr/bin/env python
#編碼=utf-8
# -
定義混合(a,b,*c,x,y):
" ""位置參數與關鍵字參數混合" " "
返回a,b,c,x,y
#您可以在* c的位置輸入任意數量的位置參數值
Print (mix (1,2,3,4,5,x = 6,y = 7)) #程序輸出
(1,2,(3,4,5),6,7)如果我們要在壹個函數中包含各種參數的組合,就必須遵循這個順序:位置參數(必選參數)、默認參數、單星參數或星號分隔符、關鍵字參數、雙星參數;
請看下面的例子:
#!/usr/bin/env python
#編碼=utf-8
# -
定義混合(a,b=0,*c,x,**y):
" ""位置參數與關鍵字參數混合" " "
返回a,b,c,x,y
Print (mix (1,2,3,4,5,x = 6,y = 7,z = 8)) #程序輸出
(1,2,(3,4,5),6,{'y': 7,' z': 8})