zoukankan      html  css  js  c++  java
  • 10-4 生成器

    生成器的本质就是迭代器

    生成器函数
    只要含有yeild关键字的函数都是生成器函数,且与return不能共用,且需要写在函数内部
    每次调用函数之后函数不执行,返回一个生成器
    每次调用next方法就会取到一个值
    直到取完最后一个,在执行next将会报错

    生成器函数的表现形式

      生成器---自己写的函数

     生成器表达式
    从生成器取值的几个方法:
    1.next
    2.for循环
    3.数据类型的强制转换(占用内存)
    def fun():
        for i in range(20):
        yield "娃哈哈%s"%i
    g = fun()
    print(list(g))

    结果:['娃哈哈0', '娃哈哈1', '娃哈哈2', '娃哈哈3', '娃哈哈4', '娃哈哈5', '娃哈哈6']

    简单的生成器函数

      只要包括__next__()函数和_iter__()的就是生成器

    def genetator():
        print(1)
        return 'a'
    ret = genetator()
    print(ret)
    
    结果:
    1
    a
    
    只要含有yeild关键字的函数都是生成器函数,且与return不能共用,且需要写在函数内部
    def genetator():
        print(1)
        yield 'a'
    # 生成器函数:执行之后会得到一个生成作为返回值
    ret = genetator()
    print(ret)#结果:<generator object genetator at 0x0225DCC0>
    print(ret.__next__())
    # 结果:
    # 1
    # a
    ret.__iter__()
    
    def wahaha():
        for i in range(20):
            yield '娃哈哈%s'%i
    g=wahaha()
    #只拿前五个,用count计数
    count = 0
    for k in g:
        count += 1
        print(k)
        if count > 5:
            break
    
    #随时可以再拿下一个值
    print('ooooo',g.__next__())
    
    每生成一个生成器,都互不相关,各个执行

     

    监听文件输入的例子(生成器)

    # 监听文件的输入
    def tail(filename):
        f = open(filename,encoding='utf-8')
        while True:
            line = f.readline()
            if line.strip():
                print('***',line.strip())
    tail('info')
    
    #监听文件的输入,并对内容进行过滤
    def tail(filename):
        f = open(filename,encoding='utf-8')
        while True:
            line = f.readline()
            if line.strip():
                yield line.strip()
    g = tail('info')
    for i in g:
        if 'python' in i:
            print('******',i,'~~~~')
        if 'www' in i:
            print('******',i,'!!!!')
    

      

  • 相关阅读:
    Python class static methods
    学习MySQL出现问题Not allowed to return a result set from a t
    MySQL创样例表(MySQL必知必会B.2)
    无重复字符的最长字串(C++,python实现)
    softmax详解
    为什么要使用logistic函数
    两个栈实现队列的插入和删除(C++实现)
    用数组实现队列(C++)
    C++ memset函数
    两数之和(C++实现)
  • 原文地址:https://www.cnblogs.com/Cheryol/p/9742552.html
Copyright © 2011-2022 走看看