【问题标题】:What is an expression in Python?Python中的表达式是什么?
【发布时间】:2011-01-24 13:34:18
【问题描述】:

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

这不是一些产生或计算新数据值的代码吗? (Zelle 在他的书中说)

那我想知道字符串数据类型是不是表达式。

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

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

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

【问题讨论】:

标签: python


【解决方案1】:

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

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

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

eval 评估字符串,就好像它是一个 python 表达式。 Eval 确实将表达式作为参数。然而,这并没有什么特别之处,因为每个值都是一个表达式。说“eval 将值作为参数”是在说完全相同的事情,但听起来要简单得多。 :D

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

Zelle 的书说eval(<string>) 将字符串计算为表达式,如果字符串已经是表达式,这到底意味着什么?

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

【讨论】:

  • 很好的解释,除了你不能 eval 语句:在 Python 2.x 中尝试 eval("print hello")
  • 函数调用是 Python 中的表达式。任何表达式也是一个语句——“表达式语句”。另请参阅我上面给出的相关问题的链接。
  • @Sven 为了简单起见,我使用了不同的表达式定义。我认为忽略这些信息可以避免额外的复杂性,特别是因为表达式作为语句的使用不是很广泛。 :D
  • 实际上有一个"official" definition 说明 Python 中的表达式是什么(基本上所有可以由 eval() 评估的东西)。而且由于每行的每个函数调用都是一个表达式语句,因此它们被广泛使用。我不明白为什么正确会在这里增加复杂性。
  • 有趣的是,不能在 python 中的表达式中执行赋值,这避免了 if (a = 4) vs if (a == 4) 错误。例如 eval("a=4") 是一个语法错误。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    一旦您不再考虑 Python 自己的脚本解析器是如何工作的,“表达式”可能会是一个稍微令人困惑的术语。 standard documentation 区分了表达式和“原子”,但我认为这使得它的术语非常严格(5.11 的 BNF 图暗示要成为表达式,必须是 lambda 形式或我认为是条件表达式。我的 BNF 生锈了。)

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

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

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

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

    【讨论】:

      【解决方案4】:

      字符串是一个表达式。表达式是任何具有“价值”的东西。如 3、'Hello world'、1+1、math.sqrt(9) 等。函数名也是表达式。

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

      【讨论】:

      • 除此之外:每个返回值的方法/函数也算作一个表达式。所以 eval 本身就是一个例如 a well 的表达式。
      • @poke:这有点误导。 Every 方法/函数返回一个值。如果您没有显式返回任何内容,它会隐式返回 None。 (当然在实践中,一个特定的函数调用可能会引发sys.exit,在无限循环中永远旋转,等等,而不是返回。但这并不意味着该函数调用表达式不是一个表达式,就像1/0 .)
      • @abarnert 现在很难说我当时的意思,但我认为我的意思是所有这些东西也算作一个表达式,而不仅仅是标准的静态表达式,它们之间有一些基本的运算符。
      猜你喜欢
      • 2022-11-17
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多