理解 Python 运算符

PythonBeginner
立即练习

介绍

在这个 Lab 中,你将全面了解 Python 中的各种运算符,这是编写有效代码的一个基本概念。我们将探索并练习使用算术、比较、赋值、逻辑、位、成员资格和身份运算符。

通过使用集成的 VS Code 编辑器和终端进行的实践练习,你将学习如何执行计算、进行比较、赋值、组合条件、操作位、检查成员资格以及比较对象身份。到本 Lab 结束时,你将熟练掌握使用这些运算符来构建更复杂和功能性的 Python 程序。

探索算术运算符和比较运算符

在这一步中,我们将探索 Python 中基本的算术运算符和比较运算符。这些运算符对于在你的程序中执行计算和做出决策至关重要。Lab 环境已经在 ~/project 目录下为你创建了一个名为 operators.py 的文件。

首先,在 VS Code 编辑器左侧的文件浏览器中找到 operators.py 文件并打开它。我们将把所有的代码写在这个文件中。

让我们从算术运算符开始。将以下 Python 代码添加到 operators.py 文件中:

## Arithmetic Operators
a = 21
b = 5
print(f'{a} + {b} = {a + b}')
print(f'{a} - {b} = {a - b}')
print(f'{a} * {b} = {a * b}')
print(f'{a} / {b} = {a / b}') ## 标准除法
print(f'{a} // {b} = {a // b}')  ## 整除,向下取整到最近的整数
print(f'{a} % {b} = {a % b}')  ## 取模,返回余数
print(f'{a} ** {b} = {a ** b}')  ## 幂运算,a 的 b 次方

添加代码后,按 Ctrl + S 保存文件。

要运行脚本,请从顶部菜单选择 Terminal > New Terminal 打开 VS Code 中的集成终端。然后,执行以下命令:

python ~/project/operators.py

你应该在终端中看到以下输出:

21 + 5 = 26
21 - 5 = 16
21 * 5 = 105
21 / 5 = 4.2
21 // 5 = 4
21 % 5 = 1
21 ** 5 = 4084101

接下来,让我们探索比较运算符。这些运算符比较两个值并返回一个布尔值:TrueFalse

将以下代码添加到你的 operators.py 文件的末尾:

## Comparison Operators
print("\n--- Comparison Operators ---")
a = 6
b = 5
print(f'{a} == {b} is {a == b}')  ## 等于
print(f'{a} != {b} is {a != b}')  ## 不等于
print(f'{a} > {b} is {a > b}')    ## 大于
print(f'{a} < {b} is {a < b}')    ## 小于
print(f'{a} >= {b} is {a >= b}')  ## 大于或等于
print(f'{a} <= {b} is {a <= b}')  ## 小于或等于

再次保存文件,并从终端运行它:

python ~/project/operators.py

输出现在将包括比较操作的结果:

21 + 5 = 26
21 - 5 = 16
21 * 5 = 105
21 / 5 = 4.2
21 // 5 = 4
21 % 5 = 1
21 ** 5 = 4084101

--- Comparison Operators ---
6 == 5 is False
6 != 5 is True
6 > 5 is True
6 < 5 is False
6 >= 5 is True
6 <= 5 is False

你现在已成功在 Python 脚本中使用了算术运算符和比较运算符。

练习赋值运算符和逻辑运算符

在这一步中,我们将练习使用赋值运算符和逻辑运算符。赋值运算符用于分配或更新变量的值,而逻辑运算符用于组合条件语句。

继续在 VS Code 编辑器中使用 operators.py 文件。

首先,让我们添加赋值运算符的示例。它们提供了一种执行操作并将结果分配回同一变量的简写方式。

将以下代码添加到你的 operators.py 文件的末尾:

## Assignment Operators
print("\n--- Assignment Operators ---")
a = 10
b = 3
print(f'Initial a: {a}')

