外观
数字
Python3 支持整数(int)、浮点数(float)、复数(complex)三种类型的数字。
整数
整数支持加(+)、减(-)、乘(*)、除(/)等运算。
不同进制示例:
- 十六进制:
0xA0F - 八进制:
0o37
使用两个乘号表示乘方运算
平方:
python
# 3^2 => 9
3 ** 21
2
2
六次方:
python
# 10^6 = 1000000
10 ** 61
2
2
浮点数
所有带小数点的数都视为浮点数。
精度丢失问题
浮点数的计算会有精度问题
python
# 得到 `0.30000000000000004`
0.2 + 0.11
2
2
不存在完全没有浮点数精度丢失的通用编程语言,根源分两类:
- 硬件层面:计算机底层默认二进制存储小数,十进制有限小数(0.1、0.2)二进制是无限循环小数,截断存储必然丢失精度;
- 数学层面:任何有限位数存储方案,都无法完整表达全体实数,一定会存在近似。
精度丢失问题的解决方案有:
方案一:十进制高精度类型(财务、金融专用,无精度丢失)
核心原理:直接用十进制存储数字,不转二进制,完美适配小数(0.1、0.01、金额),不存在二进制循环小数问题。
使用 Python 内置的 decimal 标准库可以实现。
python
from decimal import Decimal
# 用字符串传入,避免float先污染精度
a = Decimal("0.1")
b = Decimal("0.2")
print(a + b) # 输出 0.3,无精度丢失1
2
3
4
5
2
3
4
5
方案二:分数精确运算(有理数完全无损)
原理:用分子 + 分母存储有理数,所有加减乘除分数运算 100% 精确,无任何近似。
使用 Python 标准库 fractions 可以实现。
python
from fractions import Fraction
a = Fraction("0.1")
b = Fraction("0.2")
print(a + b) # 3/1,完全精确1
2
3
4
2
3
4
缺点:只能处理有理数,无法精确表示无理数(π、√2);复杂运算分母极易爆炸,性能极差。
整数和浮点数
将任意两个数相除时,结果总是浮点数,即便这两个数都是整数且能整除:
python
# 得到 `2.0`
4 / 21
2
2
无论是哪种运算,只要有操作数是浮点数,默认得到的总是浮点数,即便结果原本为整数也是如此。
数中的下划线
书写很大的数时,可使用下划线将其中的数字分组,使其更清晰易读(Python 3.6开始支持):
python
# 其实这个下划线并不需要从右往左每 3 个数字加一个,你写 `14_00_0_0_00_000` 也是 ok 的,只是不太符合大众习惯
universe_age = 14_000_000_000
# 得到 `14000000000`(Python不会打印其中的下划线)
print(universe_age)1
2
3
4
5
2
3
4
5
同时给多个变量赋值
可在一行代码中给多个变量赋值,这有助于缩短程序并提高其可读性。这种做法最常用于将一系列数赋给一组变量。
python
# 一次性给 a b c 三个变量赋值
a, b, c = 10, 20, 30
print(a) # 10
print(b) # 20
print(c) # 301
2
3
4
5
2
3
4
5
等价写法:
python
# 不使用多变量赋值,要写三行
a = 10
b = 20
c = 301
2
3
4
2
3
4
常量
常量类似于变量,但其值在程序的整个生命周期内保持不变。Python没有内置的常量类型,但Python程序员会使用全大写来指出应将某个变量视为常量,其值应始终不变。