在Python 3.2中,“lambda”被认为是“关键字”,“运营商”还是两者兼而有之?

时间:2012-04-04 05:10:38

标签: python lambda language-lawyer

在Python 3.2中,根据:http://docs.python.org/py3k/reference/expressions.html#summary

lambda是Python中优先级最低的运算符。

根据这个:http://docs.python.org/py3k/reference/lexical_analysis.html#keywords

lambda是一个Python语言关键字。

但是,根据这个:http://docs.python.org/py3k/reference/lexical_analysis.html#other-tokens

运营商和关键字是不同的实体。

我正在尝试系统地向某人解释Python 3.2,我不想混淆他们。我,我自己,对运营商和关键字的确切定义感到困惑。

我最好的猜测是,术语“运算符”在Python解析器与Python词法分析器的上下文中使用时意味着略有不同。

3 个答案:

答案 0 :(得分:4)

  

运营商和关键字是不同的实体。

不,他们不是。 isinandornot,我相信还有更多。{/ p>

答案 1 :(得分:2)

这并不是说它们是相互排斥的,只是:

  

“存在以下类别的令牌:标识符,关键字,   文字,运算符和分隔符“

我是类别人和美国人。当然,这可能意味着它们是相互排斥的,在这种情况下,文档是不一致的。

答案 2 :(得分:2)

lambda显然是关键字;它是解析器识别的特殊单词,否则将属于identifier的定义。

lambda不是语义运算符。运算符只是一个函数,但使用不同的语法调用。我们可以设想用+函数替换add运算符;我们添加的所有程序都会变得更加冗长和难以阅读,但我们仍然可以编写它们。另一方面,lambda语言构造不能用函数替换; lambda x: x+1不只是计算值xx+1的结果,因为在此上下文中它们根本不是值(x是参数的名称函数被定义,x+1是lambda体的代码。)

在您关联的同一页面中,我们有:http://docs.python.org/py3k/reference/lexical_analysis.html#operators

  

以下令牌是运营商:

+       -       *       **      /       //      %
<<      >>      &       |       ^       ~
<       >       <=      >=      ==      !=

这是关于运营商的小节的全部内容。从这一点来看,我认为在定义语言标记的上下文中,“运算符”是符号运算符,而关键字的部分明确地说明“这些本来是标识符的东西”是关键词“。这就是我认为notisin等关键字运算符未列出的原因。但是,无论解析器是否将它们视为单独的类,肯定存在作为关键字的语义运算符。

我不确定为什么http://docs.python.org/py3k/reference/expressions.html#summarylambda描述为运营商;我当然不会。严格地说,它没有明确地说“lambda是具有最低优先级的运算符”,它只是在列标题为“运算符”的表中列出lambda。也许这只是一种便利;将lambda描述为优先级低的事物是澄清Python如何解析lambda x: x + 1的理想方法(理论上它可以是(lambda x: x) + 1lambda x: (x + 1))。