考点 4. Python 的基础知识

📋 考纲要求

掌握 Python 的基础知识,包括标识符、常量、变量、运算符、数据类型。

一、语法知识与书写规范

1. Python 严格区分字母大小写

Python 是严格区分字母大小写的,这一点在变量、函数、关键字、类名等所有标识符的使用中都适用。

2. 缩进

缩进是 Python 的"灵魂",用于区分循环、判断、函数等代码块的范围。

Python 不用大括号({})划分代码块,而是靠缩进(空格/制表符)来划分的,同一级代码必须保持相同的缩进(推荐用 4 个空格,不要混用空格和 Tab)。

python
# 正确缩进(if 判断的代码块缩进 4 个空格)
age = 18
if age >= 18:
    print("成年了")  # 缩进 4 个空格,属于 if 的代码块
    print("可以投票")  # 同一级,缩进一致
print("结束")  # 无缩进,不属于 if 的代码块

# 错误缩进(会报错 IndentationError)
if age >= 18:
print("成年了")  # 缺少缩进,直接报错

3. 注释

注释是代码的说明文字,核心作用是让代码更容易被理解。注释中的内容会被 Python 解释器完全忽略,不会被执行。

  • ①单行注释:用#开头,注释内容在#后面。
  • ②多行注释:用三引号包裹,有"×××"和'×××'两种形式。
python
# 这是单行注释,解释下面代码的作用
name = "张三"  # 定义变量存储姓名
"""
这是多行注释
可以写很多行
用于解释函数/类的功能
"""
def say_hello():
    print("你好")

4. 语句结束

Python 不使用分号(;)结束语句(加分号也能运行,但不推荐),一行代码就是一条语句。若想在一行中写多条语句,则需要用分号分隔(仅特殊场景使用)。

python
# 推荐写法(无分号)
print("Hello")
a = 5

# 不推荐(一行多条语句)
print("Hi"); b = 6

5. 变量

变量是程序中用于存储可变数据,并可通过自定义名称访问该数据的标识符。在 Python 中定义变量无须声明类型,赋值即创建。

(1) 规则

变量名由字母、数字、下划线组成,不能以数字开头,区分字母大小写,不能和 Python 关键字重复,如 if、for、print 等。

python
# 变量名 = 值(赋值运算符是=,不是数学中的"等于")
# 正确变量名
user_name = "李四"    # 推荐用下划线分隔
age18 = 18            # 数字可在后面
Age = 20              # 区分大小写,Age 和 age 是两个变量
# 错误变量名
18age = 18            # 数字开头,报错
if = 10               # 用关键字当变量名,报错

(2) 动态类型

变量的类型由赋值的值决定,且可以随时修改类型,无须提前声明。

python
a = 10        # a 是整数(int)
a = "hello"   # a 变成字符串(str),完全合法
a = [1,2,3]   # a 又变成列表(list)
print(type(a)) # 输出 <class 'list'>,type()查看变量类型

6. 换行与续行

一行代码太长时,可用反斜杠\续行,或利用括号()自动续行。

python
# 反斜杠续行
total = 1 + 2 + 3 + \
    4 + 5 + 6

# 括号自动续行(更简洁)
total = (1 + 2 + 3 +
    4 + 5 + 6)

7. 引号

Python 里的单引号(')、双引号(")、三引号("""''')的核心作用都是定义字符串,但适用场景有所不同。

(1) 单引号 & 双引号(最常用,功能等价)

两者都用来定义单行字符串,唯一的区别是当字符串内部包含其中一种引号时,就用另一种引号包裹字符串,以避免冲突。

  • ①基础用法(无冲突时,任选其一)
python
# 单引号定义字符串
name = '张三'
print(name) # 输出:张三

# 双引号定义字符串
age = "18岁"
print(age) # 输出:18岁
  • ②避免引号冲突(核心区别)
python
# 正确写法:字符串内有单引号 → 用双引号包裹
text1 = "He said: 'I love Python'"
print(text1) # 输出:He said: 'I love Python'

# 错误写法(引号冲突,报错 SyntaxError)
# text2 = 'He said: 'I love Python'' # 解释器会把第一个'和第二个'配对,后面的内容报错
  • ③转义符替代方案

如果必须用同一种引号,那么可在内部引号前加\(转义符),使其被 Python 识别为普通字符。

python
text3 = 'He said: \'I love Python\''
print(text3) # 输出:He said: 'I love Python'

