第一阶段:生成器解释
目录
1. 生成器初始
什么是生成器?这个概念比较模糊,各种文献都有不同的理解,但是核心基本相同。生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念。不是相同么?为什么还要创建生成器?生成器和迭代器也有不同,唯一的不同就是生成器有yield关键字来接受返回值
1.1 生成器的构建
在python中有三种方式来创建生成器:
1.通过生成器函数
2.通过生成器推导式
3.python内置函数或者模块提供(其实1,3两种本质上差不多,都是通过函数的形式生成,只不过1是自己写的生成器函数,3是python提供的生成器函数而已)
1.2 生成器函数
我们先看一个很简单的函数:
def func():
print('in func1')
return 22
func()
print(func())
结果
将函数中的return换成yield,这样func就不是函数了,而是一个生成器类
代码
from collections import Generator
def func():
print('in func1')
yield 22
yield 33
f=func()
print(isinstance(f, Generator))
print(f.__next__())
print(f.__next__())
结果
结论
发现当我们在函数中有用到yield是通过打印这个函数的类型,发现这个函数就是生成器了,但需要注意函数加了yield并不是生成器函数,而是生成器类
调用的时候我们需要实例化这个类才可以使用,并且也发现也可以使用__next__函数那么可以得到结论生成器就是迭代器
1.2.1 生成器的取值(这个不再多说只需要记住下面的结论)
生成器的本质就是迭代器.迭代器如何取值,生成器就如何取值。所以我们可以直接执行next()来执行以下生成器
1.2.2 return and yield 区别
- return 函数中只存在一个return结束函数,并且给函数的执行者返回值。
- yield 只要在函数中有yield那么它就是生成器函数而不是函数了。
生成器函数中可以存在多个yield,yield不会结束生成器函数,一个yield对应一个next
生成器的作用也可以说就是迭代器的作用只不过是通过yield简化了迭代器的代码,
1.2.3 yield from
提供一种可以直接把可迭代对象中的每一个数据作为生成器的结果进行返回
# 对比yield 与 yield from
def func():
lst = ['卫龙','老冰棍','北冰洋','牛羊配']
yield lst
g = func()
print(g)
print(next(g)) # 只是返回一个列表
def func():
lst = ['卫龙','老冰棍','北冰洋','牛羊配']
yield from lst
g = func()
print(g)
# 他会将这个可迭代对象(列表)的每个元素当成迭代器的每个结果进行返回。
print(next(g))
print(next(g))
print(next(g))
print(next(g))
'''
yield from ['卫龙','老冰棍','北冰洋','牛羊配']
等同于:
yield '卫龙'
yield '老冰棍'
yield '北冰洋'
yield '牛羊配'
'''