Python 数字

网友投稿 1019 2022-10-26

Python 数字

Python 数字

简述

在 Python 中,对于数字的定义很简单 - 整数、浮点数和复数,分别被定义为 int、float 和 complex 类。只要数学不是体育老师教的,绝大部分人学起来都不会有任何问题。

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

数字类型

在 Python 中,支持三种不同的数字类型:

int(整型):也被称为整数,是正或负整数,不带小数点。float(浮点型):由整数部分与小数部分组成,浮点型也可以使用科学计数法表示。complex(复数):以 x + yj 的形式构成,其中 x 是实部,y 是虚部。

注意: Py3.x 去除了 long 类型,现在只有一种整型 - int,表示为长整型。

>>> type(5)>>> >>> type(2.5)>>> >>> c = 2.5 + 5.0j # 复数>>> type(c)

整数溢出?

天文数字:形容非常大的数字,已经无法用一个确切的数来形容。

对于很多编程语言来说,天文数字是需要被正视的,因为往往会引发整数溢出问题。但是,在 Python 中无需忧虑,因为它支持“无限精度”的整数。

来感受一下:

>>> i = 2 ** 500 # 2 的 500 次幂>>> i3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376

哇,多么幸运,Python 做出了如此精妙的安排。。。

虽然整数可以是任意长度,但是浮点数只能精确到 15 位小数(16 位不准确)。

>>> f = 0.12345678901234567890 # 值被截断>>> f0.12345678901234568

注意: f 的值被截断。

数字系统

对于绝大部分人来说,每天处理的数字都是十进制(以 10 为基数)数字系统。但是程序员(尤其是搞嵌入式的),往往需要使用二进制(以 2 为基数)、八进制(以 8 为基数)和十六进制(以 16 为基数)数字系统。

在 Python 中,可以在数字前面放置相应的前缀来表示这些数字。

数字系统

前缀

十进制(Decimal)

二进制(Binary)

‘0b’ 或者 ‘0B’

八进制(Octal)

‘0o’ 或者 ‘0O’

十六进制(Hexadecimal)

‘0x’ 或者 ‘0X’

来看一些示例:

>>> 5 # 十进制5>>> >>> 0b1010 # 二进制10>>> >>> 0o15 # 八进制13>>>>>> 0xFB # 十六进制251

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

>>> dec = 20 # 十进制>>> >>> bin(dec) # 十进制转二进制'0b10100'>>> >>> oct(dec) # 十进制转八进制'0o24'>>> >>> hex(dec) # 十进制转十六进制'0x14'

类型转换

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

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

>>> 2 + 3.05.0

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

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

>>> int(2.3)2>>> int(-2.8)-2>>> float(5)5.0>>> complex('3+5j')(3+5j)

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

Decimal

通常,在使用内置类 float 时,会执行一些“匪夷所思”的计算。

我们知道 1/3 等于 0.333…(无限循环),0.1 + 0.2 等于 0.3,但 Python 似乎不这么认为。

>>> 1/30.3333333333333333>>> >>> 0.1 + 0.20.30000000000000004

What?难道是眼花了?和数学知识不一样?(一脸懵逼。。。)

事实证明,浮点数在计算机硬件中以二进制小数来表示,因为计算机只能理解二进制(0 和 1)。出于这个原因,大部分十进制小数都不能准确地存储在计算机中。

例如,十进制小数 0.1,将转换为无限长的二进制小数 0.000110011001100110011…,而计算机存储的位数是有限的。也就是说,转换为二进制后,只会接近十进制的 0.1,但永远不会相等。

因此,这是计算机硬件的局限性,而不是 Python 中的错误。

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

>>> import decimal>>> >>> 0.10.1>>> >>> 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=[Inexact, FloatOperation, Rounded], traps=[InvalidOperation, DivisionByZero, Overflow])>>> >>> decimal.getcontext().prec # 精度默认 28 位28>>> >>> d = decimal.Decimal(1) / decimal.Decimal(9)>>> dDecimal('0.1111111111111111111111111111')>>> >>> decimal.getcontext().prec = 3 # 将精度修改为 3 位>>> >>> d = decimal.Decimal(1) / decimal.Decimal(9)>>> dDecimal('0.111')

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

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

注意: 计算结果末尾的 0

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

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

当在做金融应用时,需要精确表示。当想要控制所需的精度级别时当想要实现有效的小数位概念时当我们想要像在学校里学到的那样进行小数运算时

fractions(有理数)

fractions 模块提供了涉及分数的操作,该模块支持有理数运算。

一个 Fraction 实例可以由一对整数、另一个有理数、或者一个字符串来构造。

>>> import fractions>>> >>> fractions.Fraction(1.5)Fraction(3, 2)>>> >>> fractions.Fraction(10)Fraction(10, 1)>>> >>> fractions.Fraction(3, 5)Fraction(3, 5)>>> >>> print(fractions.Fraction(1.5))3/2

当从 float 创建 Fraction 时,可能会得到一些不寻常的结果,这是由于之前讨论的不完美的二进制浮点数造成的。

幸运的是,fraction 也允许用字符串进行实例化,这是使用十进制数时的首选方案。

>>> from fractions import Fraction>>> >>> print(Fraction(1.1)) # 浮点数 1.12476979795053773/2251799813685248>>> >>> print(Fraction('1.1')) # 字符串 '1.1'11/10

此外,该数据类型也支持所有基本操作。

>>> from fractions import Fraction as F>>> >>> F(1,3) + F(1,3)Fraction(2, 3)>>> >>> 1 / F(2,3)Fraction(3, 2)>>> >>> F(-2,5) < 0True

math(数学函数)

math 模块用于处理数学相关的运算,例如:三角学、对数等。

>>> import math>>> >>> math.pi # 圆周率 π3.141592653589793>>>>>> math.e # 自然常数2.718281828459045>>> >>> math.cos(math.pi) # 余弦-1.0>>> >>> math.log10(100) # 以 10 为基数的 100 的对数2.0>>>>>> math.pow(2, 5) # 2**5(2 的 5 次方) 运算后的值32.0>>>>>> math.sqrt(9) # 9 的平方根3.0>>>>>> math.factorial(5) # 5!(5 的阶乘)120

random(生成伪随机数)

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

>>> import random>>> >>> l = ['p', 'y', 't', 'h', 'o', 'n']>>> >>> random.choice(l) # 从序列 l 中随机挑选一个元素'y'>>> >>> random.shuffle(l) # 将序列 l 的所有元素随机排序>>> l['t', 'y', 'h', 'p', 'n', 'o']>>> >>> random.randrange(0, 10) # 从指定范围内,按指定基数(缺省值为 1)递增的集合中获取一个随机数3>>> >>> random.random() # 随机生成一个实数,范围 [0,1)。0.09207929369477685

上述是数字相关的各模块的一些常见应用,完整的功能列表不再赘述,请参考 Python 文档。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python 匿名(lambda)函数
下一篇:新闻频道栏,支持小红点标识 && 懒加载 && 缓存 && 排序 && 增删等
相关文章

 发表评论

暂时没有评论,来抢沙发吧~