一、背景
上一篇整理了 Python 中的变量、数据类型和编码规范。
这一篇继续整理 Python 中的数字类型和常用运算符。对应的练习代码主要包括:
07数字简介.py
08数字常量.py
09数字的现实格式.py
10小数对象的Decimal.py
11数字内置函数和模块.py
12算术运算.py
13关系运算符.py
14位运算符.py
15逻辑运算符.py
16成员运算符.py
17身份运算符.py
18运算符优先级.py
数字和运算符是后续流程控制、函数、数据处理的基础。
比如:
- 判断一个数字是否大于某个阈值
- 对列表中的数字求和
- 判断某个元素是否在列表中
- 比较两个对象是否是同一个对象
- 使用
and、or组合多个判断条件
这些都会用到本篇的内容。
二、Python 程序和对象
在 Python 中,程序大概可以从下面几个层次理解:
包 -> 模块 -> 语句 -> 表达式 -> 对象
例如一个 .py 文件就是一个模块,模块中可以写语句,语句中会包含表达式,表达式会创建或处理对象。
Python 中常见的内置对象包括:
| 类型 | 示例 |
|---|---|
| 数字 | 1、3.14 |
| 字符串 | "hello" |
| 列表 | [1, 2, 3] |
| 字典 | {"name": "xiaoming"} |
| 元组 | (1, 2) |
| 集合 | {1, 2, 3} |
| 布尔值 | True、False |
| None | None |
| 函数、模块、类 | def、import、class |
数字也是对象。一旦创建了数字对象,就可以对它执行加、减、乘、除、比较等操作。
三、数字类型
1. 整数
整数包括正整数、负整数和零。
age = 18
count = 0
offset = -1
print(age)
print(count)
print(offset)
整数可以使用不同进制表示:
num = 100
print(bin(num)) # 二进制
print(oct(num)) # 八进制
print(hex(num)) # 十六进制
输出类似:
0b1100100
0o144
0x64
也可以把字符串按指定进制转成整数:
print(int("100", 10))
print(int("100", 2))
print(int("100", 8))
print(int("100", 16))
2. 浮点数
浮点数就是小数。
price = 9.9
rate = 0.15
print(price)
print(rate)
浮点数也可以使用科学计数法:
num = 1.0e3
print(num)
输出:
1000.0
3. 复数
Python 支持复数,虚部使用 j 或 J。
c = 5 + 2j
print(c.real)
print(c.imag)
输出:
5.0
2.0
也可以使用 complex() 创建复数:
c = complex(5, 2)
print(c)
4. 分数
如果需要表示分数,可以使用 fractions.Fraction。
from fractions import Fraction
f1 = Fraction(3, 4)
f2 = Fraction(5, 7)
print(f1)
print(f2)
print(f1 + f2)
print(f1 * f2)
输出:
3/4
5/7
41/28
15/28
四、浮点数精度与 Decimal
浮点数在计算时可能出现精度问题。
a = 4.2
b = 2.1
print(a + b)
输出可能是:
6.300000000000001
这是因为计算机底层并不能精确表示所有十进制小数。
如果需要更精确的小数计算,可以使用 decimal.Decimal。
from decimal import Decimal
a = Decimal("4.2")
b = Decimal("2.1")
print(a + b)
输出:
6.3
这里建议使用字符串创建 Decimal:
Decimal("4.2")
不要写成:
Decimal(4.2)
因为 4.2 作为浮点数时已经可能带有精度问题。
控制精度
可以通过 decimal.getcontext().prec 控制计算精度。
import decimal
decimal.getcontext().prec = 4
result = decimal.Decimal(1) / decimal.Decimal(7)
print(result)
输出:
0.1429
Decimal 更适合金额、金融等对小数精度比较敏感的场景。普通科学计算、图形计算中,大多数情况下直接使用浮点数即可。
五、数字格式化
旧式 % 格式化中,常见数字格式如下:
| 格式 | 说明 |
|---|---|
%d |
十进制整数 |
%o |
八进制整数 |
%x |
十六进制小写 |
%X |
十六进制大写 |
%f |
浮点数 |
%e |
科学计数法 |
%% |
输出百分号 |
示例:
year = 2023
month = 10
day = 8
print("%04d-%02d-%02d" % (year, month, day))
value = 8.123
print("%06.2f" % value)
print("%d" % 10)
print("%o" % 10)
print("%02x" % 10)
print("%04X" % 10)
print("%.2e" % 1.2888)
输出:
2023-10-08
008.12
10
12
0a
000A
1.29e+00
现在写 Python 代码,更常用的是 f-string。
year = 2023
month = 10
day = 8
print(f"{year:04d}-{month:02d}-{day:02d}")
value = 8.123
print(f"{value:06.2f}")
f-string 可读性更好,也更适合后续维护。
六、数字常用函数和模块
1. 内置函数
常见数字相关内置函数:
| 函数 | 说明 |
|---|---|
abs(x) |
绝对值 |
pow(x, y) |
x 的 y 次方 |
round(x) |
四舍五入 |
max() |
最大值 |
min() |
最小值 |
sum() |
求和 |
bin() |
转二进制 |
oct() |
转八进制 |
hex() |
转十六进制 |
ord() |
字符转编码 |
chr() |
编码转字符 |
示例:
nums = [2, 3, 5, 7, 0, 23, 21, -11, 0.4]
print(abs(-2))
print(pow(3, 4))
print(round(3.4999))
print(max(nums))
print(min(nums))
print(sum(nums))
print(bin(3))
print(oct(3))
print(hex(3))
print(ord("a"))
print(chr(90))
2. math 模块
math 模块提供了更多数学函数。
import math
print(math.floor(3.2)) # 向下取整
print(math.ceil(4.5)) # 向上取整
print(math.pow(3, 4)) # 幂
print(math.sqrt(25)) # 开平方
print(math.fabs(-0.23)) # 浮点绝对值
print(math.modf(3.14)) # 拆分小数和整数
print(math.pi) # 圆周率
print(math.e) # 自然常数
如果需要对浮点数列表求和,math.fsum() 比普通 sum() 更适合处理浮点误差。
nums = [1.23e18, 1, -1.23e18]
print(sum(nums))
print(math.fsum(nums))
3. random 模块
random 模块用于生成随机数。
import random
print(random.random()) # 0 到 1 之间的小数
print(random.choice(range(1, 5))) # 从序列中随机选一个
items = [2, 3, 5, 7, "A", "C", "d"]
print(random.choice(items))
random.shuffle(items)
print(items)
print(random.randrange(5, 15, 2))
print(random.uniform(4, 24))
random 常用于测试数据、随机选择、打乱顺序等场景。
4. eval 要慎用
练习代码中有一个例子:
num = 99
expr = "num + 1"
result = eval(expr)
print(result)
eval() 会把字符串当作 Python 代码执行,所以它有安全风险。
如果字符串来自用户输入、文件、网络请求,就不要直接 eval()。
七、算术运算符
常见算术运算符如下:
| 运算符 | 说明 | 示例 |
|---|---|---|
+ |
加法 | a + b |
- |
减法 | a - b |
* |
乘法 | a * b |
/ |
除法 | a / b |
% |
取模 | a % b |
** |
幂 | a ** b |
// |
整除 | a // b |
示例:
a = 21
b = 10
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a % b)
print(2 ** 3)
print(10 // 5)
注意:/ 的结果通常是浮点数。
print(10 / 5) # 2.0
print(10 // 5) # 2
八、比较运算符
比较运算符用于判断两个值之间的关系,结果是布尔值。
| 运算符 | 说明 |
|---|---|
== |
等于 |
!= |
不等于 |
> |
大于 |
< |
小于 |
>= |
大于等于 |
<= |
小于等于 |
示例:
a = 21
b = 10
print(a == b)
print(a != b)
print(a > b)
print(a < b)
print(a >= b)
print(a <= b)
比较运算符经常和 if 一起使用。
score = 85
if score >= 60:
print("及格")
else:
print("不及格")
九、位运算符
位运算符会把数字看成二进制进行计算。
| 运算符 | 说明 |
|---|---|
& |
按位与 |
| ` | ` |
^ |
按位异或 |
~ |
按位取反 |
<< |
左移 |
>> |
右移 |
示例:
a = 60 # 0011 1100
b = 13 # 0000 1101
print(a & b)
print(a | b)
print(a ^ b)
print(~a)
print(a << 2)
print(a >> 2)
位运算在普通业务代码中不一定常用,但在权限标记、底层协议、二进制处理等场景中会遇到。
十、逻辑运算符
Python 中常见逻辑运算符:
| 运算符 | 说明 |
|---|---|
and |
与 |
or |
或 |
not |
非 |
示例:
a = 10
b = 20
if a and b:
print("a 和 b 都为真")
if a or b:
print("a 或 b 至少一个为真")
if not a:
print("a 为假")
短路逻辑
and 和 or 有短路特性。
if False and print("不会执行"):
pass
if True or print("不会执行"):
pass
对于 and:
前面已经是 False,整体一定是 False,后面不会继续判断
对于 or:
前面已经是 True,整体一定是 True,后面不会继续判断
短路逻辑在写条件判断时很常用。
十一、成员运算符
成员运算符用于判断某个值是否在序列中。
| 运算符 | 说明 |
|---|---|
in |
在里面 |
not in |
不在里面 |
示例:
numbers = [1, 2, 3, 4, 5]
print(2 in numbers)
print(20 not in numbers)
字符串也可以使用成员运算符:
text = "hello python"
print("python" in text)
print("java" not in text)
注意:不要使用 list 作为变量名,建议使用 numbers、items、names 这类更明确的名字。
十二、身份运算符
身份运算符用于判断两个变量是否引用同一个对象。
| 运算符 | 说明 |
|---|---|
is |
是同一个对象 |
is not |
不是同一个对象 |
可以使用 id() 查看对象标识。
a = [1, 2, 3]
b = a
c = a[:]
print(b is a)
print(b == a)
print(c is a)
print(c == a)
输出:
True
True
False
True
这里要重点区分:
is 判断是不是同一个对象
== 判断值是否相等
所以不要把 is 当成 == 使用。
十三、可变对象与不可变对象
练习代码中提到了可变对象和不可变对象。
常见可变对象:
- 列表
- 字典
- 集合
- 自定义对象
常见不可变对象:
- 数字
- 字符串
- 元组
例如数字是不可变对象:
a = 10
print(id(a))
a = 20
print(id(a))
这里并不是把原来的 10 改成了 20,而是让变量 a 指向了另一个对象。
十四、运算符优先级
运算符有优先级。比如乘除优先级高于加减:
result = 20 + 10 * 15 / 5
print(result)
可以通过括号改变优先级:
a = 20
b = 10
c = 15
d = 5
print((a + b) * c / d)
print(((a + b) * c) / d)
print((a + b) * (c / d))
print(a + (b * c) / d)
常见优先级可以简单记成:
括号 > 幂 > 正负号 > 乘除取模 > 加减 > 位移 > 位运算 > 比较 > 身份/成员 > not > and > or
实际写代码时,如果表达式比较复杂,不建议依赖记忆优先级,直接加括号会更清楚。
十五、本篇总结
这一篇整理了 Python 数字类型和常用运算符:
- 数字类型包括整数、浮点数、复数、分数和 Decimal。
- 浮点数可能有精度问题,金额类计算可以考虑
Decimal。 - 数字格式化可以使用
%,更推荐使用 f-string。 - 常用数学能力来自内置函数、
math模块和random模块。 - 算术运算符用于数学计算。
- 比较运算符返回布尔值,常和
if配合使用。 - 位运算符用于二进制层面的计算。
- 逻辑运算符支持短路判断。
- 成员运算符用于判断元素是否存在。
- 身份运算符用于判断两个变量是否引用同一个对象。
这些内容是后面学习条件判断、循环、函数和数据结构时的基础。