6

在 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 词法分析器的上下文中使用时的含义略有不同。

4

3 回答 3

4

运算符和关键字是不同的实体。

不,他们不是。is, in, and, or, not, 我敢肯定还有一些两者兼而有之。

于 2012-04-04T05:16:44.587 回答
2

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

“存在以下类别的标记:标识符、关键字、文字、运算符和分隔符”

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

于 2012-04-04T05:16:15.627 回答
2

lambda显然是一个关键字;它是解析器识别的特殊词,否则将属于identifier.

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

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

以下标记是运算符:

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

这就是运算符小节的全部内容。由此我认为,在定义语言标记的上下文中,“运算符”是符号运算符,而关于关键字的部分明确说明“这些本来是标识符的东西是关键字”。这就是为什么我认为没有列出诸如not, is,等关键字运算符的原因。in但肯定有一些语义运算符是关键字,无论解析器是否将它们视为单独的类。

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

于 2012-04-04T07:08:16.253 回答