• python-生成器进阶~生成器函数


    监听文件末尾追加的例子
    def tail():
        f = open('文件','r',encoding='utf-8')
        f.seek(0,2)
        while True:
            line = f.readline()
            if line:
                yield line
            import time
            time.sleep(0.1)
    
    g = tail()
    for i in g:
        print(i.strip())

     send 方法

    send方法:
    def func():
        print('*'*10)
        a = yield 5
        print(a)
        yield 10
    
    g = func()
    print(g.__next__())
    print(g.send('wenwen'))
    # print(g.__next__())
    
    
    从哪一个yield开始接着执行,send就把一个值传给了那个yield
    send 不能用在第一个触发生成器
    生成器函数中有多少个yield就必须有多少个next+send
    def averager():
        total = 0.0
        count = 0
        averager = None
        while True:
            term = yield averager
            total += term
            count += 1
            averager = total/count
    
    g_avg = averager()
    print(g_avg.__next__())
    print(g_avg.send(20))
    
    
    生成器的预激装饰器
    生成器的预激装饰器
    
    
    生成器函数:生成一个生成器函数
    生成器的本质是迭代器
    生成器函数的特点:带有yield关键字
    且调用后,函数内的代码不被执行
    触发执行的方式:next send for循环
    next 和 send 是执行几次拿几次的数据,可能会遇到取完的数据
    for循环是每次取一个,取完为止,for循环不会报错
    
    
    触发执行的方式:
    next
    send(选会):send(None) == _next_(),send在next的基础上传一个值到生成器函数内部
    send操作不能用在生成器使用的第一次
    for 循环

    在衣服厂定衣服的例题
    def cloth():
        for i in range(100):
            yield '衣服%s'%i
    
    g1 = cloth()
    g2 = cloth()
    print(g1.__next__())
    print(g1.__next__())
    for c in cloth():
        print(c)
    for i in range(10):
        print(g1.__next__())
    for i in range(100):         #由于总数是100,已经取了10个了,当range里面为100时,剩下的90个数不够取100个就会报错
        print(g1.__next__())
    for i in g1:                  #这种方法就不会报错,有多少取多少
        print(g1.__next__())
    for c in g1:
        print(c)
        if c.endswith('80'):
            break
    print('*'*20)
    for c in g1:
        print(c)

    
    
    例题:要求执行结果为'A','B','C','D'
    def func():
        a = 'AB'
        b = 'CD'
        # yield from a
        for i in a:yield i
        # yield from b
        for i in b:yield i
    
    g = func()
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    g._next_()也可以用next(g)来表示
    g._iter_()也可以用iter(g)来表示
    不是所有的_方法_都可以使用方法()来表示
     


  • 相关阅读:
    Ubuntu 18.04 安装博通(Broadcom)无线网卡驱动
    Python3漏洞扫描工具 ( Python3 插件式框架 )
    Linux 防火墙
    基于Python3的漏洞检测工具 ( Python3 插件式框架 )
    git学习笔记
    sublime text 3 优化配置
    win10 出现0x80072efd错误
    Ubuntu搭建NFS服务器,NFS协议详细分析
    docker实现跨主机连接
    Python-RabbitMQ(持久化)
  • 原文地址:https://www.cnblogs.com/dwenwen/p/7818519.html
Copyright © 2020-2023  润新知