一、錯誤解釋
當我們在調用一個函數的時候,如果傳入的參數數量與函數定義時不一致,就會產生 takes x positional arguments but y was given 的錯誤。
其中,x 表示函數定義時期望的位置參數個數,y表示實際傳入的位置參數個數。
在特定情況下,還會出現 takes 1 positional argument but 2 were given 或者 takes 2 positional arguments but 3 were given 等類似的錯誤提示。
二、函數參數
在 Python 中,函數的參數分為兩種:位置參數和關鍵字參數。
位置參數是指通過位置來匹配實參和形參,位置需要嚴格對應。
比如下面的函數:
def func(a, b, c): pass
它的位置參數分別是 a, b 和 c。
關鍵字參數則是指通過參數名來匹配實參和形參,與位置無關。
比如下面的函數:
def func(a, b, c): pass
它的關鍵字參數是 a, b 和 c。
三、錯誤原因
takes 0 positional arguments but 1 was given 這個錯誤是因為函數定義時沒有參數,但是函數調用時卻傳入了一個參數。
舉個例子:
def hello(): print("Hello, World!") hello("Python")
將產生 takes 0 positional arguments but 1 was given 的錯誤,因為 hello 函數在定義時沒有參數,但是在調用時傳入了一個參數。
四、解決方法
1. 添加位置參數
一種方法是在函數定義中添加一個位置參數:
def hello(name): print(f"Hello, {name}!") hello("Python")
這樣就可以解決 takes 0 positional arguments but 1 was given 的錯誤了。
2. 移除多餘的參數
另外一種方法是將多餘的參數從函數調用中移除:
def hello(): print("Hello, World!") hello()
這樣就可以避免 takes 0 positional arguments but 1 was given 的錯誤了。
3. 使用 *args 和 **kwargs
如果你不確定函數需要多少個參數,可以使用 *args 或者 **kwargs。
*args 表示任意數量的位置參數,它們被打包成一個元組傳入函數中。
**kwargs 表示任意數量的關鍵字參數,它們被打包成一個字典傳入函數中。
def hello(*names): for name in names: print(f"Hello, {name}!") hello("Python", "Java")
這個函數接受任意數量的位置參數。
這樣也可以避免 takes 0 positional arguments but 1 was given 的錯誤。
五、總結
takes 0 positional arguments but 1 was given 的錯誤提示表示在函數調用時給了函數一個參數,但是函數定義時沒有接受參數。
遇到這種錯誤,可以添加位置參數、移除多餘的參數,或者使用 *args 和 **kwargs 來解決問題。
對函數參數的理解非常重要,精通函數參數的使用可以避免很多類似的錯誤。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/302052.html