数字

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()会遵循以下规则。

  1. 要求保留位数的后一位如果是 4 或者 4 以下的数字,则舍去,例如 4.124 保留两位小数为 4.12。
  2. 要求保留位数的后一位如果是 6 或者 6 以上的数字,则进位,例如 4.126 保留两位小数为 4.13。
  3. 如果保留位数的后一位是 5,并且该位数后有数字,哪怕是 0.00000000001 之类的,则进位,例如 4.1250001,保留两位小数为 4.13。
  4. 如果保留位数的后一位是 5,且该位后没有数字,则根据保留位采用“奇进偶舍”的规则进行进舍,例如 3.35 保留一位小数为 3.4。

Python 的进舍规则是遵照《GB/T8170-2008 数值修约规则与极限数值的表示和判定》来进行处理的,其中对于数值修约规则,可根据以下口诀来记忆。

四舍六入五考虑,
五后非零都进一,
五后皆零视奇偶,
五前为偶应舍去,
五前为奇则进一,
不论数字多少位,
都要一次修约成。