Python数字类型全解析:从基础运算到高精度处理
本文深入解析Python中的数字类型体系,涵盖整数、浮点数、复数及布尔值的基础特性。重点对比Python 2与3在除法运算上的差异,详解Decimal与Fraction模块如何解决浮点数精度丢失问题,并系统介绍集合的交集、并集等运算方法及注意事项,帮助开发者掌握Python数值处理的核心工具。
Python中的数字类型工具
为了支持更高级的编程需求,Python提供了丰富的数字编程支持和对象体系。其完整的数字类型工具集包括以下各类:
1. 整数与浮点型,
2. 复数,
3. 固定精度十进制数,
4. 有理分数,
5. 集合,
6. 布尔类型
7. 支持无穷精度的整数,
8. 各类数字内置函数及相关模块。
基本数字类型
Python主要提供两种基本数字类型:整数(包括正整数和负整数)以及浮点数(即带有小数部分的数字)。在Python中,我们可以使用多种进制来表示整数,且整数具备无穷精度特性。
整数的表现形式通常以十进制数字字符串呈现,而浮点数则通过小数点或科学计数法(如使用e表示)来标识。在Python 2版本中,整数被区分为普通整数(32位)和长整数(无穷精度,以字母l结尾)。进入Python 3后,整数统一为一种形式,均具备无穷精度。
此外,Python中的整数还支持二进制(前缀0b)、八进制(前缀0o)以及十六进制(前缀0x)的表示形式。
十进制数与其他进制的转换:
s=16 print(bin(s)) print(oct(s)) print(hex(s)) 运行结果: 0b10000 0o20 0x10
print('{0:o},{1:x},{2:b}'.format(16,16,16))
print('%o,%x,%X'%(16,16,16))
运行结果:
20,10,10000
20,10,10
其他进制转化为十进制:
a=int('0b10000',2)
b=int('0o20',8)
c=int('0x10',16)
print(a)
print(b)
print(c)
运行结果:
16
16
16
print(eval('16'))
print(eval('0b10000'))
print(eval('0o20'))
print(eval('0x10'))
运行结果:
16
16
16
16
Python表达式操作符
表达式由数学符号和操作符构成,下表展示了Python表达式操作符及其对应的程序行为:
| 操作符 | 描叙 |
| yield | 生成 器函数发送协议 |
| lambda args:expression | 生成匿名函数 |
| x if y else z | 三元表达式 |
| x or y | 逻辑或(存在短路算法) |
| x and y | 逻辑与(存在短路算法) |
| not x | 逻辑非 |
| x in y , x not in y | 成员关系 |
| x is y ,x is not y | 对象实体測试 |
| x<y,x<=y,x>y,x>=y,x==y,x!=y | 比較大小 |
| x|y | 位或,集合并集 |
| x^y | 位异或,集合对称差 |
| x&y | 位与,集合交集 |
| x<<y,x>>y | 左移或者右移y位 |
| x+y,x-y | 加减法、合并删除 |
| x*y,x%y,x/y,x//y | 乘,取余数,除,地板除 |
| -x,+x | 一元减法 |
| ~x | 按位求补(取反) |
| x**y | 幂运算 |
| x[i] | 索引,函数调用 |
| x[i:j:k] | 分片 |
| x(...) | 调用函数 |
| x.attr | 调用属性 |
| (...) | 元组,表达式,生成器 |
| [...] | 列表,列表解析 |
| {...} | 字典,集合,集合和字典解析 |
注:操作符在Python 2和Python 3中存在细微差异。在Python 2中,不等于可以用!=或<>表示;而在Python 3中,<>语法已被取消,不等于仅使用!=表示。
表达式x<y<z等价于x<y and y<z,
在Python 2中允许比较混合类型的大小,但在Python 3中,比较混合类型的大小会引发错误,
python2 a = 1 > 'a' print a 运行结果: False
python3<br>a=1 > 'a' print(a) 运行结果: Traceback (most recent call last): File "C:/Users/jeff/PycharmProjects/python_file/practice/prac2.py", line 92, in <module> a=1 > 'a' TypeError: unorderable types: int() > str()
上述表格同时也反映了程序运行的优先级顺序,从上至下优先级逐渐升高。若需改变运算优先级,可使用括号。括号在Python数字操作中极为常用,它不仅强制程序按预期顺序执行,还显著提升了代码的可读性。
混合类型
此处指混合数字类型的运算,例如整数与浮点数相加的结果是什么?
在Python中,系统会首先将操作对象转换为其中类型最复杂的那个操作对象的类型,随后对相同类型的对象执行数学运算。
print(1+0.2) 运行结果: 1.2
注:此外,Python还支持运算符重载功能。例如‘+'号,除了执行数字加法运算外,在字符串拼接时同样适用‘+'。
数字显示格式
受限于某些硬件显示特性,数字在屏幕上有时呈现为看似奇怪的形式,例如:
在命令行中操作
>>>num = 1 / 3.0
>>>num
0.333333333333333333331
在pycharm中print操作
num = 1/3.0
print(num)
运行结果:
0.3333333333333333
num = 1/3.0
print('{0:4.2f}'.format(num))#4是前面空格格数,2是保留小数位
运行结果:
0.33
在命令行中显示的形式被称为默认的交互式回显,而通过print打印输出的则称为友好式回显,这与repr和str函数的显示结果保持一致:
>>>num = 1/3.0 >>>repr(num) 0.333333333333333333331 >>>str(num) 0.3333333333333333
除法:传统除法、Floor除法、真除法和截断除法
除法是Python 2与Python 3之间一个至关重要的变化点。
一、除法操作符
Python提供两种除法操作符‘x/y'与‘x//y'。其中‘/'在Python 2中执行传统除法,即省略浮点数的小数部分而显示整数;但在Python 3中,除法默认为真除法,无论操作数类型如何,均保留小数部分。‘//'被称为Floor除法,在Python 3中省略小数部分,返回能整除的最小整数;若操作数为浮点数,结果仍显示为浮点数。在Python 2中,整数执行截断取整,而浮点数则保留浮点结果。
例:在Python 2中:

