Python 迭代器和生成器的区别

1 篇文章 0 订阅
1 篇文章 0 订阅

常见基础问题,老忘,写一波提醒自己。
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下一个值
大体就是这样,可以自己把代码弄下来,设个断点看看就明白了~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值