生成器是一种特殊的迭代器。
生成器的几种生成方法
1.将[]变成()
1 def main():
2 nu=[i*2 for i in range(5)]
3 print(nu)
4 nu=(i*2 for i in range(5))
5 print(nu)
6
7
8 if __name__=="__main__":
9 main()
~
执行结果,明显第二次打印的是一个生成器对象
wy@ubuntu:~/day1$ python3 d.py
[0, 2, 4, 6, 8]
<generator object main.<locals>.<genexpr> at 0x7f5e75aea360>
2.yield.
一个函数中只要有yield语句,那么就不再是函数了,而是一个生成器模板,就相当于迭代器的类一样;在我们调用含有yield的函数时,不是我们理解的调用函数,而是创建一个生成器对象。
==实现过程:==定义的函数里又yield语句时,这个函数不再是函数,而是一个生成器模板,相当于迭代器中的类一样,是类模板,当你调用函数,其实不是调用函数,而是创建生成器对象,里面的参数,传递给定义的"函数"了,但此时函数不会向下执行它里面的内容;定义的obj变量指向生成器对象,执行到for循环时,这时就要引用生成器对象了,从第一句开始向下执行,执行到yield时,此时函数暂停(是暂停而不是结束),将yield的结果给num,打印输出结果,继续执行for循环,此时就不再是从函数开头执行,而是从yield语句的下一句开始执行,while下的语句执行完之后,再次跳到while循环,继续执行while循环的语句,执行到yield语句,函数暂停,将值传递给num,一直这样循环,知道程序结束。
1 def creat_num(all_num):
2 a, b=0, 1
3 current_num=0
4 while current_num<all_num:
5 yield a
6 a, b=b, a+b
7 current_num+=1
8
9 obj=creat_num(10)
10
11 for i in obj:
12 print(i)
执行结果:
wy@ubuntu:~/day1$ python3 d.py
0
1
1
2
3
5
8
13
21
34
为了更好的理解,我们使用next()方法启动生成器
1 def creat_num(all_num):
2 a, b=0, 1
3 current_num=0
4 while current_num<all_num:
5 yield