首页 > 编程笔记 > Python笔记

Python Number类型及用法(超级详细)

数据类型是一种编程语言的重要组成部分。Python 内置的基本数据类型主要有:Number(数值)、Bool(布尔)、String(字符串)、List(列表)、Tuple(元组)、Set(集合)、Dictionary(字典)等。本节教程先对Number类型进行讲解,Bool 布尔类型下节介绍。

Python 3.X 中的 Number 类型包括 int(整型)、float(浮点型)和 complex (复数)三种。通常,定义数值型变量并赋值可以一步完成,例如:

a = 123
b = -123


在 Python 环境中可以使用以下代码查看当前计算机可以使用的 int 类型的最大值:

import sys
print(sys.maxsize)

上述代码在 Windows 7 SP1 和 MacOS HighSierra 10.13.3 上的运行结果如下所示:

>>> import sys
>>> print(sys.maxsize)
9223372036854775807

需要注意的是,在 Python 2.X 中使用 sys.maxint 来查看当前计算机可以使用的 int 类型的最大值。

Python 的 float 类型浮点数用机器上浮点数的本机双精度(64bit)表示。和 C语言的 Double 类型相同,float 类型提供大约 17 位的精度以及从 -308 到 308 的指数。Python 不支持 32 位的单精度浮点数。如果程序需要精确控制区间和数字精度,可以考虑使用 numpy 模块。在 Python 3.X 中浮点数默认是 17 位精度。

关于单精度和双精度:C语言中浮点型分为单精度和双精度两种。单精度使用 float 定义,双精度使用 double 定义。在 Turbo C 中单精度型占 4 个字节(32 位)内存空间,其数值范围为 3.4×10-38~3.4×1038,只能提供七位有效数字。双精度型占 8 个字节(64 位)内存空间,其数值范围为 1.7×10-308~1.7×10308,可提供 16 位有效数字。

int 型和 float 型数值可以直接进行加减乘除、乘方和取余等运算,例如:

5 + 4           #加法
4.3 - 2         #减法
3 * 7            #乘法
2 / 4            #除法,得到一个浮点数
2 // 4           #除法,得到一个整数
17 % 3         #取余
2 ** 5           #乘方

上述代码的运行结果如下所示:

>>> 5 + 4
9
>>> 4.3 - 2
2.3
>>> 3 * 7
21
>>> 2 / 4
0.5
>>> 2 // 4
0
>>> 17 % 3
2
>>> 2 ** 5
32

需要注意的是,单除号/除法总是返回一个浮点数,要获取整数结果应使用双除号//操作符。在混合计算时,Python 会将整数转换成为浮点数。

在实际工作中会遇到需要使用更高精度(超过 17 位小数)的情况,可以使用 decimal 模块,配合 getcontext( ) 函数使用。例如:

from decimal import *
print(getcontext ())
getcontext().prec = 50
print(Decimal(1)/Decimal(9))
print(Decimal(1)/Decimal(19))
print(float(Decimal(1)/Decimal(19)))

上述代码执行结果如下所示:

>>> from decimal import *
>>> print(getcontext ())
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
>>> getcontext().prec = 50
>>> print(Decimal(1)/Decimal(9))
0.11111111111111111111111111111111111111111111111111
>>> print(Decimal(1)/Decimal(19))
0.052631578947368421052631578947368421052631578947368
>>> print(float(Decimal(1)/Decimal(19)))
0.05263157894736842


在具体工作中,很多时候需要将精度高的 float 型数值转换为精度低的数值,通俗来说就是“四舍五入”,舍弃小数点右边的部分数据。在 Python 中通常使用内置的 round( ) 函数完成,例如执行:

round(1.5)

将得到结果“2”。但 round( ) 函数对于内置的数据类型而言,执行结果往往并不像所期待的那样,如果只有一个数作为参数,当不指定位数的时候,返回的是一个整数,而且是最靠近的整数(类似四舍五入)。

但是当出现“.5”的时候,两边的距离都一样,round( ) 取靠近的偶数。例如执行:

round(2.5)
round(2.675)

上述代码执行结果为:

>>> round(2.5)
2
>>> round(2.675)
3


对于指定保留小数位数的情况,如果要舍弃的部分最左侧是“5”,且“5”左侧是奇数则直接舍弃,若“5”左侧是偶数则向上取整,例如执行:

round(2.635, 2)
round(2.645, 2)
round(2.655, 2)
round(2.665, 2)
round(2.675, 2)

上述代码的运行结果为:

>>> round(2.635, 2)
2.63
>>> round(2.645, 2)
2.65
>>> round(2.655, 2)
2.65
>>> round(2.665, 2)
2.67
>>> round(2.675, 2)
2.67


除了 round( ) 函数,math 模块中的 ceil( ) 和 floor( ) 函数也可以实现向上或向下取整。例如:

from math import ceil, floor
round(2.5)
ceil(2.5)
floor(2.5)
round(2.3)
ceil(2.3)
floor(2.3)

上述代码的运行结果下所示:

>>> from math import ceil, floor
>>> round(2.5)
2
>>> ceil(2.5)
3
>>> floor(2.5)
2
>>> round(2.3)
2
>>> ceil(2.3)
3
>>> floor(2.3)
2


Python 使用 complex( ) 函数创建复数。其参数可以接受数值或字符串,例如:

print(complex(1))         #只有实部1
print(complex(1, 2))     #实部为1,虚部为 2
print(complex('1+2j'))  #实部为1,虚部为 2

上述代码的运行结果为:

>>> print(complex(1))
(1+0j)
>>> print(complex(1, 2))
(1+2j)
>>> print(complex('1+2j'))
(1+2j)


第二个参数不能传入字符串。当希望从一个字符串的复数形式转换复数时,需要注意的是字符串中不能出现空格,比如可以写成:

complex('1+2j')

而不能写成

complex('1    +2j')

complex('1    +       2j')

否则会返回 ValueError 异常。

所有教程

优秀文章