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,'!!!!')

  

原文地址:https://www.cnblogs.com/Cheryol/p/9742552.html