暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python 基础知识整理 - 标准库简介(6)

数据库杂货铺 2022-01-05
513

处理列表的工具

 

内置列表类型可以满足许多数据结构需求。然而,有时需要采用具有不同性能权衡的替代实现。

 

array 模块提供了一个类似于列表的 array() 对象,它只存储同构数据,并且存储得更紧凑。下面的例子显示了一个数字数组,该数组存储为两个字节的无符号二进制数(类型代码为“H),而不是普通 Python int 对象列表中每个条目的16字节:

 

from array import array


a = array('H', [4000, 10, 700, 22222])
print(sum(a))
print(a[1:3])

 

运行结果:

 

26932
array('H', [10, 700])

 

collections 模块提供了一个 deque() 对象,它类似于一个列表,但是可以更快从两侧添加和弹出元素,但在中间查找速度较慢。这些对象非常适合实现队列和广度优先树搜索:

 

from collections import deque
d = deque(["task1", "task2", "task3"])
d.append("task4")


print(d)
print("Handling", d.popleft())

 

运行结果:

 

deque(['task1', 'task2', 'task3', 'task4'])
Handling task1

 

除了可选的列表实现之外,标准库还提供了其他工具,如 bisect 模块,该模块提供了用于操作排序列表的函数:

 

import bisect


scores = [(100, 'perl'), (200, 'tcl'), (400, 'lua'), (500, 'python')]
bisect.insort(scores, (300, 'ruby'))
print(scores)

 

运行结果:

 

[(100, 'perl'), (200, 'tcl'), (300, 'ruby'), (400, 'lua'), (500, 'python')]

 

heapq 模块提供了基于常规列表实现堆的函数。最小值的条目总是保持在位置 0。这对于重复访问最小元素但不想运行完整列表排序的应用程序很有用:

 

from heapq import heapify, heappop, heappush


data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
heapify(data) #将列表按堆顺序重新排列
print(data)
heappush(data, -5) #添加一个新条目
print(data)
result = [heappop(data) for i in range(3)] #获取三个最小的条目
print(result)

 

运行结果:

 

[0, 1, 2, 6, 3, 5, 4, 7, 8, 9]
[-5, 0, 2, 6, 1, 5, 4, 7, 8, 9, 3]
[-5, 0, 1]

 

十进制浮点运算

 

decimal 模块为十进制浮点运算提供了 Decimal 数据类型。相对于二进制浮点的内置 float 实现,这个类特别有助于:

 

 需要精确十进制表示的金融应用和其他用途,

 控制精度,

 控制四舍五入以满足法律或法规要求,

 跟踪有效小数位数,

 用户期望结果与手工计算相匹配的应用程序。

 

例如,对70分的电话费计算5%的税,用十进制浮点数和二进制浮点数的表示,会给出不同的结果。

from decimal import *


print(Decimal('0.70') * Decimal('1.05'))
print(round(Decimal('0.70') * Decimal('1.05'), 2))
print(round(.70 * 1.05, 2))

  

运行结果:

 

0.7350
0.74
0.73

 

Decimal 结果保留了结尾的零,自动从具有两位精度的被乘数推断到四位精度。Decimal 再现了手工完成的数学运算,这就确保了二进制浮点数无法精确保有的数据精度。

 

精确表示使 Decimal 类能够执行不适合二进制浮点数的模运算和等值测试:

 

from decimal import *


print(Decimal('1.00') % Decimal('.10'))
print(1.00 % 0.10)
print(sum([Decimal('0.1')]*10) == Decimal('1.0'))
print(sum([0.1]*10) == 1.0)

 

运行结果:

 

0.00
0.09999999999999995
True
False

 

decimal 模块提供所需的任意精度的算法:

 

from decimal import *


getcontext().prec = 36
print(Decimal(1) / Decimal(7))

 

运行结果:

 

0.142857142857142857142857142857142857

 

 

 

 

官方文档:

https://docs.python.org/3.9/tutorial/stdlib2.html

 


文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论