• python之生成器


    一、如何得到自定义的迭代器:

      在函数内一旦存在yield关键字,调用函数并不会执行函数体代码会返回一个生成器对象,生成器即自定义的迭代器

    def func():
        print('第一次')
        yield 1
        print('第二次')
        yield 2
        print('第三次')
        yield 3
        print('第四次')
    
    g=func()
    print(g)
    

      生成器就是迭代器

    g.__iter__()
    g.__next__()
    

      会触发函数体代码的运行,然后遇到yield停下来,将yield后的值当做本次调用的结果返回

    res1=g.__next__()
    print(res1)
    
    res2=g.__next__()
    print(res2)
    
    res3=g.__next__()
    print(res3)
    
    res4=g.__next__()
    len('aaa') # 'aaa'.__len__()
    next(g)    # g.__next__()
    iter(可迭代对象)     # 可迭代对象.__iter__()
    

      应用案列

    def my_range(start,stop,step=1):
        # print('start...')
        while start < stop:
            yield start
            start+=step
        print('end....')
    
    g=my_range(1,5,2) # 1 3
    print(next(g))
    print(next(g))
    print(next(g))
    
    for n in my_range(1,7,2):
        print(n)
    

      

    二、x=yield 返回值的使用

    一:
    def dog(name):
        print('大哥%s准备吃东西啦...' %name)
        while True:
    
            # x拿到的是yield接收到的值
    
            x = yield # x = '肉包子'
            print('大哥%s吃了 %s' %(name,x))
    
    g=dog('wuhu')
    g.send(None) # 等同于next(g)
    g.send(['一根骨头','aaa'])
    # g.send('肉包子')
    # g.close()
    # g.send('1111') # 关闭之后无法传值
    
    二:
    def dog(name):
        food_list=[]
        print('大哥%s准备吃东西啦...' %name)
        while True:
            # x拿到的是yield接收到的值
            x = yield food_list # x = '肉包子'
            print('道哥%s吃了 %s' %(name,x))
            food_list.append(x) # ['一根骨头','肉包子']
    
    g=dog('wuhu')
    res=g.send(None)  # next(g)
    print(res)
    res=g.send('一根骨头')
    print(res)
    res=g.send('肉包子')
    print(res)
    
    def func():
        print('start.....')
        x=yield 1111  # x='xxxxx'
        print('哈哈哈啊哈')
        print('哈哈哈啊哈')
        print('哈哈哈啊哈')
        print('哈哈哈啊哈')
        yield 22222
    
    g=func()
    res=next(g)
    print(res)
    
    res=g.send('xxxxx')
    print(res)
    

      总结yield:
      有了yield关键字,我们就有了一种自定义迭代器的实现方式。yield可以用于返回值,但不同于return,函数一旦遇到return就结束了,而yield可以保存函数的运行状态挂起函数,用来返回多次值。

  • 相关阅读:
    NTP时间同步
    《暗时间》
    寻找字典公共键
    maven pom.xml的execution报错
    maven安装scala插件
    html 和xml
    sparkstreaming+kafka
    zookeeper错误Error contacting service. It is probably not running.
    eclipse开发hive2程序
    eclipse开发hbase程序
  • 原文地址:https://www.cnblogs.com/Lance-WJ/p/12560997.html
Copyright © 2020-2023  润新知