虽然不一定准确, 但是我还是愿意如下简单的理解:
- 表达式一定有值
- 语句不一定有值
表达式(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