友情提示:380元/半年,儿童学编程,就上码丁实验室。
问题:在一个文本文件中,我需要找到最后n个含有‘python’字段的行
解决方法:
使用python生成器函数与Python的Deque模块
先来了解一些Deque模块:
Deque模块是Python标准库collections中的一项. 它提供了两端都可以操作的序列, 这意味着, 你可以在序列前后都执行添加或删除操作
用法1:
>>> from collections import deque
>>> p=deque([1,2,3])
>>> p
deque([1, 2, 3])
>>> p.append(5)
>>> p
deque([1, 2, 3, 5])
>>> p.appendleft(6)
>>> p
deque([6, 1, 2, 3, 5])
>>> p.pop()
5
>>> p
deque([6, 1, 2, 3])
>>> p.popleft()
6
>>> p
deque([1, 2, 3])
>>> print(p)
deque([1, 2, 3])
>>> for i in p:
print(i)
1
2
3
用法2:
>>> p=deque(maxlen=3)
>>> p
deque([], maxlen=3)
>>> p.append(1)
>>> p
deque([1], maxlen=3)
>>> p.append(2)
>>> p
deque([1, 2], maxlen=3)
>>> p.append(3)
>>> p
deque([1, 2, 3], maxlen=3)
>>> p.append(5)
>>> p
deque([2, 3, 5], maxlen=3)
>>> p.appendleft(6)
>>> p
deque([6, 2, 3], maxlen=3)
生成器函数介绍
生成器函数和普通函数的区别如下:
其返回值不是一次性返回,而是没迭代一次返回一个值
其使用yield语句返回值
用法如下:
>>> def nums(n):
for i in range(n+1):
yield i
>>> a=nums(3)
>>> a
<generator object nums at 0x0000015159AB0048>
>>> iter(a)
<generator object nums at 0x0000015159AB0048>
>>> a is iter(a)
True
>>> a.__next__()
0
>>> a.__next__()
1
>>> next(a)
2
>>> next(a)
3
>>> next(a)
Traceback (most recent call last):
File “<pyshell#55>”, line 1, in <module>
next(a)
StopIteration
>>> a=nums(3)
>>> list(a)
[0, 1, 2, 3]
>>> list(a)
[]
>>> for i in nums(3):
print(i)
0
1
2
3
>>>
需要注意的一点就是,生成器函数只能进行一次迭代。
生成器函数没迭代一次的时候,执行完yield语句便停止执行接下来的语句。
等待下一次迭代,下一次迭代开始的时候,将从yield语句下的语句开始执行,当执行完本轮的yield语句之后,再次停止,等待下一次迭代,以此类推。
回到我们的问题
用到的文件如下图:
文件内容
代码如下:
from collections import deque
def search(lines,match,history=5):
pre_lines=deque(maxlen=history)
for line in lines:
if match in line:
pre_lines.append(line)
yield pre_lines
if __name__==’__main__’:
with open(‘file.txt’) as f:
for prelines in search(f,’python’,3):
for pline in prelines :
print(pline.strip(),end=’ ‘)
print(‘_’*20)
输出结果如下:
===================== RESTART: C:maxingpythonprint.py =====================
完python ____________________
完python 了python ____________________
完python 了python 鳄python ____________________
了python 鳄python 模型python ____________________
鳄python 模型python 掌python ____________________
模型python 掌python 握python ____________________
掌python 握python 消息python ____________________
握python 消息python 传python ____________________
消息python 传python python ____________________
>>>
欢迎大家转发!