可迭代的对象:
# list
# dic
# str
# set
# tuple
# f = open()
# range()
# enumerate
列表是可迭代,有__iter__方法,但不是迭代器,没有__next__和__iter__方法
dir([])查看列表拥有的所有方法
print(dir([])) print(dir([].__iter__())) print(set(dir([].__iter__())) - set(dir([]))) print([].__iter__())
结果:
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']
{'__length_hint__', '__next__', '__setstate__'}
<list_iterator object at 0x00000286CDD2A208>
setstate设置起始值,默认为0
print([1,'a','bbb'].__iter__().__length_hint__()) #元素个数 l = [1,2,3] iterator = l.__iter__() print(iterator.__next__()) #通过next就可以从迭代器中一个一个的取值 print(iterator.__next__()) print(iterator.__next__())
结果:
3
1
2
3
迭代器的概念
迭代器协议 —— 内部含有__next__和__iter__方法的就是迭代器
迭代器协议和可迭代协议
可以被for循环的都是可迭代的
可迭代的内部都有__iter__方法
只要是迭代器 一定可迭代
可迭代的.__iter__()方法就可以得到一个迭代器
迭代器中的__next__()方法可以一个一个的获取值
迭代器的好处:
从容器类型中一个一个的取值,会把所有的值都取到。
节省内存空间
迭代器并不会在内存中再占用一大块内存,
而是随着循环 每次生成一个
每次next每次给我一个
自定义for循环打印,做迭代器,每次打印最后的值之后都会报错
l = [1,2,3,45] iterator = l.__iter__() while True: print(iterator.__next__())
结果:
1
2
3
45
Traceback (most recent call last):
File "E:/Documents/PycharmProjects/study/day12/01.py", line 4, in <module>
print(iterator.__next__())
StopIteration
l是列表可迭代对象而不是迭代器,for循环在内部将l变成迭代器,所以每一个for都是一个新的迭代器
l = [1,2,3,4,5] for i in l: print(i) if i == 2: break for i in l: print(i)
结果:
1
2
1
2
3
4
5
如果事先将l转换成迭代器,那么它可以沿着上一次的内容继续打印,__next__方法存放着调用记录
迭代器是可以继续执行的
l = [1,2,3,4,5] l = l.__iter__() for i in l: print(i) if i == 2: break for i in l: print(i)
结果:
1
2
3
4
5