最新消息:欢迎光临 魔力 • Python!大家可以点开导航菜单中的【学习目录】,这个目录类似图书目录,更加方便学习!

Python3萌新入门笔记(39)

Python教程 小楼一夜听春语 4266浏览 0评论

这一篇教程,我们继续了解一些内置模块。

四、glob模块

在上一篇教程中,我们通过os模块获取文件夹中的所有文件名,然后组织成多个文件的路径列表,通过fileinput模块进行遍历。

这样的操作比较麻烦。

实际上,我们可以使用glob模块中的函数帮我们简便的实现这个需求。

glob模块支持通配符“*”、“?”、和“[]”,“*”表示0个或多个字符,“?”表示一个字符,“[]”表示匹配指定范围内的字符,例如“[0-9]”匹配数字0-9。

另外,glob模块还支持通配符“**”,能够获取一个目录下所有的目录以及目录中的文件。

glob模块的内容很少,包括3个函数。

  • glob(pathname, recursive=False):获取所有匹配路径的列表。参数pathname为需要匹配的路径字符串;参数recursive为递归,调用递归时(值为True),需配合通配符“**”使用,默认为False(不调用递归)。
  • iglob(pathname, recursive=False):获取所有匹配路径的生成器,参数同上。
  • escape(pathname):忽略所有通配符。

接下来,我们通过glob模块,简化之前的示例代码。

示例代码:

import fileinput,glob

path = r'C:\Users\Administrator\Desktop\song\*.txt'  # 设置查询的目标文件夹路径的所有txt文件
files = fileinput.input(glob.glob(path))  # 获取目标文件夹中所有文件
for line in files:
    (以下代码省略)

五、heapq模块

heap(堆)是一种数据结构。

普通的队列是顺序排列。

例如:列表[3,2,5,7,1,9,8,6,0,4]进行由小到大的排列就是[0,1,2,3,4,5,6,7,8,9]。

如果我们把这个列表转为带有堆属性的列表(以下简称:堆列表),结果是:[0,1,5,2,3,9,8,6,7,4]

这个堆列表看上去是无序的,实际上是按优先级进行排列。

所以,堆的排列是有规则的排列。

那么,堆的排列规则是怎样的呢?

首先,我们要了解堆的结构,堆是完全二叉树的结构。

列表[3,2,5,7,1,9,8,6,0,4]转换为堆列表时,初始结构如下图:

这个结构从上至下,从左至右的获取元素,就是列表中的顺序。

图中的结构,就像倒过来的树(我看更像树根),每一个节点最多有两个分支,所以是完全二叉树的结构。

如果不把这个结构看成树,它也像将多个元素堆在了一起,所以它叫堆。

概念搞清楚,就不会那么迷茫了。

接下来,我们看它是按什么规则重新排序的。

我们堆东西的时候,假设每个物品都有承重上限,为了不把物品压破,我们需要把承重能力小的摆放在上方。

假设列表中的元素数值就是每个元素的承重上限,在已有结构上怎么调整才不会有物品被压破呢?

我们可以按照从下往上,从左往右的顺序进行调整。

每个上层物品和它下层的两个物品比较承重上限,取承重上限最小的放在上层。

也就是说,如果承重最小的物品在下层的话,就和上层的物品位置互换。

那么,在刚才堆的基础之上,我们进行调整,过程如下:

注意,由下至上完成一次调整之后,可能还会存在不符合要求的排列(图中第4步),还要从有问题的位置由下至上继续调整,直到所有排列都符合要求为止。

通过这个调整过程,我们就能够看出堆的排列规则。

这种排列规则可以表示为:heap[index] <= heap[2*index+1] and heap[index] <= heap[2*index+2]

也就是每一个父节点的数值小于等于两个子节点的数值。

因为,堆的这种优先规则,在获取一个列表的最小值时(可以增加元素的同时找到最小元素),要比列表的min()函数更加快捷。

Python中没有独立的堆类型,只是在内置模块heapq中提供了一些操作堆的函数。

heapify(list):将列表转换堆列表。

heappush(heap,item):执行将元素入堆的操作,heap为已有堆列表,item为新的入堆元素。

heappop(heap):取出堆中最小元素。

heapreplace(heap,item):替换堆列表中最小的元素为新元素。

heappushpop(heap,item):新元素入堆,然后取出堆列表中最小的元素。

nlargest(n, iterable, key=None):获取最大的n个元素。

nsmallest(n, iterable, key=None):获取最小的n个元素。

merge(*iterables):将多个列表合并,并进行堆调整,返回的是合并后的列表的迭代器。

接下来,通过示例代码演示上方函数的使用方法。

示例代码:

import heapq  # 导入需要使用的模块

heap = [3, 2, 5, 7, 1, 9, 8, 6, 0, 4]
heapq.heapify(heap)  # 列表转换为堆列表
print(heap)  # 显示输出结果为:[0, 1, 5, 2, 3, 9, 8, 6, 7, 4]
heapq.heappush(heap, 0.5)  # 新元素入堆
print(heap)  # 显示输出结果为:[0, 0.5, 5, 2, 1, 9, 8, 6, 7, 4, 3]
print(heapq.heappop(heap))  # 取出堆列表中最小的元素,显示输出结果为:0
print(heap)  # 显示输出结果为:[0.5, 1, 5, 2, 3, 9, 8, 6, 7, 4]
heapq.heapreplace(heap, 10)  # 替换堆列表中最小的元素为新元素
print(heap)  # 显示输出结果为:[1, 2, 5, 6, 3, 9, 8, 10, 7, 4]
print(heapq.heappushpop(heap, 11))  # 新元素入堆,然后取出堆列表中最小的元素,显示输出结果为:1
print(heap)  # 显示输出结果为:[2, 3, 5, 6, 4, 9, 8, 10, 7, 11]
print(heapq.nlargest(5, heap))  # 显示输出结果为:[11, 10, 9, 8, 7]
print(heapq.nsmallest(5, heap))  # 显示输出结果为:[2, 3, 4, 5, 6]
print(list(heapq.merge([1, 4, 7], [0, 2, 5])))  # 显示输出结果为:[0, 1, 2, 4, 5, 7]

本节知识点:

1、glob模块

2、堆的结构

3、heapq模块

本节英文单词与中文释义:

1、glob:一团

2、recursive:递归

3、escape:规避

4、heap:堆

5、heapq(heap queue):堆队列

6、ify:动词后缀,表示使……化

7、push:增加

8、largest:最大的

9、smallest:最小的

10、merge:合并

转载请注明:魔力Python » Python3萌新入门笔记(39)

头像
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网站 (可选)