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

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

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

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

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

到底什么是可迭代对象?

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

可迭代对象:可以返回一个迭代器的对象都可以称之可迭代对象,可迭代对象一定会存在__iter__方法

例如:

迭代器 

迭代器:迭代器一定是一个可迭代器对象,可迭代器对象也可以转化程迭代器,同时迭代器肯定会有__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

生成器

生成器:生成器是一个特殊的迭代器,定义生成器可以通过两种方式:生成器表达式以及函数形式

生成器表达式:

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

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

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

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

a = iter3()
print(next(a))
a.send(100)
print(next(a))
1
100
None
3

看到上述代码指定结果可以得出:a.send(100)就替换了2这个值,只用None这个值是因为iter()值中的print,因为直接替换了2这个值,那么就不会取到2这个值了,所以num为None

原文地址:https://www.cnblogs.com/LCboss/p/13970262.html