c = a
c += b  ## 等同于 c = c + b
print(f'a += b: {c}')

c = a
c -= b  ## 等同于 c = c - b
print(f'a -= b: {c}')

c = a
c *= b  ## 等同于 c = c * b
print(f'a *= b: {c}')

c = a
c /= b  ## 等同于 c = c / b
print(f'a /= b: {c}')

## 海象运算符 (Walrus operator, Python 3.8+)
## 它在更大的表达式的一部分中将一个值赋给一个变量。
print("\n--- Walrus Operator ---")
text = 'hello python'
if (n := len(text)) > 10:
    print(f'The string is long enough ({n} characters)')

保存文件,并从终端运行它:

python ~/project/operators.py

你应该会看到赋值运算符的输出:

... (前一步的输出) ...

--- Assignment Operators ---
Initial a: 10
a += b: 13
a -= b: 7
a *= b: 30
a /= b: 3.3333333333333335

--- Walrus Operator ---
The string is long enough (12 characters)

现在,让我们添加逻辑运算符(andornot)的示例。这些运算符处理布尔值,但它们也可以处理其他类型。在 Python 中,像 0None 和空集合(''[]{})这样的值被视为 False。所有其他值都被视为 True

将以下代码添加到你的 operators.py 文件的末尾:

## Logical Operators
print("\n--- Logical Operators ---")
x = True
y = False

print(f'{x} and {y} is {x and y}')
print(f'{x} or {y} is {x or y}')
print(f'not {x} is {not x}')

## 使用非布尔值的求值
a = 10  ## True
b = 0   ## False
print(f'{a} and {b} returns {a and b}') ## 返回第一个 Falsy 值或最后一个 Truthy 值
print(f'{a} or {b} returns {a or b}')   ## 返回第一个 Truthy 值或最后一个 Falsy 值

保存文件并再次运行它:

python ~/project/operators.py

输出现在将包括逻辑操作的结果:

... (前一个示例的输出) ...

--- Logical Operators ---
True and False is False
True or False is True
not True is False
10 and 0 returns 0
10 or 0 returns 10

你现在已在 Python 中练习了赋值运算符和逻辑运算符的使用。

学习位运算符

在这一步中,我们将学习位运算符(Bitwise Operators)。这些运算符直接对整数的二进制(base-2)表示形式执行操作。这对于底层数据操作非常有用。

继续编辑 operators.py 文件。

首先,我们使用 bin() 函数来看看一些数字的二进制表示。0b 前缀表示后面的数字是二进制的。

将以下代码添加到 operators.py 的末尾:

## Bitwise Operators
print("\n--- Bitwise Operators ---")
a = 5  ## Binary: 0b101
b = 9  ## Binary: 0b1001
print(f'Binary of {a} is {bin(a)}')
print(f'Binary of {b} is {bin(b)}')

## 为了清晰起见,我们用 4 位来对齐它们:
## a = 0101
## b = 1001

## 位与 (&): 如果两个位都是 1,则结果位设置为 1。
## 0101 & 1001 = 0001 (十进制 1)
print(f'{a} & {b} = {a & b}')

## 位或 (|): 如果两个位中有一个是 1,则结果位设置为 1。
## 0101 | 1001 = 1101 (十进制 13)
print(f'{a} | {b} = {a | b}')

## 位异或 (^): 如果只有两个位中有一个是 1,则结果位设置为 1。
## 0101 ^ 1001 = 1100 (十进制 12)
print(f'{a} ^ {b} = {a ^ b}')

## 位非 (~): 反转所有位。
## ~a 等同于 -(a+1)
print(f'~{a} = {~a}')

## 左移 (<<): 将位向左移动,右侧用零填充。
## 等同于乘以 2**n。
## 5 << 2 表示 0101 变为 10100 (十进制 20)
print(f'{a} << 2 = {a << 2}')

