# 迭代器
l = [1, 2, 3]
# 索引
# 循环 for
print(dir([])) # 输出列表拥有的所有方法
print(dir(str))
# 双下划线的方法:双下方法,C语言代码
iter = l.__iter__() # 迭代器
item = iter.__next__() # 迭代器的__next__方法,取值
print(item)
# 只要含有__iter__方法的都是可迭代的————可迭代协议
# 迭代器协议 ————内部含有__next__方法和__iter__方法的就是迭代器
# 可以被for循环的都是可迭代的
# 可迭代的内部都有__iter__方法
# 可迭代的.__iter__()方法就可以得到迭代器
# 迭代器中的__next()__()方法可以一个一个获取值
# for循环其实就是在使用迭代器
# 只有是可迭代对象的时候才能用for
# 遇到新的变量,不确定数据类型时,可以通过是否由__iter__()方法知道是否是可迭代对象,就能用for得到
# 迭代器的好处:
# 从容器中一个一个的取值。
# 节省内存空间
# 迭代器不会在内存中占用一大块内存
# 而是随着循环 每次生成一个
# 每次next取出一个
print('__iter__' in dir(l.__iter__()))
print('__next__' in dir(l.__iter__()))
from collections import Iterable
from collections import Iterator
print(isinstance([], Iterator)) # isinstance 判断是否是迭代器
print(isinstance([], Iterable)) # isinstance 判断是否可迭代
for i in l.__iter__():
print(i)
for i in l:
pass
# iterator = l.__iter__()
# iterator.__next__()
# for循环的本质
print('__next__' in dir(range(100)))
print('__next__' in dir(list(range(100))))