生成器

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))
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(\'一只鸭\')


 

以上是关于生成器的主要内容,如果未能解决你的问题,请参考以下文章

Apollo Codegen 没有找到生成代码的操作或片段

前端开发工具vscode如何快速生成代码片段

前端开发工具vscode如何快速生成代码片段

vscode代码片段生成vue模板

VS Code配置snippets代码片段快速生成html模板,提高前端编写效率

vs 2010代码片段