生成器、迭代器、可迭代对象

生成器、迭代器、可迭代对象这三者的关系刚刚开始接触可真是让我头疼,总结图如下:

 

 

 1、生成器是一种特殊的迭代器,所以生成器一定是迭代器

2、迭代器一定是可迭代对象

3、可迭代对象可以通过iter()方法转化程迭代器

到底什么是可迭代对象?

可迭代对象其实没什么好说的,我们在python编程中就遇到过很多,比如列表、元祖等都是可迭代对象;

可迭代对象:可以逐一返回其成员中的对象都可以称之可迭代对象,所以可迭代对象都是可以进行for循环的。可迭代对象实现了__iter__()方法

例如:

 

 

迭代器 

首先明白,迭代器是继承于可迭代对象的,在此基础上,实现了__next__()方法

迭代器:迭代器一定是一个可迭代器对象,可迭代器对象也可以转化程迭代器,同时迭代器肯定会有__next__和__iter__方法,下面我们可以实现一个迭代器

 

 那么这个迭代器到底有什么作用呢?其实迭代器就相当于一个懒工厂,当我们需要当时候就可以调用next()方法返回值,没有需要当时候就等候,例如:

list1 = [1, 2334, 44, 34]
inter = iter(list1)
print(next(inter))
print(next(inter))
print(next(inter))
print(next(inter))
1
2334
44
34

可以看出:上面就通过next方法将迭代器中的值给取出来了

注意:迭代器中有多少值就只能取几次,超过就会抛出异常:StopIteration

     所有的可迭代对象都可以通过iter方法转化为迭代器

   迭代器对象能够使用next方法和__next__()来实现迭代操作

   所有的迭代器都是可迭代对象,但是可迭代对象不一定是迭代器

   迭代器存在__next()__方法和__iter()__方法 

 

生成器

生成器:生成器是一个特殊的迭代器,继承于迭代器,自己生成了send、throw、close方法,生成器只是存数据生成的方式,不存数据

定义生成器可以通过两种方式:生成器表达式以及函数形式

 

生成器表达式:

 

 通过上面可以看出生成器表达式是否有点像列表推倒式,只是[]换成了()

 

函数形式:如果要用函数的形式实现生成器的话就需要用到yield关键字

 

 注意:生成器中还有一个send方法,该方法是传递值进行替换生成器中的值,但是不能在初始的时候发送值,必须在中间

def iter3():
    for i in range(1, 10):
        num = yield i
        print(num)

a = iter3()  # 获取生成器对象
print(next(a))  # 启动生成器,此时会停止在yield处
a.send(100)  # 使用send方法传值给了生成器中的num,执行这里会从上面的yield那一步执行,直接将值赋给num,然后执行print(num),再执行到yield处停止
print(next(a))
1
100
None
3

看到上述代码指定结果可以得出:a.send(100)执行逻辑:将100赋值给了num,执行了print(num),所以打印出了100,然后会停止在yield处,在执行print(next(a))就会从yield处执行,因为没有send,所以num为None,则打印出了None,

然后在执行到yield处返回了3

 

posted @ 2020-11-13 17:00  大渝  阅读(400)  评论(0编辑  收藏  举报