1. 程式人生 > 實用技巧 >Python中引數前加星號的用法

Python中引數前加星號的用法

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

  1. def accept(*s):
  2. print(sum(s))
  3. list = (0, 1, 2, 3, 7.5)
  4. print(sum(list))
  5. 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的元素分別傳遞進去呢?當然是有的,使用 ‘*’ 操作符。

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

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

輸出結果:

13.5

13.5

這樣就正常了。

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

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

  1. def accept(**s):
  2. print(s)
  3. list = {'a': 0, 'b': 1, 'c': 2}
  4. print(list)
  5. 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 inPython? [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