在Python 3中:

若在Python 2中希望使用Python 3风格的‘/'除法,需调用特定模块来实现。在Python 2中,通过调用division模块:

截断除法与Floor除法均取最接近整数的向下取整值,这使得该规则在负数情况下依然生效,例如-2.5的结果为-3而非-2。若需获得真正的截断效果,需调用math模块:

Python还支持复数的计算:
此外,还支持使用complex(real,imag)函数来创建复数。
更多关于复数计算的参考,请查阅cmath模块的手册。
位操作
x=1 print(x<<2) print(x|2) print(x&2) print(x^2) 运行结果: 3 3
在Python 3中,可使用bit_length方法查看二进制位数:
x=99 print(bin(x)) print(x.bit_length()) print(len(bin(x))-2) 运行结果: 0b1100011 7 7
内置数学工具
math模块
import math print(math.pi) print(math.e) print(math.sin(110)) print(math.sqrt(144)) print(pow(2,3)) print(abs(-50)) print(sum((1,2,3))) print(max(1,2,3)) print(min(1,2,3)) 运行结果: 3.141592653589793 2.718281828459045 -0.044242678085070965 12.0 8 50 6 3 1
针对截取浮点数的操作,主要有四种方式:
print(math.floor(2.577)) print(math.trunc(2.577)) print(round(2.577)) print(int(2.577)) 运行结果: 2 2 3 2
random模块
获取随机数
import random print(random.random()) print(random.randint(1,100)) 运行结果: 0.9534845221467178 79
其他数字类型介绍
除了常见的整型与浮点数外,还有一些其他较为常见的数字类型。
一、小数数字
尽管学习Python已有一段时间,但许多人可能仍未完全理解浮点数与小数的区别。实际上,小数在某种程度上可视为浮点数,只不过它具有固定的位数和小数点。在Python中,需通过专门的模块导入小数,语法为from decimal import Decimal。
注:浮点数缺乏精确性。
print(0.1+0.1+0.1-0.3) 输出结果: 5.551115123125783e-17
看到这里的读者可能会感到惊讶,随后使用Python解释器进行测试,结果确实显示为5.551115123125783e-17。虽然该值非常接近0,但并不等于0。这说明浮点型本质上是缺乏精确性的。若需精确计算,必须调用from decimal import Decimal。
from decimal import Decimal
print(Decimal('0.1')+Decimal('0.10')+Decimal('0.10')-Decimal('0.30'))
运行结果:
0.00
可以看出,小数相加时会自动升级为位数最多的那个类型。
注:若通过浮点数创建小数对象,由于浮点数本身可能已不精确,转换过程可能会产生较多位数。
from decimal import Decimal print(Decimal.from_float(1.88)) print(Decimal.from_float(1.25)) 输出结果: 1.87999999999999989341858963598497211933135986328125 1.25
此处仅对小数进行简要介绍,关于小数的更多内容,建议在阅读Python标准库手册后进一步总结。
二、分数
分数类型与小数极为相似,二者均通过固定小数位数和指定的舍入或截取策略来控制精度。分数需使用Fraction模块导入。
from fractions import Fraction x=Fraction(1,3) y=Fraction(2,3) print(x+y) 输出结果: 1
注:对于内存中给定有限位数无法精确表示的值,浮点数的局限性尤为明显。分数和小数均比浮点数更为准确。
三、集合
集合由无序元素组成,打印时顺序也是无序的,但集合中不包含重复元素。因此,我们常使用集合进行去重操作,尤其是在涉及数字和数据库的工作场景中。
假设有两个集合a与b:
a与b的交集可通过a.intersection(b)或a & b获取。
a与b的差集可通过a.difference(b)或a-b获取。
a与b的并集可通过a.union(b)或a|b获取。
反向差集与对称差集(即并集减去交集)可通过a.symmetric_difference(b)或a^b获取。
合并操作为a.update(b),a.difference_update(b)用于求差集并将结果赋值给a集合
删除元素可使用discard(元素)或remove(元素),pop()用于随机删除一个元素,add用于插入一个项目。
注:set是可变数据类型,但set里面的元素必须是不可变数据类型。
x={'a','c','b'}
y={'a','g','b'}
z={'a'}
print('a' in x)
print(x-y)
print(x|y)
print(x&y)
print(x^y)
print(z<y)
x={'a','c','b'}
y={'a','g','b'}
z={'a'}
print(x.intersection(y))
print(x.union(y))
x.add('s')
print(x)
print(x.pop())
x.update({'w','e','o'})
print(x)
print(x)
运行结果:
{'a', 'b'}
{'c', 'a', 'b', 'g'}
{'a', 'b', 'c', 's'}
a
{'o', 'c', 's', 'w', 'b', 'e'}
{'o', 'c', 's', 'w', 'b', 'e'}
注:在Python中,{}表示空字典,若需定义空集合,必须使用set()。
若向集合中添加列表等可变类型,则会报错。
x={'a','c','b'}
l=[1,2,3]
x.add(l)
print(x)
运行结果:
Traceback (most recent call last):
File "C:/Users/jeff/PycharmProjects/python_file/practice/prac2.py", line 111, in <module>
print(x.add(l))
TypeError: unhashable type: 'list'
正确的添加序列方式为添加元组。
x={'a','c','b'}
l=(1,2,3)
x.add(l)
print(x)
运行结果:
{'c', 'b', 'a', (1, 2, 3)}
定义不可操作的集合需使用frozenset来定义集合。
字典解析:
与列表解析类似,集合也是可迭代对象,因此可以使用for循环进行遍历。
x={1,2,3}
print({i ** 2 for i in x})
运行结果:
{1, 9, 4}
四、布尔值
Python的一种数据类型,包含两个值:True与False。
print(type(True)) print(True == 1) print(True is 1) print(True + 1) 运行结果: <class 'bool'> True False 2
集合和bool值属于较为常见的类型,在基础学习中已有涉及,此处不再赘述。
Python中的数字在程序编写时广泛使用,未来还将深入学习Python的扩展库。
以上这篇浅谈python中的数字类型与处理工具就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









