Python中引數前加星號的用法

2022-06-15 08:12:13 字數 1827 閱讀 6021

剛開始折騰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)),得到的結果:。既然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 =

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前加個星號是什麼意思?

關鍵字引數的舉例:

不管你傳入多少個關鍵字引數, 我都能在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的元組中,在函式內部...