Python迭代器
我们之前一直在用可迭代对象进行操作,那么到底什么是可迭代对象.我们现在就来讨论讨论可迭代对象.首先我们先回顾下我们
熟知的可迭代对象有哪些:str list tuple dic set 那为什么我们称他们为可迭代对象呢?因为他们都遵循了可迭代协议,那什么又是可迭代协议呢.首先我们先看一段错误的代码:
对的 s='abc' for i in s: print(i) 结果: a b c 错的 for i in 123: print(i) 结果: File "C:/Users/Administrator/PycharmProjects/python14/number/002.py", line 5, in <module> for i in 123: TypeError: 'int' object is not iterable
注意看报错信息,报错信息中有这样一句话: 'int' object is not iterable 翻译过来就是整数类型对象是不可迭代的.
iterable表示可迭代的.表示可迭代协议 那么如何进行验证你的数据类型是否符合可迭代协议.我们可以通过dir函数来查看类中定义好的
所有的方法
a='abc' print(dir(a)) #dir查看对象的方法和函数 #在打印结果中寻找__iter__如果存在就表示当前的这个类型是可迭代对象
还可以用此方法查看列表,元祖字典集合中是不是有__iter__
# 列表 lst = [1,2] print(dir(lst)) # 元祖 tuple = (1,2) print(dir(tuple)) # 字典 dic = {'a':1,'b':2} print(dir(dic)) # 集合 se = {1,2,3,4,4} print(dir(se))
其实也可以这么说for循环的就有__iter__方法,包括range
这是查看一个对象是否是可迭代对象的第一种方法,我们还可以通过isinstence()函数来查看一个对象是什么类型的
l = [1,2,3] l_iter = l.__iter__() from collections import Iterable from collections import Iterator print(isinstance(l,Iterable)) #True #查看是不是可迭代对象 print(isinstance(l,Iterator)) #False #查看是不是迭代器 print(isinstance(l_iter,Iterator)) #True print(isinstance(l_iter,Iterable)) #True
通过上边的我们可以确定.如果对象中有__iter__函数,那么我们认为这个对象遵守了可迭代协议.就可以获取到相应的迭代器
.这里的__iter__是帮助我们获取到对象的迭代器.我们使用迭代器中的__next__()来获取到一个迭代器的元素,那么我们之前所讲的
for的工作原理到底是什么? 继续向下看:
s = "我爱北京天安⻔" c = s.__iter__() # 获取迭代器 print(c.__next__()) # 使⽤迭代器进⾏迭代. 获取⼀个元素 我 print(c.__next__()) # 爱 print(c.__next__()) # 北 print(c.__next__()) # 京 print(c.__next__()) # 天 print(c.__next__()) # 安 print(c.__next__()) # ⻔ print(c.__next__()) # StopIteration
for循环是不是也可以,并且还不报错啊,其实上边就是for的机制,
我们使用while循环和迭代器来模拟for循环: 必须要会
lst=[6,5,4] l = lst.__iter__() while True: try: i= l.__iter__() print(i) except StopIteration: break
注意:迭代器不能反复,只能向下执行
总结:
Iterable:可迭代对象,内部包含__iter__()函数
Iterator:迭代器,内部包含__iter__()同时包含__next__()
迭代器的特点:
1.节省内存
2.惰性机制
3.不能反复,只能向下执行
我们可以把要迭代的内容当成子弹. 然后呢. 获取到迭代器__iter__(), 就把子弹都装在弹夹中. 然后发射就是__next__()把每一个子弹(元素)打出来. 也就是说, for循环的时候.一开始的 时候是__iter__()来获取迭代器. 后面每次获取元素都是通过__next__()来完成的. 当程序遇到 StopIteration将结束循环.
习题:
1.for循环和迭代器之间有什么关系
for语句接受一个可迭代对象作为其参数,并会使用迭代协议来遍历迭代对象中的每一个项,每次迭代中调用该对象的__next__方法(通过next内置函数调用),而且会捕捉StopIteration异常,一旦捕捉到StopIteration异常,将会停止循环
2.for循环和列表解析有什么关系
两者都是迭代工具,列表解析是一种简单高效的方法,它对可迭代对象中所有元素应用一个表达式,并收集结果.也可以用for循环实现列表解析的目的,只不过执行速度可能会慢点,代码行数肯定会增加
3.利用迭代器输入列表,倒序输出列表元素
def fun(args): arg =reversed(args) s = arg.__iter__() for i in range(len(args)): print(s.__next__()) a =[1,2,3,4,5,6] fun(a)
posted on 2019-01-11 18:40 🐳️南栀倾寒🐳️ 阅读(137) 评论(0) 编辑 收藏 举报