19-python基础8-可迭代对象、迭代器

1 迭代

  迭代就是重复做一件事,并且执行时依赖于上一次执行的结果

2 什么是迭代器协议

  1. 迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)
  2. 可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)
  3. 协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。

3 迭代器

     通常情况下,如list和tuple这类容器,是以序列存储的,存在索引(下标),可以通过索引来遍历。但有一些不存在索引,如无序的set和dict,文件。那我们就该如何遍历。这就需要迭代器了。
     迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素(且不依赖索引),每个迭代器对象代表容器中的确定的地址。
迭代器描述的是一个重复的概念。

迭代器的作用:

  1. 不通过索引将对象里的内容取出来;
  2. 迭代器就是一个内存地址,next()一次取一个值,同一时刻只有一个值,是惰性计算,更省内存。

缺点:

  1. 无法获取迭代器的长度,使用不如列表灵活。
  2. 迭代器是一次性的,只能向后取值。

4 Python中的循环

  对象实现了迭代器协议,就能用for循环所有对象。
  换句话就是,能被for遍历的都是可迭代对象。
  for循环的本质是:调用可迭代对象的__iter__()方法,将可迭代对象变成迭代器,再每一次循环调用对象的__next__()方法,直到遇到StopIteration,并捕捉该异常。结束for循环。

4.1 先看看不用for,用while遍历迭代是什么怎样的

  只要对象本身有__iter__(),就是可迭代的对象。

dic={"a":1,"b":"2","c":3,"d":4}
i=dic.__iter__() #等同于i=iter(dic)
dic.__iter__()返回值i是一个迭代器。

  只要是迭代器,都有一个__next__()方法,来返回下一个值,直到遇到StopIteration。

i.__next__() #等价于next(i)
dic={"a":1,"b":"2","c":3,"d":4}
i=dic.__iter__()
while True:
    try:
        print(next(i))
    except StopIteration:
        break

result:
a
b
c
d

4.2 python中提供了一个更强大的功能for。

dic={"a":1,"b":"2","c":3,"d":4}
i=dic.__iter__()
for x in i:
    print(x)

result:
a
b
c
d

等同于上面的while循环

dic={"a":1,"b":"2","c":3,"d":4}
for x in dic:
    print(x)

result:
a
b
c
d

      打印的和上面结果一样,也就是说for变量的对象可以是迭代器,也可以是可迭代的对象。for会将要遍历的对象先调用dic=dic.__iter__()转换成迭代器,再遍历出来。
总结:能被for遍历的都是可迭代的对象。

注意:

dic={"a":1,"b":"2","c":3,"d":4}
for x in dic:
    print(x)
for x in dic:
    print(x)

result:
a
b
c
d

第二次for循环并没有打印,所以说迭代器是一次性的,打印完了就没值了。

5 判断一个对象是否是迭代器或可迭代的对象

需要用到collections模块中的Iterable、Iterator。

from collections import Iterable,Iterator
dic={"a":1,"b":"2","c":3,"d":4}
i=dic.__iter__()
print(isinstance("aaa",Iterable))
print(isinstance("aaa",Iterator))
print("------")
print(isinstance(dic,Iterable))
print(isinstance(dic,Iterator))
print("------")
print(isinstance(i,Iterable))
print(isinstance(i,Iterator))


result:
True
False
------
True
False
------
True
True

 

posted @ 2017-06-19 16:53  New_Taul  阅读(152)  评论(0编辑  收藏  举报