剛開始折騰python,今天發現了乙個很奇怪的錯誤。
def accept(*s):這段**會報錯:typeerror: unsupported operand type(s) for +=: 'int' and 'tuple',在函式中產生了intprint(sum(s))
list = (0, 1, 2, 3, 7.5)
print(sum(list))
accept(list)
與tuple相加的情況。但是函式外的sum(list)輸出結果是正常的。
我們print(type(s)),得到的結果:。既然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):其中accept(**list)等價於accpet(a=0, b=1, c=2)。print(s)
list =
print(list)
accept(**list) #####加兩個星號
來總結一下:
1、函式宣告的引數列表中加單星號,即f(*x)則表示x為元組,所有對x的操作都應將x視為元組型別
進行。所有傳入f(*x)的變數都將作為元組x的元素之一。
2、雙星號同上,區別是x視為字典。
3、在變數前加單星號表示將元組(列表、集合)拆分為單個元素。
4、雙星號同上,區別是目標為字典,字典前加單星號的話可以得到「鍵」。
更詳細的資訊可以參考:
知乎:元組的reference前加個星號是什麼意思?
關鍵字引數的舉例:
不管你傳入多少個關鍵字引數, 我都能在kw裡找到.
接著來搞定這個類似於你在問題中的補充資料中的例子:
下面這個例子接受任意多的位置引數, 只輸出第乙個
(這裡的 s 的型別是元組)
咱們定義乙個新元組,待會扔給mean函式。
2種用法的區別:
可以看出,用了星號之後,就把元組 a 給解包(unpack)了。拆成乙個個引數扔進去了。
上面這個例子等價於:
python 函式引數前加 星號的含義
加乙個 星號 表示引數數量不確定,將傳入的引數儲存為元組。加兩個 星號 表示引數數量不確定且引數型別是關鍵字引數,將傳入的引數儲存為字典。加乙個 星號 def main args print args main 1,2 out 1,2 加兩個 星號 def main kwargs print kwa...
Python 引數知識(變數前加星號的意義)
過量的引數 在執行時知道乙個函式有什麼引數,通常是不可能的。另乙個情況是乙個函式能操作很多物件。更有甚者,呼叫自身的函式變成一種api提供給可用的應用。對於這些情況,python提供了兩種特別的方法來定義函式的引數,允許函式接受過量的引數,不用顯式宣告引數。這些 額外 的引數下一步再解釋。注意arg...
Python 引數傳遞中的星號
python 支援4種引數傳遞的方式 1.定義 f a,b 呼叫 f 1,2 2.定義 f a,b 9 呼叫 f 1 或 f 1,2 第二個引數未給出的話,使用預設的值 9 3.定義 f a 呼叫 f 1 或 f 1,2 或f 1,2,3 這種方式可以接收任意多個引數儲存到名為a的元組中,在函式內部...