生成器
Posted 90500042陈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成器相关的知识,希望对你有一定的参考价值。
只要函数体内有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))
函数体代码示范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(\'一只鸭\')
以上是关于生成器的主要内容,如果未能解决你的问题,请参考以下文章