Skip to content
📖 Auto 版 A Byte of Python本书目录

运算符与表达式 ​

你编写的大多数语句(逻辑行)都会包含_表达式_。表达式的一个简单例子是 2 + 3。表达式可以分解为运算符和操作数。

运算符_是执行某种操作的功能,可以用 + 等符号或特殊关键字来表示。运算符需要一些数据来操作,这些数据称为_操作数。在这个例子中,2 和 3 就是操作数。

运算符 ​

我们将简要介绍各种运算符及其用法。

以下是可用运算符的快速概览:

算术运算符 ​

  • +(加法)

    • 将两个对象相加
    • 3 + 5 得到 8。"a" + "b" 得到 "ab"。
  • -(减法)

    • 从一个数中减去另一个数;如果第一个操作数省略,则假设为零。
    • -5.2 得到一个负数,50 - 24 得到 26。
  • *(乘法)

    • 将两个数相乘,或返回重复该字符串指定次数的结果。
    • 2 * 3 得到 6。"la" * 3 得到 "lalala"。
  • **(幂运算)

    • 返回 x 的 y 次幂
    • 3 ** 4 得到 81(即 3 * 3 * 3 * 3)
  • /(除法)

    • x 除以 y
    • 13 / 3 得到 4.333333333333333
  • //(整除)

    • x 除以 y 并将结果_向下_取整到最近的整数值。注意,如果其中一个是浮点数,结果也是浮点数。
    • 13 // 3 得到 4
    • -13 // 3 得到 -5
  • %(取模)

    • 返回除法的余数
    • 13 % 3 得到 1。-25.5 % 2.25 得到 1.5。

比较运算符 ​

  • <(小于)

    • 返回 x 是否小于 y。所有比较运算符返回 true 或 false。
    • 5 < 3 得到 false,3 < 5 得到 true。
    • 比较可以任意链式使用:3 < 5 < 7 得到 true。
  • >(大于)

    • 返回 x 是否大于 y
    • 5 > 3 返回 true。
  • <=(小于等于)

    • 返回 x 是否小于等于 y
    • x = 3; y = 6; x <= y 返回 true
  • >=(大于等于)

    • 返回 x 是否大于等于 y
    • x = 4; y = 3; x >= 3 返回 true
  • ==(等于)

    • 比较对象是否相等
    • x = 2; y = 2; x == y 返回 true
    • x = "str"; y = "stR"; x == y 返回 false
    • x = "str"; y = "str"; x == y 返回 true
  • !=(不等于)

    • 比较对象是否不相等
    • x = 2; y = 3; x != y 返回 true

Python 程序员注意:

Auto 使用小写的 true 和 false 表示布尔值,而 Python 使用 True 和 False。a2p 转译器会自动将 true 转换为 True,false 转换为 False。

布尔运算符 ​

  • !(布尔非)

    • 如果 x 为 true,则返回 false。如果 x 为 false,则返回 true。
    • x = true; !x 返回 false。
    • 在转译后的 Python 代码中,这会变成 not x。
  • &&(布尔与)

    • x && y 如果 x 为 false 则返回 false,否则返回 y 的求值结果。
    • x = false; y = true; x && y 返回 false,因为 x 为 false。这使用了短路求值。
    • 在转译后的 Python 代码中,这会变成 x and y。
  • ||(布尔或)

    • 如果 x 为 true,则返回 true,否则返回 y 的求值结果。
    • x = true; y = false; x || y 返回 true。这里也适用短路求值。
    • 在转译后的 Python 代码中,这会变成 x or y。

Python 程序员注意:

Auto 使用 !、&& 和 || 进行布尔运算,而 Python 使用 not、and 和 or。a2p 转译器会自动进行转换。这与 JavaScript、Rust 和 C 等语言的语法类似。

位运算符 ​

  • &(按位与)

    • 数字的按位与运算:如果两个位都为 1,则结果为 1,否则为 0。
    • 5 & 3 得到 1(0101 & 0011 得到 0001)
  • |(按位或)

    • 数字的按位或运算:如果两个位都为 0,则结果为 0,否则为 1。
    • 5 | 3 得到 7(0101 | 0011 得到 0111)
  • ^(按位异或)

    • 数字的按位异或运算:如果两个位(1 或 0)相同,则结果为 0,否则为 1。
    • 5 ^ 3 得到 6(0101 ^ 0011 得到 0110)
  • ~(按位取反)

    • x 的按位取反等于 -(x+1)
    • ~5 得到 -6。
  • <<(左移)

    • 将数字的位向左移动指定位数。
    • 2 << 2 得到 8。2 用二进制表示为 10。
    • 左移 2 位得到 1000,即十进制的 8。
  • >>(右移)

    • 将数字的位向右移动指定位数。
    • 11 >> 1 得到 5。
    • 11 用二进制表示为 1011,右移 1 位后得到 101,即十进制的 5。

赋值运算符 ​

