g =(x for x in range(1,1000)) 生成器 print(g.__next__()) print(g.__next__()) print(g.__next__()) 获取方式一 print(g.__next__()) print(next(g)) 获取方式二 print(next(g)) print(next(g)) print(next(g))
每调用一次生成一个结果,用哪个取哪个,取到尽头不能再取,不然会报错,用生成器这样不占用过多内存
def func(): n=0 while True: n += 1 yield n 代表把函数变成生成器 g = func() print(next(g)) 第一次抛出接到n print(next(g))第二次重yield下一段代码开始然后抛出 print(next(g)) print(next(g))
yield代表在此位置停下并抛出n,注意暂停后,下一次调用next()就会从暂停的下方代码重新开始。
n = yield n 如果遇到这种,执行第一次会先停然后next()先输出一次,第二次才会在这个位置开始赋值到n
g.send(‘字符串或者数字’')把字符串或者数字传到n上,但第一次send必须先传空值g.send(none)
例子:
def test1(n) : for i in range(n): print('test1',i) yield None def test2(n) : for i in range(n): print('test2',i) yield None t1 = test1(10) t2 = test2(10) while True: try: t1.__next__() t2.__next__() except Exception: break
test1和test2函数后面加yield暂停,下面再调用,这样就可以做到每循环一次然后切换下个函数运行一遍。
应用点:协程