1. 什么是生成器
- 生成器就是迭代器,迭代器不一定是生成器
2. 生成器怎么生产元素
-
调用一个带有yield的关键字的函数就能得到一个生成器
-
不带yield的函数:调用的时候会执行函数体,并且获取返回值
-
带yield的函数,调用的时候,不会执行函数体,也不会获取返回值,而是产生一个生成器(函数表达式就是一个生成器)
-
这个生成器中的元素就是yield关键字后面的值
-
只要有yield,不管yield出现在哪里,并且是否能执行到,都会将函数变成一个生成器
3. 获取生成器的元素
-
生成器中的元素也是通过next或者for-in
-
生成器获取元素,实质就是去执行生成器对应的函数,每次执行到yield为止,并且会将yield后面的值作为当次获取到的元素
-
下次获取元素的时候,会接着上次结束的位置往后执行,知道下一个yield为止....
-
以此类推,直到函数结束,如果执行到函数结束没有遇到yield,,那么就会报错
-
若yield后面还有代码,会继续往后面执行,直到遇到下一个yield,若没有yield,会报错
-
函数中,有几个yield,就会有几个元素
-
每次执行都是执行上一个yield到本次yield之间的代码,并返回本次yield的值
4. 什么时候要用生成器
- 例如产生学号
def func3():
print('~~~~~')
yield 100, 200, 300
print('!!!!!!')
yield 400
print('*******')
yield 500
gen1 = func3()
print('')
print(gen1)
print(next(gen1))
print(next(gen1))
print(next(gen1))
print('')
def creat_num():
num = 1
while True:
yield 'py1809%d' % num
num += 1
num_gen = creat_num()
for _ in range(10):
print(next(num_gen))
print(next(num_gen))
def my_iter(iterable):
for i in iterable:
yield i
a = my_iter([1, 2, 3])
print(next(a))
print(next(a))
print(next(a))
网友评论