剛開始折騰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里找到.

接着來搞定這個類似於你在問題中的補充資料中的例子:
下面這個例子接受任意多的位置參數, 只輸出第一個

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

2種用法的區別:


上面這個例子等價於:

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