python生成器
为什么要用生成器?
其中一个原因就是为了节省空间内存
这里举个例子
def My_range1(a,b,c=1):
"""
生成了列表
"""
res= []
while a < b :
res.append(a)
a += c
return res
for i in My_range1(1,10**8):
print(i,end=',')
以上的代码,返回的是一个列表,但是我们可以看到这里遍历了10的8次方减一次,
那么他会全部传到这个列表当中并且返回过来。
当我们每个数只需要用一次的时候就会显得很累赘,占用空间很大,
这里我们就可以用到生成器了。
def My_range2(a,b,c=1):
"""
这种方式并没有生成列表
是一个一个的返回
几乎不占内存
"""
while a < b : #当a小于b得时候
yield a
a += c #若下一次在调用这个方法 a += c 运行完a += c过后再运行 yield a 返回a
for i in My_range2(1,10**8): #所有这里的遍历是遍历的生成器
print(i,end=",")
这种方式当中并没有生成列表返回,而是一个一个的返回,几乎不占内存。
这就是生成器的好处之一。
这里我们来type一下看看是什么类型,返回的是字符串?还是整数?
这里我们能看到返回的是一个生成器
来看一下具体是怎么运行的吧!!!
这里我们调两个断点
第一次按f7时到了while循环
第二次按f7时,跳到了yield a
当我第三次按f7时,并没有执行a += c ,而是直接跳到了print输出结果
第四次按f7时,我们可以看见在进行第二次for循环.
第五次按f7时并没有直接进行while循环,而是接着第一次的while循环继续执行a += c
第六次按f7时,跳到了while,那就说明新的一次while循环开始了
结论:yield返回时并没有生成一个列表,而是返回一个生成器,当yield运行结束时,并不会继续执行后面的函数,而是当新的一次while循环开始时接着上一次while循环yield后面继续执行,然后再开始新的while循环,依此类推。