Python 中的表达式是什么?
我对这个概念有点困惑。
这不是一些代码,用来生成或计算新的数据值吗?(这是Zelle在他的书里说的)
那么我就想知道,字符串数据类型算不算一个表达式。
如果算,那当eval()
的参数是一个字符串时,它到底在做什么呢?
Zelle的书里说eval(<string>)
会把string
当作一个表达式来计算,这到底是什么意思,如果string
本身已经是一个表达式了呢?
而如果string
不是一个表达式,那它怎么能出现在print
后面呢?
4 个回答
“表达式”这个词可能会让人有点困惑,尤其是当你不再考虑Python脚本解析器是如何工作的时。标准文档区分了表达式和“原子”,但我觉得这种说法有点限制(在5.11的BNF图中,似乎要成为一个表达式,某个东西必须是一个lambda形式或条件表达式,我的BNF知识有点生疏了)。
另一方面,原子似乎涵盖了@kynnysmatto所说的“任何有‘值’的东西”。也许可以把原子定义为“任何可以用括号括起来,并且从括号外看不出与其对应值有什么区别的东西”。
当Zelle在讨论像eval(foo)这样的表达式时,我觉得他暗示了:
- foo是一个标识符,这是一种原子
- 但foo是某个东西的标识符
- 这个“东西”是类似字符串的,可能就是一个实际的字符串
- 在eval()的内部,这个字符串也构成了一个Python“表达式”——也就是说,Python可以解析并理解的东西。
总结一下:“表达式”这个术语最好理解为代码解析的概念;当你自己编程时,可能更容易用“原子”来思考。
简而言之:表达式是值和运算符的组合,最终会计算出一个单一的值。而语句则是其他所有指令。有些语句里面包含表达式。
表达式是一个指令,它 结合了值和运算符,并且 总是计算出一个单一的值。
举个例子,这就是一个表达式:
>>> 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
表达式代表某种东西,比如一个数字、一个字符串,或者一个类的实例。任何值都是一个表达式!
任何执行某个操作的东西都是一个语句。给变量赋值或者调用函数都是语句。语句中包含的任何值都是表达式。
foo = "hello"
是一个语句,它把 foo 赋值为表达式 "hello" 的值。因为代码 "hello"
是一个简单的表达式,意思是它没有任何操作,所以实际上没有什么被计算,foo 就被赋值为 "hello"
。更复杂的表达式会计算一些东西,比如加法。用“表达式”这个词似乎让事情变得更复杂。其实,表达式就是值,只不过它们可以有像加法或减法这样的操作。
eval
会把字符串当作 Python 表达式来计算。Eval 接受一个表达式作为参数。不过,这并没有什么特别的,因为每一个值都是一个表达式。说“eval 接受一个值作为参数”其实是同样的意思,但听起来简单多了。:D
eval( "2+2" )
会把字符串 "2+2"
传给这个函数。这个函数会计算字符串中的表达式,结果是 4。
Zelle 的书中说
eval(<string>)
会把字符串当作表达式来计算,这到底是什么意思,如果字符串本身已经是一个表达式呢?
任何字符串都是一个表达式,因为它代表一个值。不过,字符串里的内容对它是否是表达式没有任何影响。如果它是一个值,那就是一个表达式。当它被 eval “作为表达式计算”时,字符串中的字符就像 Python 表达式一样被执行。