我最近开始自学Python,我对定义函数有疑问。我在函数中阅读了*args
和**args
可能性,并决定试用它们。我尝试在IDLE中创建一个非常简单的计算器:
def test(*args, tool):
total = 0
if(tool == '+' or tool == 'plus'):
for a in args:
total += a
return total
然而,当我通过第一行时,Python向我抛出了这个错误:
SyntaxError: invalid syntax
起初,我不知道我做错了什么,所以我试着type()
他们两个并且意识到* args是一个元组而** args是一个字典。所以我理解Python在尝试将一串字母转换为元组然后找到可能是代码的tool
部分时会感到困惑。
但是,当我在* args和工具def test(tool, *args)
上切换时,我根本没有遇到任何错误,代码按预期运行(奇怪的是,根本没有工具参数)。但是,当我试图以这种方式调用函数时:test(4, 2, 3, 'tool')
,它再一次向我抛出一个错误,抱怨它不能将整数和字符串加在一起。
发生了什么事?
答案 0 :(得分:2)
*args
必须在函数调用结束时。这是因为如果在*args
之后存在参数,则Python无法知道何时*args
结束并且其余参数开始。如果在开始时有一定数量的参数,那么*args
,它知道在函数结束时停止。
Python是一种解释型语言,因此它将从左到右读取函数并随时分配变量。请采取以下措施:
def foo(bar, *args):
print("Hello, world!", bar, args)
如果我传入foo(3, 4, 5, 6)
Python说,"好的,我们将bar
设置为3.然后,我们的其余参数进入args
。那是(4, 5, 6)
"。
现在反过来的论点是:
def foo(*args, bar):
print("Hello, world!", bar, args)
使用相同的参数,Python会说,"其余参数可以放入args
。那是(3, 4, 5, 6)
。等等,bar
怎么样?我们什么都没有留下!"所以它会引发错误。
使用您的功能test
,如果您要添加*args
,则无法输入三个数字和一个字符串。您必须首先传递tool
,然后传递数字。
答案 1 :(得分:0)
这只是因为解释器(或其他语言的编译器)。当你定义一个函数时,解释器会查找参数,然后是额外的参数,然后查找关键字参数;正确解释:
在这种情况下,解释器只会找到一个参数:
def (myArg):
在这种情况下,解释器会找到一个参数和'剩余'参数,因此它知道如何映射第一个参数,然后映射其他参数。
def (myArg, *args):
但是在这种情况下,解释器会查找list
个参数,因此它将占用所有参数并将它们打包成args;那么myArg会发生什么呢?
def(*args, myArg):
没有更多的参数,因为它已经将所有参数都打包成args,只是因为解释器不知道args何时结束。