(2) 三引号(单/双均可,功能一致)

既可用来定义多行字符串,也可用于多行注释(本质是未赋值的字符串),支持换行和内部任意引号。

  • ①定义多行字符串
python
# 三双引号(推荐,和多行注释格式统一)
poem = """
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
"""
print(poem) # 输出带换行的完整诗句

# 三单引号(功能一样)
note = '''
姓名:张三
年龄:18
爱好:'Python 编程'、'阅读' # 内部可混写单/双引号
'''
print(note) # 输出包含换行和混合引号的内容
  • ②作为多行注释

未赋值给变量的三引号字符串会被 Python 忽略,常用来写多行注释。

python
"""
这是多行注释
可以写很多行
解释下面函数的功能
"""
def add(x, y):
    return x + y

8. 冒号

冒号是标记代码块的开始,在 if、for、while、def、class 等关键字后加冒号是告诉 Python 接下来是一个缩进的代码块,这也是 Python 缩进规则的配套语法。

(1) 条件判断(if/elif/else)

python
age = 18
if age >= 18:  # 冒号标记 if 代码块开始
    print("成年")  # 缩进的代码块
else:  # else 后也必须加冒号
    print("未成年")

(2) 循环(for/while)

python
# for 循环
for i in range(3):  # 冒号标记循环体开始
    print(i)  # 循环体代码块

# while 循环
count = 0
while count < 3:  # 冒号标记循环体开始
    print(count)
    count += 1

(3) 函数/类定义

python
# 函数定义
def add(x, y):  # 冒号标记函数体开始
    return x + y  # 函数体代码块

# 类定义
class Student:  # 冒号标记类体开始
    def __init__(self, name):  # 方法定义也需要冒号
        self.name = name

二、标识符和关键字

1. 标识符定义

标识符是程序员自定义的名称,用于给变量、常量、函数、类、模块等命名,是程序中识别不同元素的"标记"。

2. 命名规则

标识符必须遵守的命名规则见表 8-1 所列。

表 8-1 标识符的命名规则

规 则合法示例非法示例错误原因
只能以字母(a~z/A~Z)、下划线(_)开头name、_age、User_Name123name、# score、—price以数字/特殊符号(#、—、空格等)开头
后续字符可包含字母、数字、下划线stu_01、book123、_num_5stu—01、a b、my@mail包含减号、空格、@等特殊字符
区分字母大小写Age 和 age 是两个不同的标识符—Python 对大小写敏感
不能与关键字重复my_if、func_forif、for关键字是 Python 的保留字,不可占用

3. 命名规范

推荐遵守的命名规范见表 8-2 所列。

表 8-2 标识符的命名规范

命名场景规范(示例)
变量/函数小写字母+下划线(蛇形命名法):user_name、calculate_score()
常量全大写+下划线:MAX_SCORE、PI
类首字母大写(驼峰命名法):Student、UserInfo
python
# 合法标识符(变量)
name = "小明"
_age = 20
stu_01 = 95
Age = 21  # 与 age 是不同标识符
# 非法标识符(运行报错)
# 123name = "小红"     # 以数字开头,SyntaxError
# stu—01 = 88          # 含减号,SyntaxError
# if = 100             # 与关键字重名,SyntaxError

4. 关键字

关键字(也叫保留字)是 Python 语言预先定义、赋予特殊含义的标识符,不能被当作普通标识符使用,即不能用作变量名、函数名。

关键字是 Python 语法的一部分,有固定功能,如 if 用于条件判断、for 用于循环。关键字除 True、False、None 外均为小写,不能被赋值、重定义,违反会直接报错。

5. 常用关键字

常用关键字见表 8-3 所列。

表 8-3 常用关键字

类 别关键字用 途
条件/循环if、else、elif、for、while、break、continue流程控制
赋值/定义def、class、import、return定义函数/类、导入模块
逻辑/判断and、or、not、in、is逻辑运算、成员判断
常量值True、False、None布尔值、空值

三、基本数据类型

Python 的基本数据类型就是数值类型,用于各种数学计算和数据处理,主要分为整数(int)、浮点数(float)、复数(complex)和布尔值(bool)。

1. 整数类型

整数类型(int)简称整型,是没有小数部分的数字,可正可负、可大可小,用于表示计数、编号、序号等整数值,是 Python 最基础的数值类型之一。整型可以进行的算法有+、—、*、/,以及其他操作,默认采用十进制。

