当一个函数带有yield表达式时,这个函数就不再是普通的函数,而是成为了一个生成器(generator),用于迭代,先来看下什么是迭代器(iterator).
1.迭代器(iterator)
python中列表,元祖等其实就是迭代器,迭代就是把一个序列中的数据遍历输出:
items = [1, 2, 3, 4, 5, 6]
def iterat(object):
for element in object:
print(element)
iterat(items)
from collections import deque
def search(lines, pattern, history=5):
previous_line = deque(maxlen=history)
for line in lines:
if pattern in line:
previous_line.append(line)
yield previous_line
if __name__ == "__main__":
with open('file.txt', 'r') as f:
for prevline in search(f, 'python', 6):
for pline in prevline:
print('pline:',pline)
print('-'*20)
生成器函数在在生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效
在这里,当search函数被调用时,返回的是一个生成器对象,支持迭代。
for prevline in search(f, 'python', 6):本质上也就相当于
for prevline in previous_line: