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一下看看是什么类型,返回的是字符串?还是整数?

python AES256 key iv生成器_字符串

这里我们能看到返回的是一个生成器
来看一下具体是怎么运行的吧!!!
这里我们调两个断点

第一次按f7时到了while循环

python AES256 key iv生成器_生成器_02

第二次按f7时,跳到了yield a

python AES256 key iv生成器_生成器_03

当我第三次按f7时,并没有执行a += c ,而是直接跳到了print输出结果

python AES256 key iv生成器_while循环_04

第四次按f7时,我们可以看见在进行第二次for循环.

python AES256 key iv生成器_字符串_05

第五次按f7时并没有直接进行while循环,而是接着第一次的while循环继续执行a += c

python AES256 key iv生成器_生成器_06

第六次按f7时,跳到了while,那就说明新的一次while循环开始了

结论:yield返回时并没有生成一个列表,而是返回一个生成器,当yield运行结束时,并不会继续执行后面的函数,而是当新的一次while循环开始时接着上一次while循环yield后面继续执行,然后再开始新的while循环,依此类推。