最新消息:380元/半年,推荐全网最具性价比的一站式编程学习平台码丁实验室

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

Arduino 少儿编程 1570浏览 0评论

友情提示:380元/半年,儿童学编程,就上码丁实验室

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  ____________________

>>>


欢迎大家转发!

 

您必须 登录 才能发表评论!