您的位置:

Python 函数出现 takes 0 positional arguments but 1 was given 错误的解决方法

一、错误解释

当我们在调用一个函数的时候,如果传入的参数数量与函数定义时不一致,就会产生 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 来解决问题。

对函数参数的理解非常重要,精通函数参数的使用可以避免很多类似的错误。