day13 迭代器

迭代器

'iterable' 可迭代的

内部含有__iter__方法的数据类型就是可迭代的 —— 可迭代协议

复制代码
print(dir([]))
print(dir({}))
print(dir(5))
print('__iter__' in dir('abc'))  # True
ret = 'abc'.__iter__()
print(ret)
'iterator'  # 迭代器
复制代码

迭代器可以理解为一个容器,我们从这个容器当中一个接着一个的把值取出来的过程就是迭代的过程
如何从迭代器中取值

复制代码
print(ret.__next__())  # a
print(ret.__next__())  # b
print(ret.__next__())  # c
print(ret.__next__())  # StopIteration

l = ['ha','hei','he']
lst_iter = l.__iter__()
print(lst_iter.__next__())
print(lst_iter.__next__())
print(lst_iter.__next__())
复制代码

可迭代的 可迭代对象 python一切皆对象
迭代器

print(dir(l))
print(dir(lst_iter))
print(set(dir(lst_iter)) - set(dir(l)))  # {'__next__', '__setstate__', '__length_hint__'}

lst_iter.__setstate__ # 设置从哪开始迭代
可迭代的必须含有__iter__方法 # 可迭代协议
迭代器比可迭代的多一个__next__方法
迭代器:包含__next__,__iter__方法的就是迭代器 # 迭代器协议
包含__next__方法的可迭代对象就是迭代器
迭代器是可迭代的的一部分
获得迭代器:可迭代的调用__iter__
使用迭代器:迭代器.__next__()

print('__iter__' in dir(lst_iter))
print('__next__' in dir(lst_iter))

如何判断一个变量是不是迭代器或者可迭代的

复制代码
# print('__iter__' in dir(lst_iter))
# print('__next__' in dir(lst_iter))
from collections import Iterable
from collections import Iterator
print(isinstance('a',str))
print(isinstance([1,2,3,4],Iterable))
print(isinstance([1,2,3,4],Iterator))
print(isinstance(1,Iterable))
print(isinstance(1,Iterator))
print(isinstance(lst_iter,Iterator))
复制代码

可迭代的:__iter__
迭代器:__iter__和__next__
迭代器和可迭代的关系:可迭代的包含迭代器
迭代器和可迭代的判断:两种方法

 

迭代器的工作原理
l_iter = [1, 2, 3, 4, 5].__iter__()
迭代器只是记录当前这个元素和下一个元素

print('__iter__' in dir(range(10)))
print('__next__' in dir(range(10)))
range_iter = range(10).__iter__()
print(range_iter.__next__())
print(range_iter.__next__())

迭代器的特点
惰性运算
从前到后一次去取值,过程不可逆,不可重复
节省内存

for item in [1,2,3]:
    pass
# list_iter = [1,2,3].__iter__()
# list_iter.__next__()

用while循环模拟for循环的方式 —— for循环是了依赖迭代器的,且我们自己也可以仿照着写

复制代码
l = [1,2,3,4,5]
l_iter = l.__iter__()
while True:
    try:
        print(l_iter.__next__())
    except StopIteration:  # 遇到StopIteration就break
        break
复制代码

for循环是让我们更简单的使用迭代器
用迭代器取值就不需要关心索引或者key的问题了

目前我们已知的可迭代的都是python提供给我们的
range()
文件f
enumerate()
在平时写代码的过程中,我们用for循环就够了

posted @ 2017-11-03 15:11  邯城吴彦祖  阅读(147)  评论(0编辑  收藏  举报