1、迭代
如果给定一个list或tuple,我们要想访问其中的某个元素,我们可以通过下标来。如果我们想要访问所有的元素,那我们可以用for循环来遍历这个list或者tuple,而这种遍历我们就叫做迭代。
软件开发就是典型的迭代更新。
2、可迭代协议:只要含有__iter__()方法的都是可迭代的
可以被for循环的都是可迭代的,要想可迭代,内部必须有一个__iter__方法。
字符串、列表、元组、字典、集合、打开的文件句柄,range(),enumerate都可以被for循环,说明他们都是可迭代的。
print('__iter__' in dir(int)) #false print('__iter__' in dir(list)) print('__iter__' in dir(dict)) print('__iter__' in dir(set)) print('__iter__' in dir(tuple)) print('__iter__' in dir(bool)) #false print('__iter__' in dir(enumerate([]))) print('__iter__' in dir(range(10)))
可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。
# 执行list([1,2])的__iter__方法,得到了一个list_iterator(迭代器)
print([1,2].__iter__()) 运行结果: <list_iterator object at 0x1024784a8>
3、迭代器协议:内部同时含有__next__()方法和__iter__()方法
from collections import Iterable from collections import Iterator class A: def __iter__(self):pass # def __next__(self):pass a = A() print(isinstance(a,Iterator)) # 不是迭代器 print(isinstance(a,Iterable)) # 可迭代的:True
# 迭代器的好处: # 【不依赖索引】迭代器的__next__方法从容器类型中一个一个的取值,会把所有的值都取到 # 惰性计算,可以节省内存空间【range,f=open()】 # 迭代器并不会在内存中再占用一大块内存,而是随着循环,每次(next)生成一个 # 迭代器的缺点: # 不如按索引取值方便 # 一次性,只能往后取,不能往回退
4、可迭代对象和迭代器的转换
#可迭代的 ==> 迭代器 # 可迭代的.__iter__()方法 # 可迭代的 + __next__()方法 (+的意思是拥有) # 迭代器一定是可迭代的,反之不对
l = [1,2,3,4] l_iter = l.__iter__() # 可迭代对象变成迭代器 while True: try: #处理 “一直取next取到迭代器里已经没有元素”的异常 item = l_iter.__next__() print(item) except StopIteration: break
5、for循环的实质
l = [1,2,3] for i in l: print(i) ------------------------------------------------------------------------------------ l = [1,2,3] iterator = l.__iter__() # 可迭代的.__iter__()方法就可以得到一个迭代器 print(iterator.__next__()) # 1 print(iterator.__next__()) # 2 print(iterator.__next__()) # 3 print(iterator.__next__()) # StopIteration