Python中的表达式是什么?

时间:2011-01-24 13:34:18

标签: python

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

是不是某些代码产生或计算新的数据值? (泽勒在他的书中说)

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

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

Zelle的书说eval(<string>)评估string作为表达式,如果string已经是表达式,这究竟意味着什么?

如果string不是表达式,那么print之后怎么会出现?

4 个答案:

答案 0 :(得分:22)

表达式表示某些内容,例如数字,字符串或类的实例。任何值都是表达式!

任何做某事都是一种陈述。对变量或函数调用的任何赋值都是一个语句。表达式中该语句中包含的任何值。

foo = "hello"是一个将foo赋给表达式“hello”的值的语句。由于代码"hello"是一个简单的表达式,意味着它不包含任何操作,因此实际上没有评估任何内容,所以foo只被分配给"hello“。更复杂的表达式实际上会评估事物,比如添加数字。单词表达似乎让事情变得更加混乱。表达式只不过是值,除了它们可以有加法或减法等操作。

eval计算字符串,好像它是一个python表达式。 Eval确实将表达式作为参数。但是,由于每个值都是表达式,所以没有什么特别之处。说“eval以一个值作为一个参数”说的完全相同,但听起来更简单。 :d

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

  

Zelle的书说eval(<string>)评估字符串作为表达式,如果字符串已经是表达式,这究竟意味着什么?

任何字符串都是表达式,因为它表示一个值。但是,字符串中的内容绝对没有影响它作为表达式。如果是一个值,它就是一个表达式。当它“被评估为eval的表达式”时,字符串内的字符就像它们是python表达式一样被执行。

答案 1 :(得分:3)

TL; DR:表达式是值和运算符的组合,总是评估为单个值。每个其他指令都有一个声明。一些语句包含表达式。

表达式组合值和运算符的指令总是评估为单个值

例如,这是一个表达式:

>>> 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

答案 2 :(得分:2)

一旦你开始思考Python自己的脚本解析器是如何工作的,那么“表达式”可能是一个有点令人困惑的术语。 standard documentation区分表达式和“原子”,但我认为这使得它的术语非常具有限制性(5.11中的BNF图表意味着表达式必须是lambda的表达式我认为,形式或条件表达。我的BNF生锈了。)

另一方面,Atom似乎涵盖了@kynnysmatto所说的'任何具有“价值”的东西。也许“任何可以括号,然后从括号外面与其相应的值无法区分”的东西可能是对原子更好的定义。

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

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

tl; dr:“表达式”作为术语可能在代码解析方面得到最好的理解;当你自己编程时,你可能会发现用“原子”来思考它会更好。

答案 3 :(得分:1)

string是一个表达式。表达式是具有“值”的任何东西。像3,'Hello world',1 + 1,math.sqrt(9)等。函数名也是表达式。

eval()为您提供以字符串形式提供给它的表达式的值。如果你说eval('1 + 1')它返回2.所以如果你只是写1 + 1那么它返回相同的返回值。