#!/usr/bin/python
#-*-coding:utf-8 -*-
'''
生成器函数: 只要函数体内包含yield关键字,该函数就是生成器函数
'''
#
# def foo():
# return 1
# return 2
# return 3
# res=foo()
# print(res)
#多次执行,结果都是1,
#******return的特性 只执行一次,函数就终止了
# def foo():
# yield 1
# yield 2
# yield 3
# res=foo()
# print(res)
# print(next(res)) #1
# print(next(res)) #2
# #打印结果
# #<generator object foo at 0x0000026CFCDF68E0> 生成器的内存地址
# res.__iter__() #可迭代对象
# res.__next__()#迭代器
# #由上可见 yield 直接把函数变成了一个迭代器
#如下函数 猜想打印结果
# def foo():
# print('first')
# yield 1
# print('second')
# yield 2
# print('third')
# yield 3
# print('fourth')
# foo()
# g=foo()
# # print(g)
# #结果就是 啥也不打印
# #结论:只要函数体内包含yield,再()执行就不会触发函数执行,只是得到一个迭代器,生成器的本质就是迭代器
# #那么要想触发迭代器,就得next
# # print(next(g))#会触发跌打器g的执行,进而触发函数的执行
# # print(next(g))
# # print(next(g))
# for i in g:
# print(i)
#下面讲个小例子:
# def counter(n):
# print('start.....')
# i=0
# while i < 5:
# yield i
# i+=1
# print('stop....')
# g=counter(5)
# print(g)
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
#总结yeild的特性:
# 相当于为函数封装好了,__iter__和__next__方法,把函数做成了迭代器
# 和return对比
# return只能返回一次只,函数就终止了
# yield 能返回多次值 每次返回都会将函数暂停,下一次next会从上一次暂停的位置往后继续执行
# ##实例
#管道 | 把左边命令的执行结果,作为右边命令的输入
#tail -f access.log | grep python
##先实现tail -f access.log
# import time
# def tail(filepath):
# with open(filepath,encoding='utf-8') as f:
# f.seek(0,2)
# while True:
# line = f.readline().strip()
# if line:
# yield line
# else:
# time.sleep(0.2)
# tail('aa.txt')
# # temp=tail('aa.txt')
# # print(next(temp))
# ##然后实现| grep python
# def grep(pattern,lines):
# for line in lines:
# if pattern in line:
# print(line)
# grep('python',tail('aa.txt'))
#