生成器
生成器
一个函数调用时返回一个迭代器,那这个函数就叫做生成器(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'))
# 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))
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)
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)
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)
浙公网安备 33010602011771号