Python 学习笔记 3:数字类型与常用运算符


一、背景

上一篇整理了 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

数字和运算符是后续流程控制、函数、数据处理的基础。

比如:

  • 判断一个数字是否大于某个阈值
  • 对列表中的数字求和
  • 判断某个元素是否在列表中
  • 比较两个对象是否是同一个对象
  • 使用 andor 组合多个判断条件

这些都会用到本篇的内容。

二、Python 程序和对象

在 Python 中,程序大概可以从下面几个层次理解:

包 -> 模块 -> 语句 -> 表达式 -> 对象

例如一个 .py 文件就是一个模块,模块中可以写语句,语句中会包含表达式,表达式会创建或处理对象。

Python 中常见的内置对象包括:

类型 示例
数字 13.14
字符串 "hello"
列表 [1, 2, 3]
字典 {"name": "xiaoming"}
元组 (1, 2)
集合 {1, 2, 3}
布尔值 TrueFalse
None None
函数、模块、类 defimportclass

数字也是对象。一旦创建了数字对象,就可以对它执行加、减、乘、除、比较等操作。

三、数字类型

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 支持复数,虚部使用 jJ

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 为假")

短路逻辑

andor 有短路特性。

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 作为变量名,建议使用 numbersitemsnames 这类更明确的名字。

十二、身份运算符

身份运算符用于判断两个变量是否引用同一个对象。

运算符 说明
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 数字类型和常用运算符:

  1. 数字类型包括整数、浮点数、复数、分数和 Decimal。
  2. 浮点数可能有精度问题,金额类计算可以考虑 Decimal
  3. 数字格式化可以使用 %,更推荐使用 f-string。
  4. 常用数学能力来自内置函数、math 模块和 random 模块。
  5. 算术运算符用于数学计算。
  6. 比较运算符返回布尔值,常和 if 配合使用。
  7. 位运算符用于二进制层面的计算。
  8. 逻辑运算符支持短路判断。
  9. 成员运算符用于判断元素是否存在。
  10. 身份运算符用于判断两个变量是否引用同一个对象。

这些内容是后面学习条件判断、循环、函数和数据结构时的基础。


文章作者: hnbian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hnbian !
评论
  目录