Python 数字、类型转换和数学
Python 数字、类型转换和数学
在本文中,您将了解 Python 中使用的不同数字、如何从一种数据类型转换为另一种数据类型,以及 Python 支持的数学运算。
Python 中的数字数据类型
Python 支持整数、浮点数和复数。它们被定义为 int
, float
, 和 complex
Python 中的类。
整数和浮点数由有无小数点分隔。例如,5 是整数,而 5.0 是浮点数。
复数以 x + yj
的形式编写 , 其中 x 是实部和 y 是虚部。
我们可以使用 type()
函数知道变量或值属于哪个类以及 isinstance()
检查它是否属于特定类的函数。
我们来看一个例子:
a = 5
print(type(a))
print(type(5.0))
c = 5 + 3j
print(c + 3)
print(isinstance(c, complex))
当我们运行上面的程序时,我们得到如下输出:
<class 'int'> <class 'float'> (8+3j) True
虽然整数可以是任意长度,但浮点数只能精确到小数点后 15 位(第 16 位不准确)。
我们每天处理的数字是十进制(以 10 为底)的数字系统。但是计算机程序员(通常是嵌入式程序员)需要使用二进制(base 2)、十六进制(base 16)和八进制(base 8)数字系统。
在 Python 中,我们可以通过在该数字之前适当地放置一个前缀来表示这些数字。下表列出了这些前缀。
数字系统 | 前缀 |
---|---|
二进制 | “0b”或“0B” |
八进制 | '0o' 或 '0O' |
十六进制 | “0x”或“0X” |
这里有一些例子
# Output: 107
print(0b1101011)
# Output: 253 (251 + 2)
print(0xFB + 0b10)
# Output: 13
print(0o15)
当你运行程序时,输出将是:
107 253 13
类型转换
我们可以将一种类型的数字转换为另一种类型。这也称为强制。
如果操作数之一是浮点数,则加法、减法等操作会隐式(自动)强制整数浮点数。
>>> 1 + 2.0
3.0
上面我们可以看到1(整数)被强制转换成1.0(浮点数)进行加法,结果也是一个浮点数。
我们也可以使用像 int()
这样的内置函数 , float()
和 complex()
在类型之间显式转换。这些函数甚至可以从字符串转换。
>>> int(2.3)
2
>>> int(-2.8)
-2
>>> float(5)
5.0
>>> complex('3+5j')
(3+5j)
从浮点数转换为整数时,数字会被截断(去除小数部分)。
Python 十进制
Python 内置类 float 执行一些可能会让我们感到惊讶的计算。我们都知道 1.1 和 2.2 之和是 3.3,但是 Python 似乎不同意。
>>> (1.1 + 2.2) == 3.3
False
怎么回事?
事实证明,浮点数在计算机硬件中以二进制分数的形式实现,因为计算机只能理解二进制(0 和 1)。由于这个原因,我们所知道的大多数小数部分都不能准确地存储在我们的计算机中。
让我们举个例子。我们不能将分数 1/3 表示为十进制数。这将给出 0.33333333... 无限长,我们只能近似它。
事实证明,十进制小数 0.1 会产生一个无限长的二进制小数 0.000110011001100110011……而我们的计算机只存储了它的有限个数。
这只会接近 0.1,但永远不会相等。因此,这是我们计算机硬件的限制,而不是 Python 的错误。
>>> 1.1 + 2.2
3.3000000000000003
为了克服这个问题,我们可以使用 Python 自带的十进制模块。浮点数的精度高达小数点后 15 位,而小数模块具有用户可设置的精度。
让我们看看区别:
import decimal
print(0.1)
print(decimal.Decimal(0.1))
输出
0.1 0.1000000000000000055511151231257827021181583404541015625
当我们想要进行我们在学校学习的小数计算时使用此模块。
它还保留了意义。我们知道 25.50 公斤比 25.5 公斤更准确,因为它的小数点后两位有效。
from decimal import Decimal as D
print(D('1.1') + D('2.2'))
print(D('1.2') * D('2.50'))
输出
3.3 3.000
请注意上面示例中的尾随零。
我们可能会问,为什么不实现 Decimal
每次,而不是浮动?主要原因是效率。浮点运算的执行速度必须快于 Decimal
操作。
何时使用小数而不是浮点数?
我们一般在以下情况下使用 Decimal。
- 当我们制作需要精确十进制表示的金融应用程序时。
- 当我们想要控制所需的精度级别时。
- 当我们想要实现有效小数位的概念时。
Python 分数
Python 通过其 fractions
提供涉及小数的运算 模块。
分数有一个分子和一个分母,它们都是整数。该模块支持有理数运算。
我们可以通过多种方式创建 Fraction 对象。让我们来看看它们。
import fractions
print(fractions.Fraction(1.5))
print(fractions.Fraction(5))
print(fractions.Fraction(1,3))
输出
3/2 5 1/3
创建 Fraction
时 来自 float
,我们可能会得到一些不寻常的结果。这是由于上一节讨论的二进制浮点数表示不完善所致。
幸运的是,Fraction
也允许我们用字符串实例化。这是使用十进制数时的首选选项。
import fractions
# As float
# Output: 2476979795053773/2251799813685248
print(fractions.Fraction(1.1))
# As string
# Output: 11/10
print(fractions.Fraction('1.1'))
输出
2476979795053773/2251799813685248 11/10
此数据类型支持所有基本操作。这里有几个例子。
from fractions import Fraction as F
print(F(1, 3) + F(1, 3))
print(1 / F(5, 6))
print(F(-3, 10) > 0)
print(F(-3, 10) < 0)
输出
2/3 6/5 False True
Python 数学
Python 提供了像 math
这样的模块 和 random
进行三角学、对数、概率统计等不同的数学运算。
import math
print(math.pi)
print(math.cos(math.pi))
print(math.exp(10))
print(math.log10(1000))
print(math.sinh(1))
print(math.factorial(6))
输出
3.141592653589793 -1.0 22026.465794806718 3.0 1.1752011936438014 720
这是 Python 数学模块中可用的函数和属性的完整列表。
import random
print(random.randrange(10, 20))
x = ['a', 'b', 'c', 'd', 'e']
# Get random choice
print(random.choice(x))
# Shuffle x
random.shuffle(x)
# Print the shuffled x
print(x)
# Print random element
print(random.random())
当我们运行上述程序时,我们得到如下输出。(由于随机行为,值可能会有所不同)
18 e ['c', 'e', 'd', 'b', 'a'] 0.5682821194654443
这是 Python random 模块中可用的函数和属性的完整列表。
Python