python
# 正整数
age = 20
student_id = 1001

# 负整数
temperature = -5  # 零下 5 摄氏度

# 零
count = 0

# 查看类型
print(type(age))  # <class 'int'>

(1) 无取值范围限制

C/Java 等语言的整数有固定的字节长度(如 int 占 4 字节,最大值为 2^31-1),但 Python 语言的整数可以是任意大小,仅受限于计算机内存。

(2) 支持多种进制表示

Python 允许用不同的进制表示整数,以满足不同的开发场景(如二进制用于底层、十六进制用于编码),常用进制见表 8-4 所列。

表 8-4 常用进制

进 制前 缀示 例说 明
十进制无(默认)10、255日常使用的进制
二进制0b 或 0B0b1010(等价于十进制 10)计算机底层存储格式
八进制0o 或 0O0o17(等价于十进制 15)传统 Unix 系统常用
十六进制0x 或 0X0xFF(等价于十进制 255)编码、硬件编程常用
python
# 不同进制的整数
dec_num = 10      # 十进制
bin_num = 0b1010  # 二进制(=10)
oct_num = 0o12    # 八进制(=10)
hex_num = 0xa     # 十六进制(=10)

# 打印均为十进制(Python 默认十进制输出)
print(dec_num, bin_num, oct_num, hex_num)  # 10 10 10 10

# 进制转换(内置函数)
print(bin(10))  # 转二进制:0b1010
print(oct(10))  # 转八进制:0o12
print(hex(10))  # 转十六进制:0xa

(3) 不可变类型

整数是不可变类型,即一旦创建,值不能被修改。若对值进行修改,则会生成新的整数对象。

python
a = 10
print(id(a))  # 打印内存地址:如 140712894456848

a = a + 5  # 不是修改原 10,而是创建新整数 15,a 指向新地址
print(id(a))  # 新地址:如 140712894457008

2. 浮点类型

Python 中的浮点数(float)是带有小数部分的数字(也可通过科学计数法表示),用于表示连续的数值,是 Python 核心的数值类型之一。

python
# 常规小数形式
price = 29.9    # 商品价格
height = 1.75   # 身高(米)
pi = 3.1415926  # 圆周率
# 科学计数法形式(e/E表示10的幂)
distance = 1.5e3    # 等价 1.5×10³ = 1500.0
tiny_num = 2.3e-4  # 等价 2.3×10⁻⁴ = 0.00023
# 查看类型
print(type(price))    # <class 'float'>
print(type(distance))  # 依然是 float 类型

(1)取值范围

浮点数占用 8 字节,有最小值和最大值限制(受 IEEE754 标准约束),取值范围为 -1.8×10³⁰⁸~1.8×10³⁰⁸。

(2)不可变类型

和整数一样,float 也是不可变类型,修改值会创建新的浮点数对象,而非修改原对象。

3. 复数类型

复数是形如 a+bj 的数(数学中为 a+bi,Python 用 j/J 表示虚数单位),其中 a 是实部(real part),可以是整数或浮点数;b 是虚部(imaginary part),可以是整数或浮点数;j 是虚数单位。

python
# 定义复数:实部+虚部(j结尾)
c1 = 3 + 4j    # 实部 3,虚部 4
c2 = 2 - 5j    # 实部 2,虚部 -5
c3 = 10j       # 实部 0,虚部 10(纯虚数)
c4 = 5         # 实部 5,虚部 0(等价于 5+0j)
# 查看类型
print(type(c1))   # <class 'complex'>
print(type(c4))   # 注意:纯整数仍是 int,需显式转 complex
print(complex(c4))  # 转复数:(5+0j)

(1)不可变类型

和 int/float 一样,复数是不可变类型,创建后实部和虚部无法修改,修改会生成新的复数对象。

(2)实部/虚部的访问

复数对象有两个只读属性:real(实部)、imag(虚部),可以直接访问但不能修改。

python
c = 3 + 4j
print("实部:", c.real)   # 3.0(自动转为 float 类型)
print("虚部:", c.imag)   # 4.0(自动转为 float 类型)

4. 布尔类型

布尔类型(bool)是 Python 中表示“真/假”“是/否”“成立/不成立”的基础数据类型,仅有 True 和 False 两个固定取值,True 表示“真”(等价于整数 1);False 表示“假”(等价于整数 0)。