你可以将算术运算符与赋值组合,形成便捷的简写形式:

  • = -- 赋值
  • += -- 加后赋值(a += 1 等同于 a = a + 1)
  • -= -- 减后赋值
  • *= -- 乘后赋值
  • /= -- 除后赋值
  • //= -- 整除后赋值
  • %= -- 取模后赋值
  • **= -- 幂后赋值

例如:

auto
let a = 2
a *= 3

注意 var = var operation expression 变成了 var operation= expression。

运算符优先级 ​

如果你有一个表达式如 2 + 3 * 4,是先做加法还是先做乘法?我们的中学数学告诉我们应该先做乘法。这意味着乘法运算符的优先级高于加法运算符。

下表给出了 Auto 的优先级表,从最低优先级(最弱绑定)到最高优先级(最强绑定)。这意味着在给定的表达式中,Auto 会先计算表中较低位置的运算符和表达式,再计算表中较高位置的。

最好使用括号将运算符和操作数适当分组,以明确指定优先级。这使得程序更具可读性。详情请参阅下面的改变求值顺序。

优先级运算符描述
最低||布尔或
&&布尔与
!布尔非
<, <=, >, >=, ==, !=比较
|按位或
^按位异或
&按位与
<<, >>移位
+, -加法和减法
*, /, //, %乘法、除法、整除和取模
+x, -x, ~x正号、负号、按位取反
**幂运算
最高x[index], x.attr, x(args)下标、属性引用、调用

尚未涉及的运算符将在后面的章节中解释。

_相同优先级_的运算符列在表格的同一行中。例如,+ 和 - 具有相同的优先级。

Python 程序员注意:

Auto 中的运算符优先级与 Python 相同。Auto 中的布尔运算符 &&/||/! 与 Python 中的 and/or/not 具有相同的优先级。

改变求值顺序 ​

为了使表达式更具可读性,我们可以使用括号。例如,2 + (3 * 4) 肯定比 2 + 3 * 4 更容易理解,因为后者需要了解运算符优先级。与所有事情一样,括号应该合理使用(不要过度使用),也不应该是多余的,如 (2 + (3 * 4))。

使用括号还有一个额外的好处——它帮助我们改变求值顺序。例如,如果你想让加法在乘法之前求值,可以写成 (2 + 3) * 4。

让我们来看看实际效果:

运算符优先级演示

工作原理

第一个表达式 2 + 3 * 4 得到 14,因为乘法的优先级高于加法,所以先计算 3 * 4(得到 12),然后 2 + 12 得到 14。

第二个表达式 (2 + 3) * 4 得到 20,因为括号强制先进行加法运算:2 + 3 得到 5,然后 5 * 4 得到 20。

混合运算的例子 2 + 3 * 4 - 10 / 2 遵循优先级规则:先计算乘法和除法(3 * 4 = 12,10 / 2 = 5.0),然后从左到右进行加法和减法(2 + 12 - 5.0 = 9.0)。

对于幂运算的例子,3 ** 2 先被计算(得到 9),然后 2 * 9 得到 18。

布尔运算的例子展示了 &&(and)和 ||(or)如何与比较运算符组合使用。请注意,在转译后的 Python 代码中,&& 变成了 and,|| 变成了 or,! 变成了 not。

结合性 ​

运算符通常从左到右结合。这意味着具有相同优先级的运算符按从左到右的顺序求值。例如,2 + 3 + 4 被计算为 (2 + 3) + 4。

表达式 ​

让我们把所有内容综合起来,计算矩形的面积和周长,以及圆的面积:

使用算术表达式计算面积

工作原理

矩形的长度和宽度存储在同名变量中。我们使用这些变量通过表达式计算矩形的面积和周长。我们将表达式 length * breadth 的结果存储在变量 area 中,然后使用带 $area 插值的 f-string 打印它。在第二种情况中,我们使用表达式 2 * (length + breadth) 的值并将其存储在 perimeter 中。

对于圆的面积,我们使用 **(幂运算)运算符计算 radius ** 2(半径的平方),然后乘以 pi。结果使用 radius = 5.0(浮点数),所以圆的面积也是浮点数。

最后,我们演示了复合赋值运算符(+=、-=、*=)。这些是将算术运算与赋值结合的简写形式。total += 5 等同于 total = total + 5,以此类推。

小结 ​

我们已经学习了如何使用运算符、操作数和表达式——这些是任何程序的基本构建块。在本章中,我们涵盖了:

  • 算术运算符:+、-、*、**、/、//、%
  • 比较运算符:<、>、<=、>=、==、!=
  • 布尔运算符:!(非)、&&(与)、||(或)
  • 位运算符:&、|、^、~、<<、>>
  • 赋值运算符:=、+=、-=、*=、/=、//=、%=、**=
  • 运算符优先级决定了操作的执行顺序
  • 括号可以用来显式改变求值顺序
  • 结合性意味着相同优先级的运算符从左到右求值

接下来,我们将学习如何在程序中通过控制流语句来使用这些运算符和表达式。

基于 MIT 许可发布。