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  &#128051;️南栀倾寒&#128051;️  阅读(137)  评论(0编辑  收藏  举报

导航