python
# 直接定义布尔变量
is_pass = True     # 考试及格
has_money = False  # 没有钱
is_adult = True    # 是成年人
# 查看类型
print(type(is_pass))   # <class 'bool'>
# 布尔值与整数的等价性(核心特性)
print(True == 1)   # True
print(False == 0)  # True
print(True + 5)    # 6(布尔值可直接参与数值运算)
print(False * 10)  # 0

(1)布尔是整数的子类(特殊继承关系)

在 Python 中,bool 是 int 的子类(可通过 issubclass 验证),因此 True 的本质是整数 1 的“布尔别名”;False 的本质是整数 0 的“布尔别名”,但布尔值的类型仍是 bool,而非 int。

python
# 验证继承关系
print(issubclass(bool, int))  # True(bool 是 int 的子类)
# 类型判断(重点:值等价,但类型不同)
a = 1
b = True
print(a == b)              # True(值相等)
print(type(a) == type(b))  # False(类型不同)

(2)不可变类型

和 int/float/complex 一样,布尔类型是不可变类型,一旦赋值为 True 或 False,便无法修改,重新赋值会创建新对象。

(3)所有对象都可转为布尔值(“真值”与“假值”)

Python 中的任何数据类型的对象都可以通过 bool() 函数转为布尔值,核心规则见表 8-5 所列。

表 8-5 布尔类型转换

类别转为 False 的情况(假值)转为 True 的情况(真值)
数值类型(int/float/complex)0、0.0、0j非 0 的所有数值(如 5、-3、2.5、3+4j)
字符串(str)空字符串""/''非空字符串(如"hello"、"0")
列表/元组/字典/集合空对象([]、()、{}、set())非空对象(如[1,2]、{"name":"小明"})
特殊值None(空值)除 None 外的所有非假值对象
python
# 数值转布尔
print(bool(0))     # False
print(bool(-5))    # True
print(bool(0.0))   # False
print(bool(3.14))  # True
# 字符串转布尔
print(bool(""))      # False
print(bool("0"))    # True(非空字符串都是真值)
print(bool("False"))  # True(同理)
# 容器转布尔
print(bool([]))       # False(空列表)
print(bool([0]))      # True(非空列表,即使元素是 0)
print(bool({}))       # False(空字典)
print(bool({"age":0})) # True(非空字典)
# 特殊值转布尔
print(bool(None))     # False

四、数据类型转换

简单来说,数据类型转换就是将一种数据类型(如字符串)转换成另一种数据类型(如整数)。Python 中的数据类型转换主要分为自动转换和强制转换两类。

1. 自动转换

Python 解释器自动完成,无须手动干预,通常发生在不同数值类型运算时(如整数和浮点数相加)。

Python 会遵循“低精度类型向高精度类型转换”的原则,避免数据丢失,常见场景有整数(int)和浮点数(float)运算,整数自动转浮点数;整数/浮点数和复数(complex)运算,整数或浮点数自动转复数。

python
# 整数 + 浮点数 → 结果为浮点数
a = 10   # int 类型
b = 3.14  # float 类型
c = a + b
print(c)  # 输出:13.14
print(type(c))  # 输出:<class 'float'>
# 整数 + 复数 → 结果为复数
d = 5 + 2j  # complex 类型
e = a + d
print(e)  # 输出:(15+2j)
print(type(e))  # 输出:<class 'complex'>

2. 强制转换

通过 Python 内置函数手动转换,其核心函数及用法见表 8-6 所列。

表 8-6 强制转换函数

转换函数作 用适用场景注意事项
int()转为整数字符串(纯数字)、浮点数、布尔值浮点数转整数会截断小数部分(不是四舍五入);非数字字符串转换会报错
float()转为浮点数整数、字符串(纯数字/含小数点)、布尔值布尔值 True→1.0,False→0.0
str()转为字符串所有基本数据类型转换后保留原数据的字符形式
bool()转为布尔值所有数据类型空值/0/空容器为 False,其余为 True
list()转为列表可迭代对象(字符串、元组、字典等)字典转列表默认取键;字符串转列表按字符拆分
tuple()转为元组可迭代对象与 list() 规则一致
dict()转为字典可迭代的键值对(如列表套元组)需符合键值对格式,否则报错
  • (1)数值类型间的转换(int/float/complex)
