Python中參數前加星號的用法


 

剛開始折騰Python,今天發現了一個很奇怪的錯誤。

def accept(*s):
 
    print(sum(s))
 
list = (0, 1, 2, 3, 7.5)
 
print(sum(list))
 
accept(list)

  

 

這段代碼會報錯:TypeError: unsupported operand type(s) for +=: 'int' and 'tuple',在函數中產生了int

與tuple相加的情況。但是函數外的sum(list)輸出結果是正常的。

我們print(type(s)),得到的結果:<class 'tuple'>。既然s也是元組,為什么會產生這樣的結果呢?我們

分別打印一下s與list,輸出是這樣的:

(0, 1, 2, 3, 7.5)((0, 1, 2, 3, 7.5),)

從這結果可以看到,將list直接傳入accept函數,效果並不是像我們期望的那樣將s賦值為list再進行操作,

而是將整個list元組作為s的第一個元素,因此s是一個元組的元組。

那么有沒有辦法將list的元素分別傳遞進去呢?當然是有的,使用 ‘*’ 操作符。

我們將代碼稍微更改成這樣:

 

def accept(*s):
 
    print(sum(s))
 
list = (0, 1, 2, 3, 7.5)
 
print(sum(list))
 
accept(*list)  ########加了星號

  

輸出結果:

 

13.5

13.5

這樣就正常了。

‘*’ 操作符的作用是將元組“解包”,則accept(*list)等價於accept(0, 1, 2, 3, 7.5)。而對於關鍵字參數,

需要用兩個星號,即‘**’來解包。例如:

 

def accept(**s):
 
    print(s)
 
list = {'a': 0, 'b': 1, 'c': 2}
 
print(list)
 
accept(**list)   #####加兩個星號

  

其中accept(**list)等價於accpet(a=0, b=1, c=2)。

 

 

來總結一下:

1、函數聲明的參數列表中加單星號,即f(*x)則表示x為元組,所有對x的操作都應將x視為元組類型

進行。所有傳入f(*x)的變量都將作為元組x的元素之一。

2、雙星號同上,區別是x視為字典。

3、在變量前加單星號表示將元組(列表、集合)拆分為單個元素。

4、雙星號同上,區別是目標為字典,字典前加單星號的話可以得到“鍵”。

 

更詳細的信息可以參考:

知乎:元組的reference前加個星號是什么意思?

StackOverFlow:Python: Once and for all. What does the Star operator mean in Python? [duplicate]

 

 

著作權歸作者所有。
商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
作者:鄭誠
鏈接:https://www.zhihu.com/question/20801578/answer/16226750
來源:知乎

咱們先搞定星號參數的含義以及2個例子:

在參數名之前使用1個星號,就是讓函數接受任意多的位置參數。
2個星號就是接受任意多的關鍵字參數。


位置參數的舉例:
假設你有這么個需求:  把某函數接收到的除了第一個參數之外的所有參數輸出。




關鍵字參數的舉例:
不管你傳入多少個關鍵字參數, 我都能在kw里找到.




接着來搞定這個類似於你在問題中的補充資料中的例子:


下面這個例子接受任意多的位置參數, 只輸出第一個

(這里的 s 的類型是元組)


咱們定義一個新元組,待會扔給mean函數。



2種用法的區別:


可以看出,用了星號之后,就把元組 a 給解包(unpack)了。拆成一個個參數扔進去了。
上面這個例子等價於:

 

原文地址:https://blog.csdn.net/pfm685757/article/details/50464426


免責聲明!

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



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