什么是生成器在学习生成器之前,首先我们要知道什么是生成器?python中while循环计算的机制就是生成器。生成器函数知道了什么是生成器之后,我们还要知道为什么要有生成器呢?也就是说,这种while循环计算的机制有什么用呢?我们知道,列表中的所有数据都是存放在内存中的,如果数据很多,对内存的消耗尤其大。先不说内存有没有这么大,假设我们只需要访问前几个元素,那后面的元素占用的空间岂不是白白浪费了?所以这时候如果列表中的元素可以按照一定的算法自动计算出来,那么就不需要创建一个完整的列表,这样可以节省大量的内存空间。所以如果想节省内存又需要用到大量数据,可以使用生成器。创建一个生成器有几种方法可以用类似于列表生成的方式来创建一个生成器。最简单的就是把一个listgeneration的[]改成(),这样就可以直接创建一个generator:#listgenerationlist=[xforxinrange(10)]print(list)#[0,1,2,3,4,5,6,7,8,9]#generatorgenerator=(xforxinrange(10))print(generator)#at0x0000000002131A20>我们可以打印所有的直接通过print(list)打印列表中的元素。但是print(generator)打印出来的是一个对象。如果我们想打印出生成器中的元素怎么办?有两种方式:1:通过next()方法逐个打印元素:generator=(xforxinrange(10))print(next(generator))#0print(next(generator))#1print(next(generator)))#2每次调用next()方法,计算下一个元素的值,直到超过最后一个元素,会抛出StopIteration错误。这种方法只能一个一个打印元素。如果你只需要前几个元素,这个方法正好合适。如果需要打印的元素很多,这种方法就太不方便了。这时候我们可以使用第二种方法。二:使用for循环,因为生成器也是可迭代对象。generator=(xforxinrange(5))forgingenerator:print(g)#Output:01234不仅可以一次打印出所有元素,而且打印时不用担心StopIteration异常通过一个for循环。这看起来和列表生成一样吗?但要注意列表生成公式直接将所有元素存放在内存空间,占用内存很大。生成器不会立即将结果写入内存,而是一种存储的计算方法。通过不断的计算,可以得到对应位置的值,所以占用的内存只是计算对象的存储。方法二:通过函数实现如果计算算法比较复杂,无法用类似列表生成的for循环实现,也可以用函数实现。只需在函数中定义一条yield语句即可。所以一个有yield的函数不再是一个普通的函数,而是一个生成器。yield相当于return返回一个值,记住这个return的位置。在下一次迭代中,代码将从下一条yield语句开始执行。defgen_yield():foriinrange(3):yieldig=gen_yield()print(next(g))#0print(next(g))#1print(next(g))#2print(next(g))#Error:StopIteration#生成器函数的每一次next()迭代都会返回当前yield的值,并在此暂停,下一次next()迭代,#从上一次yield开始,向下执行,仍然在下一次暂停yield#forloopiterationforiing:print(i)#output:012上面的gen_yield()其实就是一个生成器函数,如果我们想在这个函数中获取返回值,也可以通过next()方法或者for循环迭代得到。参考:https://www.9xkd.com/