迭代器
可迭代协议:只要是含有__iter__
方法的都是可迭代的
我们用dir()可显示出列表、字典、字符串所包含的所有方法,可以看到他们都会含有__iter__
,只要是能被for循环的数据类型,就一定用拥有__iter__
方法。
print(dir([]))
print(dir({
}))
print(dir(''))
判断一个对象是否是可迭代的
from collections import Iterable
print(isinstance([],Iterable))
执行__iter__()
后返回的就是一个迭代器,下面我们看看迭代器中特有的方法
l = [1,2,3]
itera = l.__iter__() # itera现在是迭代器
# 查看迭代器中相比原来的列表特有的方法
print(set(dir(itera))-set(dir([])))
>>>{
'__next__', '__length_hint__', '__setstate__'}
itera.__length_hint__()
可返回迭代器的长度
itera.___next__()
可一个一个的获取值
迭代器协议:内部含有__next__
和__iter__
方法的就是迭代器。
判断一个对象是否是迭代器
from collections import Iterator
print(isinstance([],Iterator))
我们可以自己创建一个数据类型,让他包含__next__
和__iter__
这两个方法,来验证上述结论是否正确。
class D:
def __iter__():
pass
def __next__():
pass
d = D()
print(isinstance(d,Iterator))
>>> True
for循环其实就是在用迭代器
l = [1, 2, 3]
for i in l:
print(i)
# for循环其实就是先执行
# l.__iter__()得到迭代器iterator
# 然后iterator.__next__()得到一个一个的值
迭代器总结
-
会区分迭代器协议和可迭代协议,迭代器一定是可迭代的,可迭代的不一定是迭代器;
-
可迭代的对象用
__iter__()
方法可得到一个迭代器; -
只有是可迭代对象的时候才能用for循环,也就是可以被for循环的都是可迭代的。当我们遇到一个新的变量,不确定能不能for循环时,可判断它是否可迭代。
-
迭代器的好处:
-
从容器类型中一个一个的取值,会把所有值都取到,使用方便。
-
节省内存空间,迭代器并不会在内存中占用一大块内存,而是随着循环每次生成一个或者每次next给一个。
print(range(10000000000000)) # 输出结果是range(0,10000000000000)
-