常见基础问题,老忘,写一波提醒自己。
1. 首先,要了解什么是Iterables。
我们常常这么写一个遍历打印程序,一个一个来读取元素的值。
>>> mylist = [1, 2, 3]
>>> for i in mylist:
... print(i)
1
2
3
基本上for ....... in ........这种结构都适用于Iterables。由于Iterables会把所有元素都保存在内存中,所以当Iterables特别大,内存不就炸了!!所以我们要贪婪一点,于是产生了生成器~
2. 生成器是啥?
生成器是每次只能读一个元素的迭代器。这样每次迭代你就在内存放一个元素,这样多好啊!举个例子:
>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
... print(i)
0
1
4
你看这边不再是"[ ]" 这种括号了,而是"( )"是不是很牛逼?这样就可以贪心的每次只读一个元素了!!哈哈哈哈哈!!!!
但是还没完,yield这个关键字又是啥呢?
3.Yield
这就是个return,只是它return的是一个generator,是个生成器!比如:
>>> def createGenerator():
... mylist = range(3)
... for i in mylist:
... yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
... print(i)
0
1
4
哈哈哈哈哈,手写生成器,你第一眼看觉得这yield不就是return,但是不一样。你每次调用createGenerator,它是不会执行里面的方法的,它只是返回这个对象。只有当你要迭代这个生成器的时候,才会run这个方法。就上面代码具体来讲:
1.执行mygenerator = createGenerator()返回了一个生成器对象,里面代码不会run。
2. print(mygenerator)你发现他打印的是个地址
3. 卧槽,for i in mygenerator:这里面有个前面返回的生成器,赶紧调用createGenerator方法,看看里面写的什么鬼方法,return i*i这个值。每次for i in mygenerator都会回到createGenerator方法去return下一个值
大体就是这样,可以自己把代码弄下来,设个断点看看就明白了~~~~