本文主要讲解python生成器的使用方法以及优点,对其背后的原理不进行深程度的研究。
目录
前言:
一 、生成器的创建
通过def&&yield
通过规则表达式
二、生成器的使用及优势
前言:
我们都知道数据存储在计算机里是需要耗费内存的。当我们需要遍历一组数据或对这一组数据进行操作时,事先生成好的数据,特别是当数据量很大的时候;我们或许一时用不上所有的数据,但是这些数据还是会占用计算机的内存空间。生成器可以为我们带来的是,每当我们需要一点数据时,取出一点数据,在需要时,再取出;有效的解决了空间浪费的问题。
一 、生成器的创建
通过def&&yield
在python语言中,生成器主要有两种。第一种也是最常用的一种是把函数中的return换成yield。python中数据生成器与函数的返回值不同。函数的返回值是一次性的返回所有结果;而数据生成器是当且仅当需要使用该数据时才会返回。当执行到yield语句时,会暂停并保存所执行的信息,返回yield后的语句;当再次调用生成器的数据时,会从yield后的语句开始执行。
def a():
for i in range(5):
it = [i]
yield it
it = []
如图所示:
我们定义了一个生成器a,因为我们用到了保留字yield;如果将yield换成return,那么a就是一个函数,但是此时python会报错,因为后面还有一条it = [],当作为函数时没有对齐,不符合python语法。但是作为生成器的a没有任何问题,因为只有遍历a内的数据,才会执行a,然后返回yeild后的语句,再次获取a内的数据时,从yield再次开始执行。
如上图所示,我们定义了一个数据生成器a,调用数据生成器赋值给b,此时的b就是一个生成器。
通过规则表达式
g = (x * x for x in range(10))
如图所示:g就是一个数据生成器。其中x*x就是一个规则表达式,g里面的所有元素都是通过这一规则表达式生成的。
二、生成器的使用及优势
def b():
for i in range(5):
it = [range(i)]
yield it
it = []
yield it
c = b()
for i in c:
print(i)
如图所示,我们定义了一个函数生成器b并赋值给c,依次遍历c中所有的元素。
从运行结果来看,正如我们在前文所描述的一样,生成器内原本并没有值,只是当我们需要生成器内的数据时,生成器才会从b内的yield返回值给我们。之后的yield = []是说当我们每取完一次it内的数据,就将it列表清空,可以理解为减少内存的占用;这样,当我们再次需要一组数据时,再次调用c内的数据(通过for循环),这时生成器会从yield处继续执行。继而在获取数据的同时减少了内存的占用。
具体过程如下:
参考:https://www.runoob.com/python3/python3-iterator-generator.html