zoukankan      html  css  js  c++  java
  • 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)来表示
    不是所有的_方法_都可以使用方法()来表示
     


  • 相关阅读:
    微软职位内部推荐-Software Engineer II
    微软职位内部推荐-Senior Software Engineer
    Linux日期时间显示输出
    Redis性能优化
    Can't use Subversion command line client: svn
    redis常用性能分析命令
    Linux下配置tomcat + apr + native应对高并发
    Tomcat7并发和线程数
    mongodb常用命令小结
    Spring MVC @PathVariable被截断
  • 原文地址:https://www.cnblogs.com/dwenwen/p/7818519.html
Copyright © 2011-2022 走看看