WithCoderWithCoderWithCoder

Python基本数据类型之数字

    在 Python3 中,数字的定义比较简单,包括整数(int)、浮点数(float)、布尔值(bool)和复数(complex)。像大多数编程语言一样,数值类型的赋值和计算都是很直观的。

    对于数字而言,除了进行基本的运算(例如:算术运算、比较运算)之外,Python 还提供了类型间的相互转换功能,以及其他的高级操作。

    注意:

        在 Python2 中是没有布尔型的,它用数字 0 表示 False,用 1 表示 True。到 Python3 中,把 True 和 False 定义成关键字了,但它们的值还是 1 和 0,它们可以和数字相加。

    数字类型简介:

    1. int(整型):也被称为整数,是正或负整数,不带小数点。Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型。

    2. float(浮点型):浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示(2.5e2 = 2.5 x 102 = 250)

    3. bool(布尔值):包含True(1)和 False(0)

    4. complex(复数):复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型

    各类型举例如下(使用type()函数返回对象类型):

>>> type(123)
<class 'int'> # 整数
>>> type(1.23)
<class 'float'> # 浮点型
>>> type(True)
<class 'bool'> # 布尔值
>>> type(1.2 + 3.0j)
<class 'complex'> # 复数

    和其他编程语言一样,在Python中除了常用的十进制数字类型之外,还可以使用二进制(以 2 为基数)、八进制(以 8 为基数)和十六进制(以 16 为基数)来表示数字。可以在数字前面放置相应的前缀来表示这些数字:

数字系统前缀
十进制(Decimal)
二进制(Binary)‘0b’ 或者 ‘0B’
八进制(Octal)‘0o’ 或者 ‘0O’
十六进制(Hexadecimal)‘0x’ 或者 ‘0X’

    举例如下:

>>> 123 # 十进制
123
>>> 0b1111011 # 二进制
123
>>> 0o173 # 八进制
123
>>> 0x7B # 十六进制
123
>>>

    此外,十进制还可以转换为二进制、八进制、十六进制:

>>> num = 123 # 十进制
>>> bin(num) # 十进制转二进制
'0b1111011'
>>> oct(num) # 十进制转八进制
'0o173'
>>> hex(num) # 十进制转十六进制
'0x7b'
>>>

    数字类型转换

    一般情况下,数据的类型的转换通常是由编译系统自动进行的,不需要人工干预,这被称为隐式类型转换。但如果程序要求一定要将某一类型的数据转换为另外一种类型,则可以利用强制类型转换运算符进行转换,这种强制转换过程称为显式类型转换

    在进行数字运算(例如:加法、减法)时,如果其中的一个操作数是浮点数,则程序会将整数隐式(自动)转换为浮点数。

>>> 1 + 2.3
3.3
>>>

    可以看到,1(整数)被转换为 1.0(浮点数),计算结果(3.3)也是一个浮点数。

    除此之外,还可以使用 int()、float() 和 complex() 等内置函数来显式转换类型,这些函数甚至可以将字符串转换为数字。

>>> int(1.23)
1
>>> float(1)
1.0
>>> float('1.23')
1.23
>>> complex('1+2.3j')
(1+2.3j)
>>>

    从 float 转换为 int 时,数字将被截断(整数更接近零)。

    Decimal

    通常,在使用内置类 float 时,会执行一些“匪夷所思”的计算。例如,我们知道 1/3 等于 0.333…(无限循环),0.1 + 0.2 等于 0.3,但 Python 计算结果却不一样:

>>> 1/3
0.3333333333333333
>>> 0.1 + 0.2
0.30000000000000004
>>>

    从上面的运行结果可以看到,浮点数在计算机硬件中以二进制小数来表示,因为计算机只能理解二进制(0 和 1)。因此,大部分十进制小数都不能准确地存储在计算机中。例如,十进制小数 0.1,将转换为无限长的二进制小数 0.000110011001100110011…,而计算机存储的位数是有限的。也就是说,转换为二进制后,只会接近十进制的 0.1,但永远不会相等。因此,这是计算机硬件的局限性,而不是 Python 中的错误,这在其他语言如PHP中同样存在相似问题。

    为了解决这个问题,可以使用 Python 自带的 decimal 模块。虽然浮点数的精度最高可达 15 位,但 decimal 模块可自定义精度。

>>> import decimal
>>> decimal.Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> decimal.getcontext() # 当前上下文
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[FloatOperation], traps=[InvalidOperation, DivisionByZero, Overflow])
>>> decimal.getcontext().prec # 精度
28
>>> decimal.getcontext().prec = 4
>>> decimal.Decimal(1)/decimal.Decimal(3)
Decimal('0.3333')
>>>

    除此之外,它也保留了重要意义。我们知道 25.50 比 25.5 更精确,因为 25.50 有两个有效的小数位。

>>> from decimal import Decimal as D
>>> D('0.1') + D('0.2')
Decimal('0.3')
>>> D('2.0') * D('2.50')
Decimal('5.000')
>>>

    注意: 计算结果末尾的 0

    有人可能会问:既然 Decimal 这么棒,为什么每次不使用 Decimal 来代替 float 呢?主要原因是效率,float 运算要比 Decimal 运算更快。

    何时使用 Decimal,而不是 float 呢?在以下情况下,通常使用 Decimal:

    • 当在做金融应用时,需要精确表示。

    • 当想要控制所需的精度级别时

    • 当想要实现有效的小数位概念时

    • 当我们想要像在学校里学到的那样进行小数运算时

    常用的数字运算模块

    数学函数   

函数返回值 ( 描述 )
abs(x)返回数字的绝对值,如abs(-10) 返回 10
ceil(x)返回数字的上入整数,如math.ceil(4.1) 返回 5

cmp(x, y)

如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。 Python 3 已废弃,使用 (x>y)-(x<y) 替换
exp(x)返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045
fabs(x)返回数字的绝对值,如math.fabs(-10) 返回10.0
floor(x)返回数字的下舍整数,如math.floor(4.9)返回 4
log(x)如math.log(math.e)返回1.0,math.log(100,10)返回2.0
log10(x)返回以10为基数的x的对数,如math.log10(100)返回 2.0
max(x1, x2,...)返回给定参数的最大值,参数可以为序列。
min(x1, x2,...)返回给定参数的最小值,参数可以为序列。
modf(x)返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。
pow(x, y)x**y 运算后的值。
round(x [,n])

返回浮点数 x 的四舍五入值,如给出 n 值,则代表舍入到小数点后的位数。

其实准确的说是保留值将保留到离上一位更近的一端。

sqrt(x)返回数字x的平方根。

    随机数函数

    随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。

    Python包含以下常用随机数函数:

函数描述
choice(seq)从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。
randrange ([start,] stop [,step])从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1
random()随机生成下一个实数,它在[0,1)范围内。
seed([x])改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。
shuffle(lst)将序列的所有元素随机排序
uniform(x, y)随机生成下一个实数,它在[x,y]范围内。


欢迎分享交流,转载请注明出处:WithCoder » Python基本数据类型之数字