学习笔记--可迭代对象、迭代器、生成器
迭代器、生成器、可迭代对象之间什么关系,这两天学习的时候,发现比较绕,总结记录下。
1. 了解迭代器
首先,我们要知道一个概念,什么叫 ”可迭代”, 所谓的可迭代,简单理解就是可以 被for循环,
在介绍迭代器之前,我们需要知道两个概念:
(1)可迭代协议, 所有实现了,__iter__方法的对象,都是可迭代类型。例如,字符串、list、tuple、set,range(数字),以及任何实现了__iter__方法的对象。
(2)迭代器协议,所有实现了, __iter__方法以及__next__方法的对象,都是迭代器。__next__方法要么返回下一个值,要么抛出一个StopIteration异常,以终止迭代。
实现了迭代器协议的对象都是迭代器。
2.迭代器的特点:
迭代器有三个特点
(1)只能从头到尾,依次取值,不能返回去取某个位置的值。
(2)任何值只能取一次,取了之后,不能取第二次。
(3) 迭代器是一个对象,只有在取值时,才真正的去取值。
3迭代器的取值方法:
迭代器的取值方法有三种:
(1)使用__next__()方法进行取值,
(2)使用for循环去取值
(3)使用list(迭代器对象)进行取值。
4.生成器
迭代器有很多的优点,但是在定义的时候,还是比较麻烦的,那有没有更加简单的方法获取一个迭代器呢,答案是有的,那就是生成器。
生成器就是一个装饰器(满足装饰器协议,实现了__next__方法,以及__iter__方法)。并且它的定义比装饰器更加简单,只需要在方法中,添加一个yield,来返回值,就可以了。
其他和迭代器一模一样。
def ff():
for i in range(5):
yield i
if __name__ == '__main__':
f = ff() #<generator object ff at 0x000001AD0>
print(f) #
print(f.__next__()) #0
print(next(f)) #1
print(list(f)) #[2, 3, 4]
浙公网安备 33010602011771号