生成器可以理解为一种数据类型,这种类型自动遵循了可迭代协议,与其他数据类型不一样,其他数据类型需要通过调用__iter__()方法生成可迭代对象才遵循。也就是说,生成器本质上就是可迭代对象。在Python中,生成器有两种表现形式:生成器函数和生成器表达式。
生成器函数:
# 生成器函数其实与普通的函数基本一致,不同的是生成器函数通过yield关键字来设置返回值,而且在同一个函数中可以使用多个yield def test_yield(): yield 1 yield 2 yield 3 yield 4 # 调用生成器函数,返回的就是一个生成器对象 test = test_yield() print(test) # generator object # 通过生成器对象就可以直接调用__next__()方法拿到函数中的yield返回值 print(test.__next__()) # 拿到第一个yield的值 —— 1 print(test.__next__()) # 拿到第二个yield的值 —— 2 print(test.__next__()) # 拿到第三个yield的值 —— 3 print(test.__next__()) # 拿到第四个yield的值 —— 4 # 如果yield之间还存在其他逻辑语句,则也会执行,也就是说,程序遇到yield关键字就暂停,下次执行则会重这个地方开始往下执行 def test2_yield(): print('first') yield 1 print('second') yield 2 print('third') yield 3 # 拿到生成器对象 test2 = test2_yield() print(test2.__next__()) # first 1 print(test2.__next__()) # second 2 print(test2.__next__()) # third 3
生成器表达式:
# 生成器表达式:(三元运算符) test = (i for i in range(5)) print(test) # generator object print(test.__next__()) # 0 print(test.__next__()) # 1 print(test.__next__()) # 2 print(test.__next__()) # 3 print(test.__next__()) # 4