python
# 1. 转整数
print(int(3.99))   # 输出:3(截断小数,不是四舍五入)
print(int("123"))  # 输出:123(纯数字字符串可转)
print(int(True))   # 输出:1(布尔值 True=1,False=0)
# 2. 转浮点数
print(float(10))    # 输出:10.0
print(float(False)) # 输出:0.0
# 3. 转复数
print(complex(5))    # 输出:(5+0j)
print(complex(3,4)) # 输出:(3+4j)

(2)字符串与其他类型的转换

python
# 1. 其他类型转字符串
print(str(100))       # 输出:"100"(整数转字符串)
print(str(3.14))      # 输出:"3.14"(浮点数转字符串)
print(str([1,2,3]))  # 输出:"[1,2,3]"(列表转字符串)
# 2. 字符串转数值(需满足格式)
print(int("456"))     # 输出:456
print(float("78.9")) # 输出:78.9#

(3)布尔值转换[bool()]

python
# 0/空值/空容器 → False
print(bool(0))    # False
print(bool(""))   # False(空字符串)
print(bool([]))   # False(空列表)
# 非 0/非空 → True
print(bool(1))    # True

(4)容器类型转换(list/tuple/dict)

python
# 1. 字符串转列表/元组
print(list("hello"))  # 输出:['h','e','l','l','o']
print(tuple("hello")) # 输出:('h','e','l','l','o')
# 2. 列表/元组互转
lst = [1,2,3]
tpl = (4,5,6)
print(tuple(lst))  # 输出:(1,2,3)
print(list(tpl))   # 输出:[4,5,6]
# 3. 转字典(需键值对格式)
print(dict([("name","张三"),("age",20)]))  # 输出:{'name': '张三', 'age': 20}
print(dict(name="李四",age=25))            # 输出:{'name': '李四', 'age': 25}

五、运算符

运算符(Operator)是 Python 中用于执行特定运算操作的符号或关键字,它可以作用于一个或多个操作数(变量、常量、表达式等),并返回一个运算结果。简单来说,运算符就是指挥 Python 做计算、判断、赋值等操作的“指令符号”。Python 中的运算符按功能主要分为算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、成员运算符和身份运算符 7 大类。

1. 算术运算符

算术运算符是用来对数字进行加、减、乘、除等数学运算的符号,Python 提供了完整的算术运算符体系,既包含基础运算,也支持进阶的取模、幂运算等。

常用的算术运算符见表 8-7 所列。

表 8-7 常用的算术运算符

运算符名 称作 用实 例
+加法两数相加3+2 结果为 5
-减法两数相减3-2 结果为 1
*乘法两数相乘2*4 结果为 8,"abc"*2 结果为"abcabc"
/除法两数相除,结果为浮点数4/2 结果为 2.0
//整除两数相除,只保留整数部分(向下取整)5//2 结果为 1,5//2.0 结果为 2.0
%取模/取余返回两数相除后的余数5%2 结果为 1,5%2.0 结果为 1.0
幂运算计算一个数的 n 次方3**2 结果为 9

(1)基础运算符(+、-、*)

python
# 加法
a = 5 + 3
print("5 + 3 =", a)  # 输出:5 + 3 = 8
# 减法
b = 10 - 4
print("10 - 4 =", b)  # 输出:10 - 4 = 6
# 乘法
c = 6 * 7
print("6 * 7 =",c) # 输出:6 * 7 = 42
# 特殊用法:+可拼接字符串,*可重复字符串/列表
print("hello" + " world")  # 输出:hello world
print([1,2] * 3)         # 输出:[1,2,1,2,1,2]

