考点 4. Python 的基础知识
掌握 Python 的基础知识,包括标识符、常量、变量、运算符、数据类型。
一、语法知识与书写规范
1. Python 严格区分字母大小写
Python 是严格区分字母大小写的,这一点在变量、函数、关键字、类名等所有标识符的使用中都适用。
2. 缩进
缩进是 Python 的"灵魂",用于区分循环、判断、函数等代码块的范围。
Python 不用大括号({})划分代码块,而是靠缩进(空格/制表符)来划分的,同一级代码必须保持相同的缩进(推荐用 4 个空格,不要混用空格和 Tab)。
# 正确缩进(if 判断的代码块缩进 4 个空格)
age = 18
if age >= 18:
print("成年了") # 缩进 4 个空格,属于 if 的代码块
print("可以投票") # 同一级,缩进一致
print("结束") # 无缩进,不属于 if 的代码块
# 错误缩进(会报错 IndentationError)
if age >= 18:
print("成年了") # 缺少缩进,直接报错
3. 注释
注释是代码的说明文字,核心作用是让代码更容易被理解。注释中的内容会被 Python 解释器完全忽略,不会被执行。
- ①单行注释:用#开头,注释内容在#后面。
- ②多行注释:用三引号包裹,有"×××"和'×××'两种形式。
# 这是单行注释,解释下面代码的作用
name = "张三" # 定义变量存储姓名
"""
这是多行注释
可以写很多行
用于解释函数/类的功能
"""
def say_hello():
print("你好")
4. 语句结束
Python 不使用分号(;)结束语句(加分号也能运行,但不推荐),一行代码就是一条语句。若想在一行中写多条语句,则需要用分号分隔(仅特殊场景使用)。
# 推荐写法(无分号)
print("Hello")
a = 5
# 不推荐(一行多条语句)
print("Hi"); b = 6
5. 变量
变量是程序中用于存储可变数据,并可通过自定义名称访问该数据的标识符。在 Python 中定义变量无须声明类型,赋值即创建。
(1) 规则
变量名由字母、数字、下划线组成,不能以数字开头,区分字母大小写,不能和 Python 关键字重复,如 if、for、print 等。
# 变量名 = 值(赋值运算符是=,不是数学中的"等于")
# 正确变量名
user_name = "李四" # 推荐用下划线分隔
age18 = 18 # 数字可在后面
Age = 20 # 区分大小写,Age 和 age 是两个变量
# 错误变量名
18age = 18 # 数字开头,报错
if = 10 # 用关键字当变量名,报错
(2) 动态类型
变量的类型由赋值的值决定,且可以随时修改类型,无须提前声明。
a = 10 # a 是整数(int)
a = "hello" # a 变成字符串(str),完全合法
a = [1,2,3] # a 又变成列表(list)
print(type(a)) # 输出 <class 'list'>,type()查看变量类型
6. 换行与续行
一行代码太长时,可用反斜杠\续行,或利用括号()自动续行。
# 反斜杠续行
total = 1 + 2 + 3 + \
4 + 5 + 6
# 括号自动续行(更简洁)
total = (1 + 2 + 3 +
4 + 5 + 6)
7. 引号
Python 里的单引号(')、双引号(")、三引号("""''')的核心作用都是定义字符串,但适用场景有所不同。
(1) 单引号 & 双引号(最常用,功能等价)
两者都用来定义单行字符串,唯一的区别是当字符串内部包含其中一种引号时,就用另一种引号包裹字符串,以避免冲突。
- ①基础用法(无冲突时,任选其一)
# 单引号定义字符串
name = '张三'
print(name) # 输出:张三
# 双引号定义字符串
age = "18岁"
print(age) # 输出:18岁
- ②避免引号冲突(核心区别)
# 正确写法:字符串内有单引号 → 用双引号包裹
text1 = "He said: 'I love Python'"
print(text1) # 输出:He said: 'I love Python'
# 错误写法(引号冲突,报错 SyntaxError)
# text2 = 'He said: 'I love Python'' # 解释器会把第一个'和第二个'配对,后面的内容报错
- ③转义符替代方案
如果必须用同一种引号,那么可在内部引号前加\(转义符),使其被 Python 识别为普通字符。
text3 = 'He said: \'I love Python\''
print(text3) # 输出:He said: 'I love Python'
(2) 三引号(单/双均可,功能一致)
既可用来定义多行字符串,也可用于多行注释(本质是未赋值的字符串),支持换行和内部任意引号。
- ①定义多行字符串
# 三双引号(推荐,和多行注释格式统一)
poem = """
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
"""
print(poem) # 输出带换行的完整诗句
# 三单引号(功能一样)
note = '''
姓名:张三
年龄:18
爱好:'Python 编程'、'阅读' # 内部可混写单/双引号
'''
print(note) # 输出包含换行和混合引号的内容
- ②作为多行注释
未赋值给变量的三引号字符串会被 Python 忽略,常用来写多行注释。
"""
这是多行注释
可以写很多行
解释下面函数的功能
"""
def add(x, y):
return x + y
8. 冒号
冒号是标记代码块的开始,在 if、for、while、def、class 等关键字后加冒号是告诉 Python 接下来是一个缩进的代码块,这也是 Python 缩进规则的配套语法。
(1) 条件判断(if/elif/else)
age = 18
if age >= 18: # 冒号标记 if 代码块开始
print("成年") # 缩进的代码块
else: # else 后也必须加冒号
print("未成年")
(2) 循环(for/while)
# for 循环
for i in range(3): # 冒号标记循环体开始
print(i) # 循环体代码块
# while 循环
count = 0
while count < 3: # 冒号标记循环体开始
print(count)
count += 1
(3) 函数/类定义
# 函数定义
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_Name | 123name、# score、—price | 以数字/特殊符号(#、—、空格等)开头 |
| 后续字符可包含字母、数字、下划线 | stu_01、book123、_num_5 | stu—01、a b、my@mail | 包含减号、空格、@等特殊字符 |
| 区分字母大小写 | Age 和 age 是两个不同的标识符 | — | Python 对大小写敏感 |
| 不能与关键字重复 | my_if、func_for | if、for | 关键字是 Python 的保留字,不可占用 |
3. 命名规范
推荐遵守的命名规范见表 8-2 所列。
表 8-2 标识符的命名规范
| 命名场景 | 规范(示例) |
|---|---|
| 变量/函数 | 小写字母+下划线(蛇形命名法):user_name、calculate_score() |
| 常量 | 全大写+下划线:MAX_SCORE、PI |
| 类 | 首字母大写(驼峰命名法):Student、UserInfo |
# 合法标识符(变量)
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 最基础的数值类型之一。整型可以进行的算法有+、—、*、/,以及其他操作,默认采用十进制。
# 正整数
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 或 0B | 0b1010(等价于十进制 10) | 计算机底层存储格式 |
| 八进制 | 0o 或 0O | 0o17(等价于十进制 15) | 传统 Unix 系统常用 |
| 十六进制 | 0x 或 0X | 0xFF(等价于十进制 255) | 编码、硬件编程常用 |
# 不同进制的整数
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) 不可变类型
整数是不可变类型,即一旦创建,值不能被修改。若对值进行修改,则会生成新的整数对象。
a = 10
print(id(a)) # 打印内存地址:如 140712894456848
a = a + 5 # 不是修改原 10,而是创建新整数 15,a 指向新地址
print(id(a)) # 新地址:如 140712894457008
2. 浮点类型
Python 中的浮点数(float)是带有小数部分的数字(也可通过科学计数法表示),用于表示连续的数值,是 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 是虚数单位。
# 定义复数:实部+虚部(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(虚部),可以直接访问但不能修改。
c = 3 + 4j
print("实部:", c.real) # 3.0(自动转为 float 类型)
print("虚部:", c.imag) # 4.0(自动转为 float 类型)
4. 布尔类型
布尔类型(bool)是 Python 中表示“真/假”“是/否”“成立/不成立”的基础数据类型,仅有 True 和 False 两个固定取值,True 表示“真”(等价于整数 1);False 表示“假”(等价于整数 0)。
# 直接定义布尔变量
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。
# 验证继承关系
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 外的所有非假值对象 |
# 数值转布尔
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)运算,整数或浮点数自动转复数。
# 整数 + 浮点数 → 结果为浮点数
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)
# 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)字符串与其他类型的转换
# 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()]
# 0/空值/空容器 → False
print(bool(0)) # False
print(bool("")) # False(空字符串)
print(bool([])) # False(空列表)
# 非 0/非空 → True
print(bool(1)) # True
(4)容器类型转换(list/tuple/dict)
# 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)基础运算符(+、-、*)
# 加法
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)除法相关(/、//)
# 普通除法(/):结果永远是浮点数,哪怕能整除
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)取模(%)
# 基本用法:求余数
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() 函数的简化写法。
# 2 的 3 次方
g1 = 2 ** 3
print("2 ** 3 =",g1) # 输出:2 ** 3 = 8
2. 赋值运算符
赋值运算符的核心作用是将右边的值赋给左边的变量。除了最基础的 =,Python 中还提供了结合算术运算的复合赋值运算符(如 +=、*=),可以简化代码书写,提升效率。
赋值运算按功能分为基础赋值和复合赋值两类,常见的赋值运算符见表 8-8 所列。
表 8-8 常见的赋值运算符
| 运算符 | 名 称 | 作用(等价写法) | 示 例 | 等价于 |
|---|---|---|---|---|
| = | 简单赋值 | 将右侧值赋给左侧变量 | a = 5 | — |
| += | 加法赋值 | 先加后赋值 | a += 3 | a = a + 3 |
| -= | 减法赋值 | 先减后赋值 | a -= 3 | a = a - 3 |
| *= | 乘法赋值 | 先乘后赋值 | a *= 3 | a = a * 3 |
| /= | 除法赋值 | 先除后赋值(结果为浮点数) | a /= 3 | a = a / 3 |
| //= | 整除赋值 | 先整除后赋值 | a //= 3 | a = a // 3 |
| %= | 取模赋值 | 先取模后赋值 | a %= 3 | a = a % 3 |
| **= | 幂运算赋值 | 先幂运算后赋值 | a **= 3 | a = a ** 3 |
(1)简单赋值运算符(=)
这是最基础的赋值运算符,也是所有赋值运算的核心。
【注】“=”不是“等于”,是“赋值”,表示“等于”用“==”。
# 基础用法:给变量赋值
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)复合赋值运算符(+=、-=、*= 等)
复合赋值是“运算+赋值”的简写,核心逻辑是先对变量执行算术运算,再将结果重新赋给该变量,一定要注意变量必须先定义才能进行复合赋值。
# 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 == 5 | True |
| != | 不等于 | 判断左右值是否不相等 | 5 != 3 | True |
| > | 大于 | 判断左值是否大于右值 | 7 > 3 | True |
| < | 小于 | 判断左值是否小于右值 | 7 < 3 | False |
| >= | 大于等于 | 判断左值是否大于等于右值 | 5 >= 5 | True |
| <= | 小于等于 | 判断左值是否小于等于右值 | 5 <= 3 | False |
(1)核心比较[等于(==)和不等于(!=)]
易混淆 =(赋值)和 ==(等于),这是必须重点区分的两个符号。
# 等于(==):判断值是否相等
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 码比较)。
# 数字大小比较
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 连接的判断。
# 连续比较:判断数值是否在某个区间
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)基础用法(布尔值运算)
先从纯布尔值的运算入手,理解最核心的逻辑规则。
# 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 具有短路求值特性,只要能确定最终结果,就不会执行后面的表达式,这是容易忽略但非常实用的特性。
# 第一个条件为 False,直接返回 False,不会执行后面的 print
False and print("这段代码不会执行") # 无输出
# 第一个条件为 True,才会执行后面的部分
True and print("这段代码会执行") # 输出:这段代码会执行
(3)非布尔值的逻辑运算
Python 中,所有非布尔值都可以参与逻辑运算,运算中会先将其转换为布尔值[bool()]再进行逻辑运算,但返回的是原值而非转换后的布尔值,这是关键区别。
# 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,否则为 0 | 6&3 的结果为 2 |
| \ | 按位或 | 两个数的二进制对应位只要有一个为 1,结果位就是 1,否则为 0 | |
| ^ | 按位异或 | 对应位不同则为 1,相同则为 0 | 6^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)。
# 示例 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() 结果是否相同;而 == 是比较两个对象的值是否相同。
# 示例:查看内存地址
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)拆分复杂表达式:把长表达式拆成多个短表达式,降低优先级的理解成本。