可迭代的,迭代器

阅读目录:

可迭代的(iterable)

  • 可迭代的数据类型
    • 列表
    • 字符串
    • 文件读取出来的句柄f
    • range 是一个可迭代的

 

  • 可迭代协议:只要含有“__iter__”的数据类型都是可迭代的

 

  • 检测某个变量/值 是不是可迭代的?
    • 第一种:
      print
      ("__iter__" in dir([])

      第二种:
      from collections import Iterable

        print(isinstance([],Iterable)

 

 

  •  可迭代的都可以使用for循环

迭代器(iterator)

  • 怎样通过可迭代变成迭代器

 

可迭代变量.__iter__()返回一个迭代器

 

  • 迭代器独有方法
    • __length_hint__()  迭代器中有多少元素
    • __setstate__(1) 可接受参数,控制迭代器从几开始迭代
    • __next__() 从迭代器中取下一个值

 

  • 迭代器协议
    • 含有__next__和__iter__方法的变量/值都是迭代器

 

  • 迭代器特点
    • 具有next 和iter 方法
    • 通过一个next 多次执行就可以获得所有这个容器中的值
    • 迭代器的值只能取一次
    • 不取的时候值不出现

 

  • for 循环
    • for循环取值  
      • for循环内部的机制就是迭代器取值的机制
      • for循环执行过程中:先把可迭代的变成一个迭代器,然后在一个一个的取值
    • for循环的机制就是 ,for循环取值完毕后再取值不会报错
    • 总结:
      • 生成迭代器
      • 循环每一次对这个迭代器执行next
      • 并且到迭代器的最后就停止

 

  • 判断一个变量/值是否是迭代器的方法
1、判断__next__与__iter__在不在dir(可迭代的)

2、from collections import  Iterator
     print(isinstance(f,Iterator)

 

  • 利用while循环实现一个for循环功能
第一种:异常处理
l = [1,2,3,5,6,7,12,23,412] l_iter = l.__iter__() while True: try: # 要保护的代码 print(l_iter.__next__()) except StopIteration: # 要保护的代码中一旦出现了StopIteration错误,程序不报错,直接执行break print('报错啦') break 第二种:计数器,小于可迭代对象的长度 count = 0 l_iter = l.__iter__() while count < len(l): print(l_iter.__next__()) count += 1

  • 迭代器的作用?
    • 节省内存
    • 惰性运算
    • 一次性取值
    • 只能按顺序取

迭代器和可迭代的关系

  • 所有的迭代器都是可迭代的,反之不成立
  • 迭代器是特殊的存在

for循环和迭代器的关系

  • 无论是可迭代的还是迭代器都可以被for循环
  • 如果直接循环迭代器,那么循环一次就没有了
  • 如果循环的非迭代器,那么每一次循环都相当于从头开始循环,因为在for循环中的所有的非迭代器都会通过iter生成一个新的迭代器
posted @ 2019-02-02 01:24  小萍瓶盖儿  阅读(167)  评论(0编辑  收藏  举报