数字
Python 支持三种数值类型:
- 整型(int),可以是正负整数,不带有小数点。Python3 的整数没有大小限制,可以当作 Long 类型使用。
- 浮点型(float),由整数和小数部分组成,浮点型也常用科学计数法表示。
- 复数(complex),由实数和虚数部分组成可以使用
a+bj
或者complex(a, b)
表示。
整型数值还可以使用十六进制、八进制和二进制来表示,其中前缀0x
表示十六进制数值,0o
表示八进制,0b
表示二进制。反过来,可以使用函数hex()
、oct()
、bin()
来分别获得整型数值的十六进制、八进制和二进制表示。
在很多时候我们经常需要进行数字类型转换,数据类型转换只需要将数据类型作为函数名即可,例如:int(x)
。复数类型转换可以接受两个参数,分别作为复数的实数部分和虚数部分。
之前运算符中的整除运算符://
,在进行计算时需要注意,如果左右操作数都是整型,那么其将会返回整型结果,如果有一个操作数是浮点型,那么就会返回浮点型结果。
浮点型数值是不精确数值,其在进行计算的时候也是不精确的,所以在使用时需要严加注意。Python 提供了多种可供精确计算带小数点的数值的库或者类,后文将拣选部分予以介绍。
分数计算
模块fractions
提供了一个名为Fraction
的类,用以支持分数类型及计算。Fraction 类有以下两个构造函数:
class fractions.Fraction(numerator=0, denominator=1) # numerator 为分子,denominator 为分母
class fractions.Fraction(int|float|str|Decimal|Fraction)
使用分子和分母实例化分数类时,两者需要均为 int
类型或者 numbers.Rational
类型,分母为 0
会抛出ZeroDivisionError
的异常。
分数类型可以直接使用运算操作符进行计算,返回结果也为 Fraction
类型实例,但是 print()
的数值则是约分化简后的字符串分数形式。
from fractions import Fraction
x = Fraction(2, 10)
y = Fraction(3, 5)
z = x + y # z 的值为 Fraction(4, 5)
print(z) # 会输出"4/5"
精确小数计算
模块decimal
提供了一个Decimal
数据类型用于精确小数计算,并且可以指定其计算精度。其具体使用可参考以下示例:
import decimal
decimal.getcontext().prec = 4 # 设定全局计算精度为 4 位小数
print(decimal.Decimal(1) / decimal.Decimal(7)) # 会输出"0.1429"
with decimal.loacalcontext() as ctx:
ctx.prec = 2 # 设定当前上下文计算精度为 2 位小数
print(decimal.Decimal('1.00') / decimal.Decimal('3.00')) # 输出"0.33"
数学计算
Python3 中的数学计算主要是由math
模块提供的,该模块中提供了以下函数供使用。
函数 | 功能 | 返回值类型 |
---|---|---|
acos(x) | 返回 x 的反余弦弧度值 | 浮点型 |
asin(x) | 返回 x 的反正弦弧度值 | 浮点型 |
atan(x) | 返回 x 的反正切弧度值 | 浮点型 |
atan2(y, x) | 返回给定的 x 及 y 坐标值的反正切值 | 浮点型 |
ceil(x) | 返回数字的进位整数 | 整型 |
cos(x) | 返回 x 弧度的余弦值 | 浮点型 |
degrees(x) | 将弧度转换为角度 | 浮点型 |
exp(x) | 返回\( e^x \) | 浮点型 |
fabs(x) | 返回 x 的绝对值 | 浮点型 |
floor(x) | 返回 x 的舍位整数 | 整型 |
gcd(x, y) | 返回 x 与 y 的最大公约数 | 整型 |
hypot(x, y) | 返回欧几里得范数,\( \sqrt{x^2+y^2} \) | 浮点型 |
log(x) | 返回\( ln\ x \) | 浮点型 |
log(x, y) | 返回\( log_{y}\ x \) | 浮点型 |
log10(x) | 返回\( log_{10}\ x \) | 浮点型 |
modf(x) | 返回 x 的整数与小数部分 | 元组 |
pow(x, y) | 返回\( x^y \) | 浮点型 |
radians(x) | 将角度 x 转换为弧度 | 浮点型 |
sin(x) | 返回 x 弧度的正弦值 | 浮点型 |
sqrt(x) | 返回\( \sqrt{x} \) | 浮点型 |
tan(x) | 返回 x 弧度的余切值 | 浮点型 |
随机数生成
随机数生成功能是由random
模块提供的,该模块提供了以下常用函数供使用。
函数 | 功能 | 返回值类型 |
---|---|---|
choice(seq) | 从序列中随机挑选一个元素 | 由序列内容决定 |
randrange([start], stop, [step]) | 从指定范围内,按照指定基数递增的集合中获取一个随机数,基数默认为 1 | 由序列内容决定 |
random() | 随机生成一个\( [0, 1) \)范围内的实数 | 浮点型 |
seed([x]) | 改变随机数发生器种子 | |
shuffle(lst) | 将序列中的元素随机排序 | |
uniform(x, y) | 随机生成一个\( [x, y] \)范围内的实数 |
浮点数取整
round()
函数是 Python 标准库提供的功能,不需要加载任何模块即可使用。该函数使用的进舍准则与日常的“四舍五入”有所不同,其进舍的处理方法采用统计学标准,使得进舍后数值变化对系统误差影响降低到最低。
round()
接受两个参数,一个为待处理的数字,一个为小数保留位数,其中小数保留位数默认为 0。在进行取整时,round()
会遵循以下规则。
- 要求保留位数的后一位如果是 4 或者 4 以下的数字,则舍去,例如 4.124 保留两位小数为 4.12。
- 要求保留位数的后一位如果是 6 或者 6 以上的数字,则进位,例如 4.126 保留两位小数为 4.13。
- 如果保留位数的后一位是 5,并且该位数后有数字,哪怕是 0.00000000001 之类的,则进位,例如 4.1250001,保留两位小数为 4.13。
- 如果保留位数的后一位是 5,且该位后没有数字,则根据保留位采用“奇进偶舍”的规则进行进舍,例如 3.35 保留一位小数为 3.4。
Python 的进舍规则是遵照《GB/T8170-2008 数值修约规则与极限数值的表示和判定》来进行处理的,其中对于数值修约规则,可根据以下口诀来记忆。
五后非零都进一,
五后皆零视奇偶,
五前为偶应舍去,
五前为奇则进一,
不论数字多少位,
都要一次修约成。