为了账号安全,请及时绑定邮箱和手机立即绑定

函数调用语法奇怪

函数调用语法奇怪

莫回无 2021-03-20 14:13:49
我在Python控制台上进行了一些实验,我注意到函数名称和之间有多少空格都没关系(),Python仍可以设法调用该方法?>>> def foo():...   print 'hello'...>>> foo ()hello>>> foo                ()hello那怎么可能呢?那不应该引发某种例外吗?
查看完整描述

3 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

从词法之间的空白的词法分析文档中:

除了逻辑行的开头或字符串文字外,空格字符空格,制表符和换页符可以互换使用以分隔标记。仅当两个令牌的级联可以另外解释为其他令牌(例如,ab是一个令牌,而ab是两个令牌)时,才需要在两个令牌之间使用空格。

倒数最后一句话,任何两个标记之间都允许有空格,只要它们不应该被解释为没有空格的一个标记即可。对使用多少空白没有限制。

前面的部分定义了组成逻辑线的内容,以上内容仅适用于逻辑线之内。以下也是合法的:

result = (foo
                 ())

因为逻辑行通过括号扩展到换行符。

的调用表达式是一个单独的系列从什么先于令牌; foo只是要在全局命名空间中查找的名称,您可以从字典中查找对象,也可以从另一个调用中返回对象,依此类推。因此,该()部分是两个单独的标记,并且在和中有任意数量的空格围绕这些是允许的。


查看完整回答
反对 回复 2021-03-24
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

你应该明白


foo()

Python中的内容由两部分组成:foo和()。


第一个是您在globals()字典中找到的名称,并且与它关联的值是一个函数对象。


表达式后的右括号表示call应进行运算。考虑例如:


def foo():

    print "Hello"


def bar():

    return foo


bar()()  # Will print "Hello"

因此,他们要理解的关键点是()可以应用于它之前的任何表达式...例如,mylist[i]()将获取i-th元素,mylist并使其不传递任何参数。


该语法还允许表达式和(字符之间的可选空格,对此没有什么奇怪的。请注意,您也可以例如写p . x为mean p.x。


查看完整回答
反对 回复 2021-03-24
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

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 + b

end


add       (10, 11)

当然,您会收到警告,但它仍然可以正常工作,尽管我不知道如何,但是我敢肯定,警告很容易被抑制。


查看完整回答
反对 回复 2021-03-24
  • 3 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信