标签:type 限制 lis tput for 方法 code 空间 运行
? 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
? 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]
改成()
,就创建了一个generator:
ls=[i for i in range(10)]
lm=(i for i in range(10))
print(type(ls))
print(type(lm))
________________________________
output:
<class 'list'>
<class 'generator'>
可以看到,通过这种方法生成的是一个generator ls可以直接打印出来,但是lm需要调用next()方法来获取下一个值。但是一般我们不会采用next()方法来获取生成器的值,而是利用for循环来获得,还可以避免StopIteration的错误。
另外一种创建生成器的方法是利用yield关键字,在函数里出现yield关键字的时候,该函数就会变成一个生成器。
case:
def func():
print('first function')
yield
print('second function')
yield
print('third function')
yield
f=func()
next(f)
next(f)
next(f)
_________________________
output:
first function
second function
third function
在执行过程中,我们可以看到,当程序运行到yield
就会中断,下次又继续执行。当函数称为生成器时,我们不会用next()方法来取得值,而是利用for循环 同时for还会捕获StopIteration错误。
标签:type 限制 lis tput for 方法 code 空间 运行
原文地址:https://www.cnblogs.com/magicdata/p/12327613.html