个性化阅读
专注于IT技术分析

python3数字,类型转换和数学 – Python3教程

点击下载

上一章Python教程请查看:python3包(package)和模块(module)

在本文中,你将了解Python中使用的不同数字,如何将一种数据类型转换为另一种数据类型,以及Python中支持的数学操作。

Python中的数字数据类型

Python支持整数、浮点数和复数。在Python中,它们被定义为int、float和complex类。

整数和浮点数由小数点的存在或不存在来分隔,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位是不准确的)。

我们每天处理的数字都是十进制的,但是计算机程序员(通常是嵌入式程序员)需要使用二进制(以2为基数)、十六进制(以16为基数)和八进制(以8为基数)数字系统。

在Python中,我们可以通过在数字前面适当地加上前缀来表示这些数字,下表列出了这些前缀。

Python数字的系统前缀

数字系统 前缀
二进制 ‘0b’ 或 ‘0B’
八进制 ‘0o’ 或 ‘0O’
十六进制 ‘0x’ 或 ‘0X’

这里有一些例子

# 输出: 107
print(0b1101011)

# 输出: 253 (251 + 2)
print(0xFB + 0b10)

# 输出: 13
print(0o15)

类型转换

我们可以把一种数字转换成另一种,这也被称为强制转换。

如果其中一个操作数是浮点数,那么加法、减法等操作将强制整数隐式(自动)浮点。

>>> 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附带的decimal模块。虽然浮点数的精度最高可达15位小数,但decimal模块具有用户可设置的精度。

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'))

注意上面示例中的结尾0。

我们可能会问,为什么不每次都实现Decimal,而不是float呢?主要原因是效率,浮点运算的执行速度必须快于十进制运算。

何时使用十进制而不是浮点数?

我们通常在下列情况下使用小数。

  • 当我们做金融应用时需要精确的十进制表示。
  • 当我们想要控制所需的精度水平时。
  • 当我们想要实现有效小数位数的概念时。
  • 我们希望操作能像在学校那样精确进行

Python分数

Python通过它的分数模块提供涉及小数的运算。

分数有分子和分母,它们都是整数,该模块支持有理数运算。

我们可以用多种方式创建分数对象。

import fractions

# 输出: 3/2
print(fractions.Fraction(1.5))

# 输出: 5
print(fractions.Fraction(5))

# 输出: 1/3
print(fractions.Fraction(1,3))

当从float中创建分数时,我们可能会得到一些不寻常的结果,这是由于前一节讨论的不完全二进制浮点数表示法造成的。

幸运的是,Fraction也允许我们用string进行实例化,这是使用十进制数时的首选选项。

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数学

Python提供了数学和随机等模块来执行不同的数学运算,如三角、对数、概率和统计等。

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))

random.shuffle(x)

print(x)

# 打印随机元素
print(random.random())
赞(0)
未经允许不得转载:srcmini » python3数字,类型转换和数学 – Python3教程

评论 抢沙发

评论前必须登录!