在Python中定义函数接受(x,* args),但不接受(* args,x)。为什么?

时间:2015-11-27 14:02:54

标签: python python-2.7

我最近开始自学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'),它再一次向我抛出一个错误,抱怨它不能将整数和字符串加在一起。

发生了什么事?

2 个答案:

答案 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何时结束。