(2)除法相关(/、//)

python
# 普通除法(/):结果永远是浮点数,哪怕能整除
d1 = 8 / 2
print("8 / 2 =",d1)    # 输出:8 / 2 = 4.0(注意是浮点数)
# 整除(//):只保留整数部分,向下取整(负数也要注意)
e1 = 9 // 2
print("9 // 2 =",e1)   # 输出:9 // 2 = 4
e2 = -9 // 2
print("-9 // 2 =",e2)  # 输出:-9 // 2 = -5(不是-4,因为向下取整)

(3)取模(%)

python
# 基本用法:求余数
f1 = 9 % 2
print("9 % 2 =",f1)   # 输出:9 % 2 = 1(判断奇数)
f2 = 10 % 2
print("10 % 2 =",f2)  # 输出:10 % 2 = 0(判断偶数)
# 负数取模:结果符号和除数一致
f3 = -9 % 2
print("-9 % 2 =",f3)  # 输出:-9 % 2 = 1(除数是 2,正数)

(4)幂运算(**)

用于计算一个数的 n 次方,是替代 pow() 函数的简化写法。

python
# 2 的 3 次方
g1 = 2 ** 3
print("2 ** 3 =",g1)  # 输出:2 ** 3 = 8

2. 赋值运算符

赋值运算符的核心作用是将右边的值赋给左边的变量。除了最基础的 =,Python 中还提供了结合算术运算的复合赋值运算符(如 +=、*=),可以简化代码书写,提升效率。

赋值运算按功能分为基础赋值和复合赋值两类,常见的赋值运算符见表 8-8 所列。

表 8-8 常见的赋值运算符

运算符名 称作用(等价写法)示 例等价于
=简单赋值将右侧值赋给左侧变量a = 5—
+=加法赋值先加后赋值a += 3a = a + 3
-=减法赋值先减后赋值a -= 3a = a - 3
*=乘法赋值先乘后赋值a *= 3a = a * 3
/=除法赋值先除后赋值(结果为浮点数)a /= 3a = a / 3
//=整除赋值先整除后赋值a //= 3a = a // 3
%=取模赋值先取模后赋值a %= 3a = a % 3
**=幂运算赋值先幂运算后赋值a **= 3a = a ** 3

(1)简单赋值运算符(=)

这是最基础的赋值运算符,也是所有赋值运算的核心。

【注】“=”不是“等于”,是“赋值”,表示“等于”用“==”。

python
# 基础用法:给变量赋值
x = 10
print("x =",x) # 输出:x = 10
# 多变量同时赋值(解包赋值)
a,b = 5,8
print("a =",a,",b =",b) # 输出:a = 5 ,b = 8
# 变量间赋值
y = x # 将 x 的值(10)赋给 y
print("y =",y) # 输出:y = 10
# 注意:左边必须是“变量”,不能是常量
# 5 = x # 报错:SyntaxError(左边不能是数字)

(2)复合赋值运算符(+=、-=、*= 等)

复合赋值是“运算+赋值”的简写,核心逻辑是先对变量执行算术运算,再将结果重新赋给该变量,一定要注意变量必须先定义才能进行复合赋值。

python
# 1. 加法赋值(+=)
num = 8
num += 2 # 等价于 num = num + 2
print("num += 2 后:",num)  # 输出:10
# 2. 减法赋值(-=)
num -= 3 # 等价于 num = num - 3
print("num -= 3 后:",num)  # 输出:7
# 3. 乘法赋值(*=)
num *= 2 # 等价于 num = num * 2
print("num *= 2 后:",num)  # 输出:14
# 4. 除法赋值(/=)
num /= 4 # 等价于 num = num / 4
print("num /= 4 后:",num)  # 输出:3.5(浮点数)

3. 比较运算符

比较运算符(也叫关系运算符)用于比较两个值的大小、相等性等关系,运算结果永远是布尔值(True 或 False),这是它和算术/赋值运算符最核心的区别。比较运算符常与条件判断结合使用,常用的比较运算符见表 8-9 所列。

表 8-9 常用的比较运算符

运算符名 称作 用示 例结 果
==等于判断左右值是否相等5 == 5True
!=不等于判断左右值是否不相等5 != 3True
>大于判断左值是否大于右值7 > 3True
<小于判断左值是否小于右值7 < 3False
>=大于等于判断左值是否大于等于右值5 >= 5True
<=小于等于判断左值是否小于等于右值5 <= 3False

(1)核心比较[等于(==)和不等于(!=)]

易混淆 =(赋值)和 ==(等于),这是必须重点区分的两个符号。

python
# 等于(==):判断值是否相等
a = 10
b = 10
print(a == b) # 输出:True
print(5 == 5.0)  # 输出:True(值相等,类型不同也会返回 True)
# 不等于(!=):判断值是否不相等
c = 8
print(a != c)  # 输出:True
print("abc" != "ABC")  # 输出:True(字符串区分大小写)
# 易错点:不要把==写成=(赋值)
# if a = 10:  # 报错:SyntaxError(条件判断中不能用赋值)

(2)大小比较(>、<、>=、<=)

这类运算符主要用于数字(整数、浮点数),也可用于字符串(按 ASCII 码/Unicode 码比较)。

python
# 数字大小比较
num1 = 15
num2 = 20
print(num1 > num2)  # 输出:False
print(num1 < num2)  # 输出:True
# 字符串大小比较(按字符的 Unicode 码逐位比较)
print("apple" < "banana") # 输出:True('a'的码值 97 < 'b'码值的 98)
print("Apple" < "apple")  # 输出:True(大写 A 的码值 65 < 小写 a 的码值 97)
print("abc" > "abd")      # 输出:False(前两位相同,第三位'c'的码值 99 < 'd'的码值 100)
# 注意:不同类型(非数字/字符串)不能直接比较
# print(10 > "5")  # 报错:TypeError(整数和字符串无法比较大小)

(3)连续比较

Python 支持“链式比较”,可以把多个比较运算符连起来写,逻辑更简洁,等价于多个 and 连接的判断。

python
# 连续比较:判断数值是否在某个区间
age = 18
# 等价于:16 < age and age < 20
print(16 < age < 20)  # 输出:True

4. 逻辑运算符

逻辑运算符可用于对布尔值进行逻辑判断(与、或、非),最终结果也为布尔值。它是构建复杂条件判断的核心,还能结合非布尔值(Python 会自动转换为布尔值)进行运算。

Python 提供了 3 个核心逻辑运算符,见表 8-10 所列。

表 8-10 逻辑运算符

运算符名 称作 用
and逻辑与两边都为 True 时,结果才为 True;只要有一个为 False,结果就为 False
or逻辑或只要有一个为 True,结果就为 True;两边都为 False 时,结果才为 False
not逻辑非取反:True 变 False,False 变 True(单目运算符,只有一个操作对象)

(1)基础用法(布尔值运算)

先从纯布尔值的运算入手,理解最核心的逻辑规则。

python
# 1. 逻辑与(and):全真才真,一假就假
print(True and True)   # 输出:True
print(True and False)  # 输出:False
print(False and True)  # 输出:False
print(False and False) # 输出:False
# 2. 逻辑或(or):一真就真,全假才假
print(True or True)    # 输出:True
print(True or False)   # 输出:True
print(False or True)   # 输出:True
print(False or False)  # 输出:False
# 3. 逻辑非(not):取反
print(not True)   # 输出:False
print(not False)  # 输出:True
# 实际应用:结合比较运算符构建复杂条件
age = 20
has_id = True  # 判断:年龄≥18 且有身份证
print(age >= 18 and has_id)  # 输出:True
# 判断:年龄<18 或没有身份证
print(age < 18 or not has_id)  # 输出:False

(2)短路特性

and 和 or 具有短路求值特性,只要能确定最终结果,就不会执行后面的表达式,这是容易忽略但非常实用的特性。

python
# 第一个条件为 False,直接返回 False,不会执行后面的 print
False and print("这段代码不会执行")  # 无输出
# 第一个条件为 True,才会执行后面的部分
True and print("这段代码会执行")   # 输出:这段代码会执行

(3)非布尔值的逻辑运算

Python 中,所有非布尔值都可以参与逻辑运算,运算中会先将其转换为布尔值[bool()]再进行逻辑运算,但返回的是原值而非转换后的布尔值,这是关键区别。

python
# and 运算:返回第一个 False 值;若全为 True,则返回最后一个值
print(5 and 8)        # 输出:8(5→True,8→True,返回最后一个)
print(0 and 8)        # 输出:0(0→False,短路返回 0)
print("abc" and "")   # 输出:""("abc"→True,""→False,返回"")
# or 运算:返回第一个 True 值;若全为 False,则返回最后一个值
print(0 or 8)         # 输出:8(0→False,8→True,返回 8)
print("" or "abc")    # 输出:"abc"(""→False,"abc"→True)
print(False or None)  # 输出:None(全 False,返回最后一个)
# not 运算:始终返回布尔值
print(not 0)          # 输出:True
print(not "abc")      # 输出:False
print(not [])         # 输出:True

5. 位运算符

位运算可以跳过高级的算术运算和逻辑运算的封装,直接对整数的二进制位进行操作,常用于硬件控制、网络编程、嵌入式开发等场景。在学习位运算符前,需要知道 Python 中整数的二进制以补码形式存储,并且位运算时会先把数字转换成二进制,计算后再转回十进制。

Python 中的位运算符见表 8-11 所列。

表 8-11 位运算符

运算符名 称作 用示 例
&按位与两个数的二进制对应位都为 1 时,结果位才是 1,否则为 06&3 的结果为 2
\按位或两个数的二进制对应位只要有一个为 1,结果位就是 1,否则为 0
^按位异或对应位不同则为 1,相同则为 06^3 的结果为 5
~按位取反对每一位取反(0 变 1,1 变 0)~6 的结果为 -7
<<左移把数字的二进制位全部左移 n 位,右边补 0,等价于数字×2ⁿ(正数无溢出时)6<<1 的结果为 12
>>右移把数字的二进制位全部右移 n 位,左边补符号位(正数补 0,负数补 1),等价于数字//(2ⁿ)(正数时)6>>1 的结果为 3

6. 成员运算符

成员运算符用于判断一个元素是否存在于一个可迭代对象(如列表、字符串、字典、集合等)中,是 Python 特有的、非常便捷的运算符,无须手动遍历判断。

Python 中只有两个成员运算符,见表 8-12 所列。

表 8-12 成员运算符

运算符名 称作 用语法格式
in存在运算符判断元素是否在可迭代对象中,存在则返回 True元素 in 可迭代对象
not in不存在运算符判断元素是否不在可迭代对象中,不存在则返回 True元素 not in 可迭代对象
  • (1)in 运算符:判断“存在”

核心逻辑:检查左侧元素是否为右侧可迭代对象的“成员”,根据检查结果返回布尔值(True/False)。

python
# 示例 1:列表
nums = [1,2,3,4]
print(3 in nums)  # True(3 是列表成员)
# 示例 2:元组
tup = ('a','b','c')
print('d' in tup)  # False
# 示例 3:字符串(检查子串是否存在)
text = "hello python"
print('python' in text)  # True("python"是子串)
print('py' in text)      # True
  • (2)not in 运算符:判断“不存在”

核心逻辑:是 in 的反向判断,元素不在可迭代对象中则返回 True,否则返回 False。

7. 身份运算符

身份运算符用于判断两个变量是否指向内存中的同一个对象(即检查对象的 id——内存地址是否相同),是 Python 中专门用于对象身份校验的运算符。

Python 中只有两个身份运算符,见表 8-13 所列。

表 8-13 身份运算符

运算符名 称作 用语法格式
is是运算符判断两个变量是否指向同一个对象(内存地址相同),是则返回 True变量 1 is 变量 2
is not不是运算符判断两个变量是否指向不同的对象(内存地址不同),是则返回 True变量 1 is not 变量 2

要搞懂身份运算符,必须先理解 Python 的对象内存模型。

  • (1)每个对象在内存中都有唯一的内存地址,可通过 id() 函数查看。
  • (2)is/is not 本质是比较两个变量的 id() 结果是否相同;而 == 是比较两个对象的值是否相同。
python
# 示例:查看内存地址
a = 10
b = 10
print(id(a))   # 输出:例如 140708464324736(不同环境值不同)
print(id(b))   # 输出:和 a 的 id 相同
print(a is b)  # True(id 相同)
print(a == b)  # True(值相同)

六、运算符的优先级

运算符的优先级规定了表达式中多个运算符的执行顺序,就像数学中的“先乘除后加减,有括号先算括号”,Python 会严格按照运算符优先级的高低来决定先执行哪个运算,再执行哪个运算,最终保证表达式的计算结果符合预期。

Python 中常用运算符的优先级(按照从高到低排序)见表 8-14 所列。

表 8-14 常用运算符的优先级

符 号名 称
指数(最高优先级)
~、+、-按位翻转、一元加号和减号(最后两个的方法名为 +@ 和 -@)
*、/、%、//乘、除、取模和取整除
+、-加法、减法
>>、<<右移、左移运算符
&按位与
^、\
<=、<、>、>=比较运算符
==、!=等于运算符
is、is not身份运算符
in、not in成员运算符
not逻辑非
and逻辑与
or逻辑或
指数(最高优先级)
=、%=、/=、//=、-=、+=、*=、**=赋值运算符
  • (1)括号兜底:不确定优先级时,直接加括号,如(a + b)* c,这样既正确又易读。
  • (2)核心层级记忆:只记“括号>幂>乘除>加减>比较>逻辑>赋值”。
  • (3)拆分复杂表达式:把长表达式拆成多个短表达式,降低优先级的理解成本。