Python中的表达式是什么?

What is an expression in Python?

我对它的含义或定义有些困惑。

这不是生成或计算新数据值的代码吗?(泽尔在书中说)

然后我想知道字符串数据类型是否是表达式。

如果是,那么当参数是字符串时,eval()会做什么?

Zelle Sayseval()的书把string作为一个表达式来评价,如果string已经是一个表达式,这到底意味着什么?

如果string不是一个表达式,那么它怎么会出现在print之后呢?


表达式表示一些东西,如数字、字符串或类的实例。任何值都是表达式!

做什么都是声明。对变量或函数调用的任何赋值都是语句。表达式中该语句中包含的任何值。

foo ="hello"是一个将foo赋给表达式"hello"值的语句。由于代码"hello"是一个简单的表达式,意味着它不包含任何操作,因此实际上不计算任何内容,因此foo只是分配给"hello。更复杂的表达式实际上会计算一些东西,比如加数字。使用这个词的表达方式似乎让事情变得更加混乱。表达式只不过是值,除了它们可以有加法或减法之类的操作。

eval计算字符串时,将其视为python表达式。eval不接受表达式作为参数。然而,这并没有什么特别的,因为每个值都是一个表达式。说"eval以一个值作为参数"是完全相同的,但听起来简单多了。D

eval("2+2" )将字符串"2+2"传递给函数。函数计算字符串中包含的表达式,结果为4。

The book by Zelle says eval() evaluates string as an expression, what does that exactly mean if string is already an expression?

任何字符串都是表达式,因为它表示一个值。但是,字符串中的内容对表达式的形式绝对没有影响。如果它是一个值,则它是一个表达式。当它被"eval计算为表达式"时,字符串中的字符将被执行,就像它们是一个python表达式一样。


tl;dr:表达式是值和运算符的组合,并且始终计算为单个值。陈述是每一条指令。有些语句包含表达式。

表达式是一条将值和运算符组合在一起并始终计算为单个值的指令。

例如,这是一个表达式:

1
>>> 2 + 2

2s是整数值,+是数学运算符。此表达式的计算结果为单个整数值4。

从技术上讲,这也是一个表达:

1
>>> 4

作为表达式,它的计算结果为单个值4。

当我说值和运算符时,这不仅限于数学问题:

1
>>> 'You will be ' + str(int(myAge) + 1) + ' next year.'

myAge变量的计算结果是它内部的值。函数调用int('5')计算函数的返回值5。所有这些字符串值都与+运算符组合在一起(在本例中,它是字符串连接运算符)。不管表达式有多大,它的计算结果都是一个值:在这种情况下,字符串值'You will be 6 next year.'

这与一条语句形成对比,该语句是一条不计算值的python指令。python语句几乎是所有其他不是表达式的语句。这是一份分配声明:

1
>>> spam = 2 + 2

这里有一个if语句:

1
>>> if spam == 4:

下面是无限循环的while语句:

1
>>> while True:

注意,这两个语句都包含表达式(甚至是True,它的计算结果都是单值True)。但并非所有语句都使用表达式。这里有一个中断声明:

1
>>> break


一旦您不去想Python自己的脚本解析器如何工作,"表达式"可能是一个稍微令人困惑的术语。标准文档对表达式和"原子"进行了区分,但我认为这使得它的术语非常严格(5.11的BNF图意味着要成为表达式,必须是lambda形式或条件表达式,我认为。我的BNF生锈了。)

另一方面,原子似乎覆盖了@kynnysmatto所说的"任何有价值的东西"。也许"任何可以用括号括起来的东西,然后从括号的外面看,它和它相应的值是不可区分的"可能是一个更好的原子定义。

当Zelle在eval(foo)等上下文中讨论表达式时,我认为他暗示:

  • foo是一个标识符,它是一种原子类型
  • 但是foo是某个东西的标识符
  • 这个"某物"是字符串,可能是实际的字符串
  • 在eval()的内部,这个字符串还构成了一个python"表达式"——也就是说,python可以解析和理解的东西。

tl;dr:"表达式"作为术语在代码解析方面可能最容易理解;当您自己编程时,您可能会发现最好用"原子"来思考。


字符串是表达式。表达式是任何具有"值"的东西。比如3,‘hello world’,1+1,math.sqrt(9)等。函数名也是表达式。

eval()将表达式的值作为字符串提供给它。如果你说eval("1+1"),它返回2。所以它返回相同的结果,如果你简单地写:1+1,它会返回相同的结果。