生成器

只要函数体内有yield,执行该函数体代码时就不会执行函数体代码,会得到一个结果,该结果就是生成器(generator

 

def func():
    print('=================>1')
    yield 1
    print('=================>2')
    yield 2
    print('=================>3')
    yield 3
    print('=================>4')
    yield 4
func()

该函数执行结果如下所示:

 

 

 

 

生成器就是迭代器

 

def func():
    print('=================>1')
    yield 1
    print('=================>2')
    yield 2
    print('=================>3')
    yield 3
    print('=================>4')
    yield 4
#生成器就是迭代器 
x=func()
next(x)
next(x)
next(x)
next(x)

 yield的功能

1   yield为我们提供一种自定义迭代器对象的方法

2   yield与return的区别

    2.1yield可以返回多次值

    2.2函数暂停与再继续的状态是由yield帮我们保存的

 

 

 

函数体代码示范1

def my_range(start,end,step):
    yield 1
    yield 2
    yield 3

g=my_range(1,5,2)
print(next(g))
print(next(g))
print(next(g))
View Code

 函数体代码示范2

#只要函数体代码内有yield   该函数体代码就不会运行,会被当做生成器
<generator object my_range at 0x030A9EA0>

def
my_range(start,end,step): while start<end: yield start start+=step res=my_range(1,5,2) print(next(res)) print(next(res))

 

函数体代码示范3

def my_range(start,end,step=1):
    while start<end:
        yield start
        start=start+step
res=my_range(1,7,2)    #<generator object my_range at 0x00569060>
print(res)

for i in my_range(1,9,2):
    print(i)

 

 

函数体代码示范4

# 实现tail -f access.log | grep 404的功能

#写入文件代码

with open('access.log','a',encoding='utf-8') as f:
    f.write('aaaaa\n')
    f.flush()

 

 

#执行文件端代码

import time
def tail(filepath):
    with open(filepath,'rb') as f:
        f.seek(0,2)
        while True:
            line=f.readline()
            if line:
                yield line
            else:
                time.sleep(0.5)
line=tail('access.log')
for i in line:
    print(i)

 

 

yield附加案例

def eater(name):
print('%s is ready to eat'%name)
while True:
food=yield
print('%s is start to eat %s'%(name,food))


e=eater('nod')


#首先初始化
next(e) #此处可以写成e.send(None)

#然后send从第一步e暂停的地方开始继续往下执行
e.send('一只鸡')
e.send('一只鸭')


 

posted on 2018-04-08 20:18  90500042陈  阅读(123)  评论(0编辑  收藏  举报