虽然不一定准确, 但是我还是愿意如下简单的理解:

  • 表达式一定有值
  • 语句不一定有值

表达式(expression), 可以理解为一种短语, 是可以计算(evaluate)出结果的:

  • "hello"
  • 1 + 1

语句(statement), 可以理解为整句或命令, 可以由短语构成, 不一定计算出结果, 但可以执行以使某件事情发生:

  • 计算带有副作用的表达式: 表达式语句
  • 控制流程: 条件语句, 循环语句, 跳转语句
  • 组织代码语义: 声明语句

曾经有一个疑惑, 为什么如下写法在 Python 中无效, 然而在 Perl 等语言中是有效的:

Python:

(var = 1) if True else (var = 0) # syntax error

Perl:

1 ? $_ = 1 : $_ = 0; # everything's fine

流畅的Python 这本书中, 第五章, 杂谈里看到一句话, 有可能解释了我的一些疑惑. 书中的原文大致如下:

Lisp 中一切都是表达式, Python 使用的是面向语句的语法. 我在写 Python 的时候, 很想念有值的 try/catch 语句.

关键这里强调了一点, Python 中, 并非所有东西都是表达式, 也就是并非所有东西都有值.

但是 Lisp 所有东西都是表达式, 都有值.

而 Perl 的行为与 Lisp 类似, 因为原文中提到 try/catch 在 Lisp 中是有值的, 而 Perl 中的 try/catch 就是有值的.


那么原因其实大概就知道了, 在运算符的各个位置, 是期待一个值的. 一个无值的语句只能单独使用, 无法和别的运算符一起并列.

上面的疑惑中也的确是这样, Perl 中, $_ = 1 这个赋值语句本身也是有值的, 值就是 1.

而 Python 中, var = 1 这个赋值语句本身是没有任何值的, 连 None 这种值都没有, 所以无法和 if/else 一起使用.

Comments
Write a Comment