跳至主要内容

Python 中的运算符

本教程涵盖 Python 中不同类型的运算符、运算符重载、优先级与结合性。
· 9分钟 阅读

使用 AI 探索

就像在数学中一样,Python 等编程语言也有运算符。您可以将它们视为计算机科学的基础——极其简单但至关重要的“函数”。这是计算机程序可以被分解到的最简单操作。对于立志成为数据科学家或软件工程师的人而言,这是必备知识。

在本教程中,您将学习:

如果您想进一步学习 Python 编程语言的基础知识,欢迎查看我们的免费课程 Intro to Python for Data Science。

Artithmetic Operators

这些您很可能已经很熟悉了,因为它们来自基础数学。

算术运算符包括加法(+)、减法(-)、乘法(*)、除法(/)、幂(**)、整除(//)和取模(%)。前四个相当简单;分别是加、减、乘、除,您应该已经很熟悉。

# Addition
print(5 + 2)

# Subtraction
print(5 - 2)

# Multiplication
print(5 * 2)

# Division
print(5 / 2)
7
3
10
2.5

另外三个稍微复杂一些。幂运算符表示“乘方”。例如,2 ** 3 表示将 2 自身相乘 3 次,因此 2 ** 3 等同于 2 * 2 * 2,结果为 8。

整除与普通除法类似,但结果总是向下取整。在下面的示例中,5 除以 2 的结果是 2.5。但由于这里是整除,2.5 会被向下取整为 2。

最后,取模是除法后的余数。在 5%2 的情况下,2 在 5 里只能放进两次,因此余数为 1。

# Exponent
print(5 ** 2)
# This is the same as 5 * 5

# Floor Division
print(5 // 2)

# Modulus
print(5 % 2)
25
2
1

在 Python 中,加号运算符还可用于连接字符串。这意味着它们会被拼接为一个字符串,例如:

firstName = "Théo"

introduction = "Hi, my name is " + firstName + "."

print(introduction)
Hi, my name is Théo.

Assignment Operators

如果您有一些编程经验,肯定用过赋值运算符。它们用于将某个值赋给变量。最常用的是 =。使用时,只需输入要赋新值的变量名、=,以及要赋的值。例如,如果您想将值 100 赋给变量 balance,可以这样做:

balance = 100
print(balance)
100

如果您想让 balance 增加 10,可以使用 balance += 10。这等价于 balance = balance + 10,但要简短得多。

balance += 10
print(balance)
110

-= 也一样,balance -= 10 等同于 balance = balance - 10:

print(balance)
balance -= 10
print(balance)
110
100

其他赋值运算符的用法完全相同。包括:

  • *=
  • /=
  • **=
  • //=
  • %=

Comparison Operators

您可以使用比较运算符来——没错,就是——比较变量的值。它们总是返回布尔值,即 True 或 False。总共有六种:

  • 相等:==
  • 不相等:!=
  • 大于:>
  • 小于:<
  • 大于等于:>=
  • 小于等于:<=

以下是一些比较示例:

a = 3
b = 5

print(a == b) # Equal
print(a != b) # Not equal
print(a > b) # Greater than
print(a < b) # Less than
print(a >= b) # Greater than or equal to
print(a <= b) # Less than or equal to
False
True
False
True
False
True

== 和 != 也可用于比较字符串,而不是数字。其他运算符不适用于字符串,因为字符串并不存在谁“大于”谁的说法。

print("Hello" == "World")
print("Python" != "R")
False
True

Logical Operators

这些您也许已经很熟悉了!在逻辑学中,它们被称为逻辑联结词。在自然语言中也被广泛使用。包括:and、or 和 not。

and 仅在两个操作数(您正在比较的两个布尔对象)都为 True 时才返回 True。例如:

print(True and True)
print(True and False)
print(False and False)
True
False
False

要理解该逻辑运算符的行为,您可以使用真值表:

aba and b
TrueTrueTrue
TrueFalseFalse
FalseTrueFalse
FalseFalseFalse

or 只要任一(一个或多个)操作数为 True,就为 True。

print(True and True)
print(True and False)
True
False
aba or b
TrueTrueTrue
TrueFalseTrue
FalseTrueTrue
FalseFalseFalse

请注意,这些运算符也适用于两个以上的操作数,例如:

print(True and True and True and True)
print(True and True and True and False)
print(False or False or False or False)
print(False or False or False or True)
True
False
False
True

not 会返回其操作数的相反值,因此给定 False 时返回 True,反之亦然。

print(not True)
False
anot a
TrueFalse
FalseTrue

运算符重载

还记得之前您看到 + 既可以相加数字,也可以连接(合并)字符串吗?因此 + 的行为会根据所作用的对象类型而不同。但并非总是如此。有时,您使用的运算符并不支持想要作用的对象类型。

来看一个例子。假设您有两个 Dog 对象,ozzy 和 filou。它们属于下面的 Dog 类。您可以将类视为对象应当具备的外观和行为的蓝图。在本例中,Dog 对象有姓名、年龄和身高。定义类之后,您可以实例化对象。其中一个是 Ozzy,3 岁,身高 30 厘米。另一个是 Filou,5 岁,身高 65 厘米。

该示例使用了面向对象编程的概念。如果您想进一步了解,请阅读我们的教程 Object-Oriented Programming in Python

假设您想用大于号 > 来比较两只狗。这将无法工作。您会得到一个错误:'>' not supported between instances of 'Dog' and 'Dog'。这意味着 > 不知道如何比较 Dog 类的对象。

class Dog:

    def __init__(self, name, age, height):  
        self.name = name
        self.age = age
        self.height = height

ozzy = Dog("Ozzy", 3, 30)
filou = Dog("Filou", 5, 65)

print(filou > ozzy)
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-96-428069ab24cc> in <module>()
      9 filou = Dog("Filou", 5, 65)
     10
---> 11 print(filou > ozzy)


TypeError: '>' not supported between instances of 'Dog' and 'Dog'

幸运的是,通过运算符重载,您可以为 Dog 对象定义该运算符的行为。本例中,需要定义一个名为 __gt__(表示“大于”)的方法,接收两个参数。由于我们想按身高比较两只狗,该方法返回 self.height > other.height。

class Dog:

    def __init__(self, name, age, height):  
        self.name = name
        self.age = age
        self.height = height

    def __gt__(self,other):
        return self.height > other.height

ozzy = Dog("Ozzy", 3, 30)
filou = Dog("Filou", 5, 65)

print(filou > ozzy)
print(ozzy > filou)
True
False

优先级

当您组合许多运算符时,事情可能会变得复杂。请看下面的示例:

a = 2
b = 3
c = 9

a ** b > 5 and c - a // b >= 9 or b ** 2 == c
True

您怎么知道哪个会先执行?当代码里有很多这些符号时,该如何阅读?是从左到右执行,还是有特定顺序?

这就是优先级发挥作用的地方。Python 运算符按非常明确的顺序执行,且某些运算符优先于其他运算符。

在下表中,您可以看到运算符的优先级,从上到下排列。规则与数学中相同:公式里某些计算必须先于其他计算执行。

优先级运算符说明
1**幂
2*, /, %, //乘、除、取模、整除
3+, -加、减
4>, <, >=, <=比较
5==, !=相等性
6= %= /= //= -= += *= **=赋值
7and, or, not逻辑

结合性

您已经看到优先级很重要!但对于同一优先级的运算符(例如乘法和除法)该怎么办?它们会同时执行吗?不会。*、\、% 和 \\ 按从左到右执行,而 ** 则从右到左执行。这称为结合性。

看下面的示例。在这种情况下,运算符将从左到右执行,输出为 3。

print(5 * 2 // 3)
3

不过,通过添加括号,您可以更改运算符的执行顺序。这就是结合性,它与数学中的结合性相同。括号内的内容会优先计算。本例中,会先执行整除,然后再进行乘法。

print(5 * (2 // 3))

总结

您现在已经了解了什么是运算符、如何使用以及它们的工作方式。您还学习了重载、优先级和结合性。离成为 Python 大师又近了一步!如果您还想学习更多内容,欢迎查看我们的课程 Intermediate Python for Data Science。

主题