在本文中,您将了解Python中使用的不同数字,如何将一种数据类型转换为另一种数据类型,以及Python中支持的数学操作。
Python支持整数,浮点数和复数。他们被定义为int,float和complex在Python数据类型中。
整数和浮点由存在或不存在小数点分隔。5是整数,而5.0是浮点数。
复数以形式书写x + yj,其中x是实部,y是虚部。
我们可以使用type()函数来判断变量或值属于哪种数据类型,并且可以使用函数isinstance()检查它是否属于特定的类型。
a = 5 # 输出: <class 'int'> print(type(a)) # 输出: <class 'float'> print(type(5.0)) # 输出: (8+3j) c = 5 + 3j print(c + 3) # 输出: True print(isinstance(c, complex))
虽然整数可以是任意长度,但浮点数最多只能精确到15个小数位(第16位不准确)。
我们每天处理的数字是十进制(以10为底)的数字系统。 但是计算机程序员(通常为嵌入式程序员)需要使用二进制(基数2),十六进制(基数16)和八进制(基数8)的数字系统。
在Python中,我们可以通过在数字之前添加前缀来表示这些数字。下表列出了这些前缀。
编号系统 | 前缀 |
---|---|
Binary | '0b'或'0B' |
Octal | '0o'或'0O' |
Hexadecimal | '0x'或'0X' |
这里有些示例
# 输出: 107 print(0b1101011) # 输出: 253 (251 + 2) print(0xFB + 0b10) # 输出: 13 print(0o15)
运行该程序时,输出为:
107 253 13
我们可以将一种数字转换为另一种数字。这也称为强制转换。
如果操作数之一是浮点数,则加法,减法等操作会强制整数隐式(自动)浮点。
>>> 1 + 2.0 3.0
我们可以在上面看到1(整数)被强制转换为1.0(float)进行加法运算,结果也是一个浮点数。
我们还可以使用诸如的内置函数int(),float()和complex()在类型之间进行显式转换。这些函数甚至可以从字符串转换。
>>> int(2.3) 2 >>> int(-2.8) -2 >>> float(5) 5.0 >>> complex('3+5j') (3+5j)
从float转换为整数时,数字将被截断(接近零的整数)。
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 # 输出: 0.1 print(0.1) # 输出: Decimal('0.1000000000000000055511151231257827021181583404541015625') print(decimal.Decimal(0.1))
当我们要像在学校学习的那样进行十进制计算时,将使用此模块。
它也保留了意义。我们知道,25.50公斤比25.5公斤更准确,因为它有两位小数,而不是一位。
from decimal import Decimal as D # 输出: Decimal('3.3') print(D('1.1') + D('2.2')) # 输出: Decimal('3.000') print(D('1.2') * D('2.50'))
注意上例中的尾随零。
我们可能会问,为什么不每次都执行Decimal而不是float?主要原因是效率。进行浮点运算必须比十进制运算更快。
在以下情况下,我们通常使用十进制。
当我们进行需要精确十进制表示的金融应用程序时。
当我们要指定所需的精度水平时。
当我们想实现小数位有效的概念时。
当我们希望像在学校一样进行运算时
Python通过其fractions模块提供涉及小数的运算。
小数具有分子和分母,它们都是整数。该模块支持有理数算法。
我们可以通过多种方式创建Fraction对象。
import fractions # 输出: 3/2 print(fractions.Fraction(1.5)) # 输出: 5 print(fractions.Fraction(5)) # 输出: 1/3 print(fractions.Fraction(1,3))
从float创建分数时,我们可能会得到一些异常的结果。这是由于上一节中讨论的二进制浮点数表示不完善所致。
幸运的是,小数还允许我们使用字符串示例化。这是使用十进制数字时的首选选项。
import fractions # 用作 float # 输出: 2476979795053773/2251799813685248 print(fractions.Fraction(1.1)) # 用作 string # 输出: 11/10 print(fractions.Fraction('1.1'))
此数据类型支持所有基本操作。这里有几个示例。
from fractions import Fraction as F # 输出: 2/3 print(F(1,3) + F(1,3)) # 输出: 6/5 print(1 / F(5,6)) # 输出: False print(F(-3,10) > 0) # 输出: True print(F(-3,10) < 0)
Python提供了类似的模块,math和random可以执行不同的数学运算,例如三角函数,对数,概率和统计等。
import math # 输出: 3.141592653589793 print(math.pi) # 输出: -1.0 print(math.cos(math.pi)) # 输出: 22026.465794806718 print(math.exp(10)) # 输出: 3.0 print(math.log10(1000)) # 输出: 1.1752011936438014 print(math.sinh(1)) # 输出: 720 print(math.factorial(6))
这是Python math模块中可用的完整列表函数和属性。
import random # 输出: 16 print(random.randrange(10,20)) x = ['a', 'b', 'c', 'd', 'e'] # 得到随机选项 print(random.choice(x)) # 打乱x列表顺序 random.shuffle(x) # 打印输出被打乱顺序后的x print(x) # 打印随机元素 print(random.random())
输出结果(随机结果):
19 c ['e', 'a', 'd', 'c', 'b'] 0.707947055817621
这是Python random模块中可用的完整列表函数和属性。