在 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基本数据类型之数字