一、什么是生成器?
答:当函数体内有yield的关键字时就叫做生成器
def foo(): print(‘a‘) yield 1 print(‘b‘) yield 2 print(‘c‘) yield 3 x=foo() print(x.__next__()) print(x.__next__())
可以看出 1、生成器就是迭代器
2、yield与return一样 都是返回值 (区别?向下继续看)
既然生成器就是迭代器 那就可以用for循环来实现一下这个
def foo(): print(‘a‘) yield 1 print(‘b‘) yield 2 print(‘c‘) yield 3 print(‘d‘) x=foo() for i in x: pass
在迭代器里已经说过for循环原理像这个for循环 for i in x: (#obj=x.__iter__#obj.__next__)
def foo(): print(‘a‘) yield 1 print(‘b‘) yield 2 print(‘c‘) yield 3 print(‘d‘) x=foo() for i in x: print(i)#将每次next返回值打出来
每一个next都会print一次 所以打印的结果如下图: 可以看到d是没有返回值的 在迭代器里 就会报出StopIteration但是for循环里他会自动捕捉所以就不会报异常
二、yield的功能
1、把函数的最后执行结果做成迭代器
2、yield与return类似,只不过是yield可以返回多个值,而return只能返回一个值
3、遵循迭代器取值方式 obj.__next__(),触发函数执行,当运行一次obj.__next__()时函数就会停到第一个yield,也就是说你写几个obj.__next__()你函数就停在第几个yield
例子:
def foo(x): print(‘play‘) while x>0: yield x x-=1 print(‘game over‘) g=foo(5) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__())
当然 这样会报一个StopIteration的异常,前面已经说过既然是迭代器也可以这么改一下代码:
def foo(x): print(‘play‘) while x>0: yield x x-=1 print(‘game over‘) g=foo(5) for i in g: print(i)
不再写g.__next__() ,把它改为for循环 就可以自动捕捉异常 不会再报出StopIteration异常
原文地址:https://www.cnblogs.com/StevenSunYiwen/p/9358683.html
时间: 2024-10-01 05:06:05