生成器

生成器
一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);如果函数中包含yield语法,那这个函数就会变成生成器;
1、yield

2、生成器表达式(i for i in range(10))

3、生成器只能遍历一次

 

yield 和 return 的区别

1、yield挂起函数

2、return终止函数

 

# send方法会执行next方法,同是会传值,最后一个yield处不能使用send方法
def generator():
    send = yield '1'
    print(send)
    print('world')
    yield '1'

ret = generator()
print(next(ret))
print(ret.send('hello'))
send方法

 

# yield生成器
def test():
    yield "xiao"
    yield "lang"

g = test()
print(g.__next__())  # xiao
print(g.__next__())  # lang
# print(g.__next__())  # StopIteration


# 列表解析式
l = [i for i in range(10)]
print(l)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

#生成器表达式
l = (i for i in range(10))
print(l.__next__())
print(l.__next__())
print(l.__next__())
print(next(l))
View Code

 

def average():
    sum = 0
    count = 0
    avg = 0
    while True:
        num = yield avg
        sum += num
        count += 1
        avg = sum/count


avg = average()
next(avg)  # --> can't send non-None value to a just-started generator
avg1 =avg.send(1)
avg1 =avg.send(9)
avg1 =avg.send(20)
print(avg1)
利用send计算平均值

 

def init(func):
    def inner(*args, **kwargs):
        g = func(*args, **kwargs)
        # next(g)
        g.__next__()
        return g
    return inner

@init
def average():
    sum = 0
    count = 0
    avg = 0
    while True:
        num = yield avg
        sum += num
        count += 1
        avg = sum/count


avg = average()
avg1 =avg.send(1)
avg1 =avg.send(9)
avg1 =avg.send(20)
print(avg1)
利用装饰器改进->利用send计算平均值

 

def listen_file(filename):
    with open(filename, encoding='utf-8') as f:
        while True:
            line = f.readline()
            if line.strip():
                yield line

g = listen_file('test.txt')
for i in g:
    print(i)
使用生成器监听文件是否有输入

 

 


posted @ 2018-08-16 09:22  李小样  阅读(79)  评论(0)    收藏  举报