Python 生成器函数与 Deque(双向列表) 模块

Python 生成器函数与 Deque(双向列表) 模块



问题:在一个文本文件中,我需要找到最后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语句之后,再次停止,等待下一次迭代,以此类推。

回到我们的问题

用到的文件如下图:

Python 生成器函数与 Deque(双向列表) 模块

文件内容

代码如下:

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  

____________________


>>> 


欢迎大家转发!

|