问题:在一个文本文件中,我需要找到最后n个含有‘python’字段的行
|
解决方法:
使用python生成器函数与Python的Deque模块
先来了解一些Deque模块:
Deque模块是Python标准库collections中的一项. 它提供了两端都可以操作的序列, 这意味着, 你可以在序列前后都执行添加或删除操作
用法1:
>>>
from collections
import deque
>>>p=deque([1,2,3])
>>>pdeque([1, 2, 3])
>>>p.append(5)
>>>pdeque([1, 2, 3, 5])
>>>p.appendleft(6)
>>>pdeque([6, 1, 2, 3, 5])
>>>p.pop()5
>>>pdeque([6, 1, 2, 3])
>>>p.popleft()6
>>>pdeque([1, 2, 3])
>>>print(p)deque([1, 2, 3])
>>>
for i in p:print(i)
1
2
3
用法2:
>>>p=deque(maxlen=3)
>>>pdeque([], maxlen=3)
>>>p.append(1)
>>>pdeque([1], maxlen=3)
>>>p.append(2)
>>>pdeque([1, 2], maxlen=3)
>>>p.append(3)
>>>pdeque([1, 2, 3], maxlen=3)
>>>p.append(5)
>>>pdeque([2, 3, 5], maxlen=3)
>>>p.appendleft(6)
>>>pdeque([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 dequedef 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
____________________
>>>
欢迎大家转发!
|