1、迭代器 (1)可迭代对象: <1> 只要具有__ iter __()方法就是一个可迭代对象
(我们可以通过dir()方法去判断一个对象具有什么方法,dir()会返回一个列表,这个列表中含有该对象的以字符串的形式的所有方法名)
lst.__iter__() dict.__iter__() <2> 可迭代对象的优点: 可以直观的查看里面的数据。 <3> 可迭代对象的缺点: 占用内存 可迭代对象不能迭代取值(除去索引,key以外) (2)迭代器:工具 <1> 具有__ iter __ () 和 __ next __() 两个方法的就是迭代器( iter() 和 __ ite r__() 是一样的 推荐使用iter() )
lst = [1,2,3,4,5] l = lst.__iter__() # 将可迭代对象转换成迭代器 l.__iter__() # 迭代器指定__iter__()还是原来的迭代器 print(l.__next__()) # 1 print(l.__next__()) # 2 <2> 迭代器基于上一次停留的位置,进行取值 <3> 迭代器的优点: 惰性机制: 节省空间 <4>迭代器的缺点: 不能直接查看值,迭代器查看到的是一个迭代器的内存地址 一次性,用完就没有了 不能逆行(后退) <5> 应用: 当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。(可参考为什么Python把文件句柄设置成迭代器)。
(3)空间换时间:容器存储大量的元素,取值时间短,但是容器占用空间大 (4)时间换空间:迭代器就是节省了空间,但是取值时间较长 (5)for 循环的本质:(重点) l1 = [1, 2, 3, 4, 5, 6] obj = iter(l1) # 1 将可迭代对象转化成迭代器 while True: # 2,利用while循环,next进行取值 try: print(next(obj)) except StopIteration: # 3,利用异常处理终止循环 break(6)Python2和Python3中的区别:
pyhton3: iter()和 __iter__() 都有 next()和__next__()都有 python2: iter() next()