python生成器(generator)和列表生成式

列表生成式

list1 是一个可迭代的对象。当使用一个列表生成式来简历一个列表的时候,就建立了一个可迭代对象:

<<<list1 = [x*x for x in range(1, 11)]
<<<list1
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

在这里所有的值都存在内存当中,所以并不适合大量数据。在python中,list,tuple,dict和set都是可迭代的对象,字符串也是可迭代对象。

生成器(generator)概念

引题

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束。

生成器语法

要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
生成器特点:
1.可迭代
2.只能读取一次
3.实时生成数据,不全存在内存中


<<<generator = (x*x for x in range(1, 11))
<<<generator
<generator object <genexpr> at 0x000000000DD99990>
<<<next(generator)
1
<<<next(generator)
4
<<<for i in generator:
    print(i)
    
9
16
25
36
49
64
81
100

区别·:
我们可以直接打印出list的每一个元素,
而打印出来generator的每一个元素可以通过next()函数获得generator的下一个返回值,
这个生成器只能使用一次for循环来遍历,之后就不能使用了

生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器函数。

yield是一个类似return的关键字,只是这个函数返回的是个生成器
但是生成器函数可以生产一个无线的序列,这样列表根本没有办法进行处理。
yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator。生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器函数。

def createGenerator():
	mylist = range(3)
	for i in mylist:
		yield i*i
mygenerator = createGenerator()  # 创建一个生成器
print(mygenerator)
<generator object createGenerator at 0x000000000DD999E8>
# 打印出来显示mygenerator是一个对象
for i in mygenerator:  # 使用for调用生成器对象
	print(i)
0
1
4

第一次迭代中createGenerator函数才会执行,从开始到达yield关键字,然后返回yield后的值作为第一次迭代返回的值,然后,每次执行这个函数都会继续执行你在函数内部定义的那个循环的下一次,再返回那个值,直到没有值可以返回的。

[yield 与 return具体用法参考该网址](https://www.cnblogs.com/jessonluo/p/4732565.html)

猜你喜欢

转载自blog.csdn.net/qq_43503724/article/details/85724419