1、使用yield i
def my_generator(n): for i in range(n): temp = yield i print(f'我是{temp}') g = my_generator(5) print(next(g)) # 输出0 print(next(g)) # 输出1 print(g.send(100)) # 既把100传进去了,又保留了原来迭代应该输出的2 print(next(g)) # 输出3 print(next(g)) # 输出4 ''' 0 #第一次迭代 我是None #第二次迭代 1 我是100 #第三次迭代 2 我是None #第四次迭代 3 我是None #第五次迭代 4 '''
2、改为使用yield
def my_generator(n): for i in range(n): temp = yield print(f'我是{temp}') g = my_generator(5) print(next(g)) print(next(g)) print(g.send(100)) print(next(g)) print(next(g)) ''' None 我是None None 我是100 None 我是None None 我是None None '''
总结:
yield语句的一般形式
temp=yield expression (推荐:既可以返回迭代的值,也可以接受send传进去的参数并赋给temp)
yield expression(也可以使用,只返回迭代的值)
temp=yield (不推荐,)
yield (不推荐,)
send(arg)方法总结:
(1)它的主要作用是,当我需要手动更改生成器里面的某一个值并且使用它,则send发送进去一个数据,然后保存到yield语句的返回值
(2)send(arg)的返回值就是那个本来应该被迭代出来的那个值。 这样既可以保证我能够传入新的值,原来的应该被迭代出来的值也不会弄丢
3、生成器抛异常
def my_generator(): try: yield 'a' yield 'b' yield 'c' yield 'd' yield 'e' except ValueError: print('方法内--触发“ValueError"了') except TypeError: print('方法内--触发“TypeError"了') g = my_generator() print(next(g)) print(next(g)) print('-------------------------') print(g.throw(ValueError)) print('-------------------------') print(next(g)) print(next(g)) print('-------------------------') print(g.throw(TypeError)) print('-------------------------') print(next(g))
4、加上while true
def my_generator(): while True: try: yield 'a' yield 'b' yield 'c' yield 'd' yield 'e' except ValueError: print('方法内--触发“ValueError"了') except TypeError: print('方法内--触发“TypeError"了') g = my_generator() print(next(g)) print(next(g)) print('-------------------------') print(g.throw(ValueError)) print('-------------------------') print(next(g)) print(next(g)) print('-------------------------') print(g.throw(TypeError)) print('-------------------------') print(next(g))
总结:在生成器中抛出异常,这个throw函数会返回下一个要迭代的值或者是StopIteration
生成器的启动和关闭:
启动
第一:直接使用next(g),这会直接开始迭代第一个元素(推荐使用这个启动)
第二:使用g.send(None)进行启动,注意第一次启动的时候只能传入None,如果传入其他具体的指则会报错哦!
关闭
如果一个生成器被中途关闭之后,在此调用next()方法,则会显示错误StopIteration
在一个生成器中,如果没有return,则默认执行到函数完毕时返回StopIteration
-