猿问

函数调用语法奇怪

我在Python控制台上进行了一些实验,我注意到函数名称和之间有多少空格都没关系(),Python仍可以设法调用该方法?


>>> def foo():

...   print 'hello'

...

>>> foo ()

hello

>>> foo                ()

hello

那怎么可能呢?那不应该引发某种例外吗?


莫回无
浏览 158回答 3
3回答

慕桂英546537

从词法之间的空白的词法分析文档中:除了逻辑行的开头或字符串文字外,空格字符空格,制表符和换页符可以互换使用以分隔标记。仅当两个令牌的级联可以另外解释为其他令牌(例如,ab是一个令牌,而ab是两个令牌)时,才需要在两个令牌之间使用空格。倒数最后一句话,任何两个标记之间都允许有空格,只要它们不应该被解释为没有空格的一个标记即可。对使用多少空白没有限制。前面的部分定义了组成逻辑线的内容,以上内容仅适用于逻辑线之内。以下也是合法的:result = (foo                  ())因为逻辑行通过括号扩展到换行符。的调用表达式是一个单独的系列从什么先于令牌; foo只是要在全局命名空间中查找的名称,您可以从字典中查找对象,也可以从另一个调用中返回对象,依此类推。因此,该()部分是两个单独的标记,并且在和中有任意数量的空格围绕这些是允许的。

慕尼黑8549860

你应该明白foo()Python中的内容由两部分组成:foo和()。第一个是您在globals()字典中找到的名称,并且与它关联的值是一个函数对象。表达式后的右括号表示call应进行运算。考虑例如:def foo():    print "Hello"def bar():    return foobar()()  # Will print "Hello"因此,他们要理解的关键点是()可以应用于它之前的任何表达式...例如,mylist[i]()将获取i-th元素,mylist并使其不传递任何参数。该语法还允许表达式和(字符之间的可选空格,对此没有什么奇怪的。请注意,您也可以例如写p . x为mean p.x。

肥皂起泡泡

Python从C编程语言中汲取了很多线索。这当然是其中之一。考虑以下事实:int add(int a, int b){    return a + b;}int main(int argc, char **argv){    return add        (10, 11);}函数名称和参数之间可以有任意数量的空格。其他语言也是如此。以Ruby为例,def add(a, b)  a + bendadd       (10, 11)当然,您会收到警告,但它仍然可以正常工作,尽管我不知道如何,但是我敢肯定,警告很容易被抑制。
随时随地看视频慕课网APP

相关分类

Python
我要回答