二、python高级:生成器与迭代器

一、列表生成式

1、for只控制循环的次数,而for前面的变量决定着数据的内容,这就叫做列表生成式

 

 

 

 

二、生成器(保存的是算法,generator)

1、生成器的特点:只是保存了生成列表数的一个算法,什么时候需要用,就next() 调用。

(1)创建生成器方法1:

只要把一个列表生成式的 [ ] 改成 ( )

调用:

① 直接next(a)一点一点的调用

 

②  for  in 循环

 

(2)创建生成器的方法2: 在函数中加上yield

斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:

 a,b = 0,1 

 a,b = b,a

 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:用生成器

改进:要想一次性得到值,并且超过range的范围不报错。

 

 

总结:

    1、只要添加yield的函数,就变成生成器了。

    2、生成器它有一个特点,你如果按着原先的方式进行调用的话,它不会执行的,而返回一个生成器对象。

    3、yield的运行原理:

         就会从函数的开头开始执行,到yield暂停,将yield后面的值返回。

         如果再调用一下next(a),从暂停的地方继续执行,再循环到yield b处暂停,直到循环完毕

    4、在ipython3 交互环境中,调用,先导包,from xx import  *

     a= createNum()

     调用next(a) ,  out值返回的就是要的值。

 

三、生成器---

send:传值用

t.__next__() 和 t.send("haha")两步原理:
第一次执行t.__next__()时运行到yield i 时就暂停了,把yield后面的i=0返回给了res值了
再执行t.send("haha"),使程序往下执行,接着执行temp=yield i等号左边的temp,并传值
给了temp,依次循环,——执行到yield就停,返回值给res,send继续执行,传值给temp

 

四、生成器---注意事项

1、不能一上来就使用t.send(“haha”)或者 t.send()什么也不传,会报错

      应该结合使用:t.__next__()

                               t.send("传的参数")

2.如果非要一开始就传,传个None:

           t.send(None)

3、再传值时,temp的值不会被修改
      一个函数里面可以有多个yield,也就是只要有一个yield的话,这个函数就是一个生成器

 

五、凡是可作用于 for 循环的对象都是 Iterable(可迭代的对象) 类型

一个类,如果定义了__iter__()方法,并且这个方法可以返回一个迭代器对象,那么它就是可迭代的,

可迭代对象举例:

一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;

一类是 generator ,包括生成器和带 yield 的generator function。都是可迭代对象

 

 

六、凡是可作用于 next() 函数的对象都是 Iterator(迭代器) 类型

迭代器:在一个类中,定义了__next__方法,并且具有返回值,那么就可以称这个类的实例对象是一个迭代器。

上面的实例中,定义了一个MyIterator类,并且定义了__next__方法,且具有返回值,那么他的实例对象mi就是一个迭代器,

一个类,如果定义了__iter__()方法,并且这个方法可以返回一个迭代器对象,那么它就是可迭代的,例如在上面的实例中定义一个__iter__()方法:

def __iter__(self):
    return self

这个方法返回实例对象,通知之前我们知道这个实例对象是一个迭代器,所以现在它不仅是一个迭代器对象,又是一个可迭代对象 

 

 

       生成器可以通过for去循环的形式进行取值,所以是可迭代的对象。

       生成器还可以通过next()的形式进行取值,所以它是迭代器。

       生成器是迭代器,但迭代器不一定是生成器。

 

七、集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过

       iter() 函数获得一个 Iterator 对象。

总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值