写在前面的话:
这是我看视频教程抄的笔记,原本是设置为私密的,没想到在APP里不能看。为了能够在APP里看,我只能公开,如有冒失或是侵权,请告知,也深表歉意!
通过列表生成式,可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限制的,而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面的几个元素,
那后面绝大多数占用的空间都白白浪费了,所以,如果列表元素可以按照某种算法推算出来,那么是否可以在循环的过程中不断推算出后续的元素呢,这样就不必创建完整的list,从而节省大量空间。
在python中,这种一边循环一边计算的机制,称为生成器:genetator
把创建列表中的中括号改为括号,就变成了生成式。
列表:a = [x*2 for x in range(10)]
列表变成生成器:a = (x*2 for x in range(10))
只要加了yield的函数,就变成了生成器,不叫函数了。
只要执行到了yield,程序就会暂停,并把后边那个的值返回
如下程序:
def test():
print("---start---")
a,b = 0,1
for i in range(5):
print("---1---")
yield b # 遇到了yield,这里会暂停,并把这个b的值返回!
print("---2---")
a,b = b,a+b
print("---3---")
print("---stop---")
该程序执行如下:
用一个变量进行保存:
a = test()
执行这个生成器test:
next(a)
打印出:---start---
1
如果生成器一直用next()来执行,到最后没有值的时候出现异常报错,我们可以用for 循环遍历出来,这样就不会保存了:
a = test()
for i in a:
print(i)
print("---stop---")
next(a)与a.__next__()这两种方式是一样的。
a.send("你好")与__next__区别:
send()可以传一个值,这个值是给yield这个表达式用的
迭代器:
可以使用isinstance()判断一个对象是否可以迭代;
isinstance(“abcdefg” , Iterable)
也可以用for 循环,如果可以循环,则可迭代,反之!
生成器一定是迭代器,但迭代器不一定是生成器!