## 右移 (>>): 将位向右移动,丢弃右侧的位。
## 等同于进行 2**n 的整除。
## 9 >> 2 表示 1001 变为 10 (十进制 2)
print(f'{b} >> 2 = {b >> 2}')

保存文件,并从终端运行脚本:

python ~/project/operators.py

你将看到演示每次位操作的输出:

... (前一步的输出) ...

--- Bitwise Operators ---
Binary of 5 is 0b101
Binary of 9 is 0b1001
5 & 9 = 1
5 | 9 = 13
5 ^ 9 = 12
~5 = -6
5 << 2 = 20
9 >> 2 = 2

你现在已经学会了如何使用位运算符来在位级别上操作整数。

使用成员运算符和身份运算符

在最后一步中,我们将介绍成员资格运算符(innot in)和身份运算符(isis not)。成员资格运算符用于测试一个值是否存在于一个序列中,而身份运算符用于检查两个变量是否引用内存中完全相同的对象。

继续编辑 operators.py 文件。

首先,让我们添加成员资格运算符的示例。它们通常与列表(list)、元组(tuple)和字符串(string)等序列一起使用。

将以下代码添加到你的 operators.py 文件的末尾:

## Membership Operators
print("\n--- Membership Operators ---")
my_list = [1, 3, 5, 7]
print(f'3 in {my_list} is {3 in my_list}')
print(f'4 not in {my_list} is {4 not in my_list}')

greeting = "hello world"
print(f'"world" in "{greeting}" is {"world" in greeting}')

保存文件并运行:

python ~/project/operators.py

成员资格运算符的输出将是:

... (前一步的输出) ...

--- Membership Operators ---
3 in [1, 3, 5, 7] is True
4 not in [1, 3, 5, 7] is True
"world" in "hello world" is True

现在,让我们探索身份运算符。理解 is(身份)和 ==(相等性)之间的区别非常重要。== 检查两个对象的是否相同,而 is 检查它们是否是同一个对象(即它们具有相同的内存地址)。

将以下代码添加到你的 operators.py 文件中:

## Identity Operators
print("\n--- Identity Operators ---")

## 对于小整数,Python 通常会重用同一个对象。
x = 256
y = 256
print(f'x is y (for 256): {x is y}') ## 这通常是 True

## 对于较大的整数,Python 可能会创建单独的对象。
a = 257
b = 257
print(f'a is b (for 257): {a is b}') ## 这通常是 False

## 对于像列表(list)这样的可变对象(mutable objects),即使它们的内容相同,它们也是不同的对象。
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(f'list1 == list2: {list1 == list2}') ## 检查内容是否相等 (True)
print(f'list1 is list2: {list1 is list2}') ## 检查是否是同一个对象 (False)
print(f'list1 is not list2: {list1 is not list2}') ## 检查是否是不同的对象 (True)

保存文件并最后一次运行它:

python ~/project/operators.py

输出展示了相等性和身份之间的区别:

... (前一个示例的输出) ...

--- Identity Operators ---
x is y (for 256): True
a is b (for 257): True
list1 == list2: True
list1 is list2: False
list1 is not list2: True

你已成功使用成员资格运算符和身份运算符,完成了对 Python 主要运算符类型的探索。

总结

在这个实验(Lab)中,你获得了关于 Python 中各种类型运算符的实践经验。你从探索基本的算术运算符(Arithmetic Operators)和比较运算符(Comparison Operators)开始,用于执行计算和评估条件。然后,你练习使用赋值运算符(Assignment Operators)来高效地更新变量,并使用逻辑运算符(Logical Operators)来组合条件逻辑。

此外,你深入研究了位运算符(Bitwise Operators)以了解底层数据操作,并最后学习了成员资格运算符(Membership Operators)和身份运算符(Identity Operators),用于检查项的存在性和对象身份。通过在 VS Code 编辑器中为每种运算符类型编写和执行代码,你为在未来的 Python 编程中使用这些基本工具打下了坚实的基础。