生成器函数
生成器定义
在Python中,一边循环一边计算的机制,称为生成器
为什么要有生成器
当一个列表中有很多元素,但是我们只需要前面几个元素时,后面的绝大多数元素占用的空间就白白浪费了,这样非常消耗内存
简单来说:当我们需要得到庞大的数据时,又想它占用的内存空间少,这时就需要生成器
如何创建生成器函数
生成器是由函数+yield关键字创造出来的写法,在特定的情况下,它可以用来帮我们节省内存空间
--生成器函数,当函数中存在yield时,该函数就是一个生成器函数
例如:
def func():
pring(11)
yield 1
生成器函数的使用方法
1.生成器对象:在执行一个生成器函数时,会返回一个生成器对象
def func():
print(11)
yield 1
pring(22)
yield 2
data = func()
print(data) # 输出:<generator object func at 0x000000000265C970>
注意:当执行生成器函数时,函数里面的代码是不会执行的,这时会返回一个生成器对象
2.当需要执行函数里面的内容时需要使用next(执行的函数),当函数执行过程中遇到yield时就不往下执行了,记录这次执行的位置,下次执行时继续向下执行
def func():
print(11)
yield 1
pring(22)
yield 2
data = func()
# next(data) # 这时会输出:11 当v1 = next(data)
v1 =next(data)
print(v1) # 这时会输出:11,1;
注意:当遇到next()时,会执行yield之前的函数,当执行v1 = next()时,会执行yield,如果当程序中遇到return时,会报错StopIteration 错误
3.生成器函数一般不会向上面那样单独执行,一般是进行for循环中使用,即解决了报错的问题
def func():
print(11)
yield 1
pring(22)
yield 2
data = func()
for i in data:
print(i)
生成器特点:记录在函数中的执行位置,当下次执行next()时,会从上次的位置基础上在继续往下执行
当以后需要我们在内存中创建很多数据时,可以想着用基于生成器来实现一点一点生成(用一点生产一点),以节省内存的开销
扩展知识:
def func():
print(111)
v1 = yield 1
print(v1) # send所传递的值其实就是给 =号左边的左值赋值
print(222)
v2 = yield 2
print(v2)
print(333)
v3 = yield 3
print(v3)
print(444)
data = func() # 执行生成器函数,返回一个生成器对象
n1 = data.send(None) # 执行到第一个yield(也是启动生成器),这时会输出:111
print(n1) # 或得第一个yield的返回值,返回值为1,这时会输出:1
n2 = data.send(6) # 执行到第二个yield,输出print(v1)和print(222),print(v1)即为send(6)给v1 = yield 1左边进行赋值,即v1=6
print(n2) # 或得第二个vield的返回值,返回值为2,这时会输出:2
n3 = data.send(777)
print(n3)
n4 = data.send(888)
print(n4)
解释以上代码:
为什么需要send(None),也很好理解,因为 生成器还没有走到第一个yield语句,如果我们发生一个真实的值,这时是没有人去“接收”它的。
一旦生成器启动了,就对象接受(即=号左边的左值xx接受了),之后就可以使用send(params)不断传入值了
▲注意,每次的send()都会运行到yield语句,但赋值不会执行,只会有返回值,相当于return后就退出函数了,所以在返回值之后的赋值就不会执行了
浙公网安备 33010602011771号