Python 中的表达式是什么?

20 投票
4 回答
65867 浏览
提问于 2025-04-16 10:31

我对这个概念有点困惑。

这不是一些代码,用来生成或计算新的数据值吗?(这是Zelle在他的书里说的)

那么我就想知道,字符串数据类型算不算一个表达式。

如果算,那当eval()的参数是一个字符串时,它到底在做什么呢?

Zelle的书里说eval(<string>)会把string当作一个表达式来计算,这到底是什么意思,如果string本身已经是一个表达式了呢?

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

4 个回答

3

“表达式”这个词可能会让人有点困惑,尤其是当你不再考虑Python脚本解析器是如何工作的时。标准文档区分了表达式和“原子”,但我觉得这种说法有点限制(在5.11的BNF图中,似乎要成为一个表达式,某个东西必须是一个lambda形式或条件表达式,我的BNF知识有点生疏了)。

另一方面,原子似乎涵盖了@kynnysmatto所说的“任何有‘值’的东西”。也许可以把原子定义为“任何可以用括号括起来,并且从括号外看不出与其对应值有什么区别的东西”。

当Zelle在讨论像eval(foo)这样的表达式时,我觉得他暗示了:

  • foo是一个标识符,这是一种原子
  • 但foo是某个东西的标识符
  • 这个“东西”是类似字符串的,可能就是一个实际的字符串
  • 在eval()的内部,这个字符串构成了一个Python“表达式”——也就是说,Python可以解析并理解的东西。

总结一下:“表达式”这个术语最好理解为代码解析的概念;当你自己编程时,可能更容易用“原子”来思考。

5

简而言之:表达式是值和运算符的组合,最终会计算出一个单一的值。而语句则是其他所有指令。有些语句里面包含表达式。

表达式是一个指令,它 结合了值和运算符,并且 总是计算出一个单一的值

举个例子,这就是一个表达式:

>>> 2 + 2

这里的2是整数值,而+是数学运算符。这个表达式计算的结果是单一的整数值4。

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

>>> 4

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

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

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

变量 myAge 的值就是它里面的内容。函数调用 int('5') 的结果是这个函数返回的值 5。所有这些字符串值通过 + 运算符组合在一起(在这里,它是字符串连接运算符)。无论一个表达式有多复杂,最终都会计算出一个 单一 的值:在这个例子中,就是字符串值 'You will be 6 next year.'

与此相对的是 语句,它是一个Python指令,不会计算出一个值。Python语句几乎就是所有不是表达式的东西。这里有一个 赋值语句

>>> spam = 2 + 2

这是一个if语句:

>>> if spam == 4:

这是一个用于无限循环的while语句:

>>> while True:

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

>>> break
32

表达式代表某种东西,比如一个数字、一个字符串,或者一个类的实例。任何值都是一个表达式!

任何执行某个操作的东西都是一个语句。给变量赋值或者调用函数都是语句。语句中包含的任何值都是表达式。

foo = "hello" 是一个语句,它把 foo 赋值为表达式 "hello" 的值。因为代码 "hello" 是一个简单的表达式,意思是它没有任何操作,所以实际上没有什么被计算,foo 就被赋值为 "hello"。更复杂的表达式会计算一些东西,比如加法。用“表达式”这个词似乎让事情变得更复杂。其实,表达式就是值,只不过它们可以有像加法或减法这样的操作。

eval 会把字符串当作 Python 表达式来计算。Eval 接受一个表达式作为参数。不过,这并没有什么特别的,因为每一个值都是一个表达式。说“eval 接受一个值作为参数”其实是同样的意思,但听起来简单多了。:D

eval( "2+2" ) 会把字符串 "2+2" 传给这个函数。这个函数会计算字符串中的表达式,结果是 4。

Zelle 的书中说 eval(<string>) 会把字符串当作表达式来计算,这到底是什么意思,如果字符串本身已经是一个表达式呢?

任何字符串都是一个表达式,因为它代表一个值。不过,字符串里的内容对它是否是表达式没有任何影响。如果它是一个值,那就是一个表达式。当它被 eval “作为表达式计算”时,字符串中的字符就像 Python 表达式一样被执行。

撰写回答