• 生成器


    只要函数体内有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
    ')
        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('一只鸭')


  • 相关阅读:
    ....
    CodeForces 375A(同余)
    POJ 2377 Bad Cowtractors (最小生成树)
    POJ 1258 AgriNet (最小生成树)
    HDU 1016 Prime Ring Problem(全排列)
    HDU 4460 Friend Chains(bfs)
    POJ 2236 Wireless Network(并查集)
    POJ 2100 Graveyard Design(尺取)
    POJ 2110 Mountain Walking(二分/bfs)
    CodeForces 1059B Forgery(模拟)
  • 原文地址:https://www.cnblogs.com/nodchen/p/8747165.html
Copyright © 2020-2023  润新知