迭代器

我们之前一直用可迭代的对象像list/dict/tuplew/set到底什么是可迭代对象,什么是迭代器!

可迭代协议-------只要含有"__iter__"方法的数据类型都是可迭代的

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

__length_hint__ 表示迭代器中有多少元素

__setstate__ 控制迭代器从第几个迭代

__next__ 从迭代器中取下一个值

可迭代的怎么变成迭代器:

   可迭代变量.__iter__

l=[1,2,3,4]
l_iter=l.__iter__()  #获取迭代器
print(l_iter.__next__())   获取一个值 1
print(l_iter.__next__())  获取值2
print(l_iter.__next__())  获取值3
print(l_iter.__next__())  获取值4
print(l_iter.__next__())   StopIteration   没有值可以取 一旦出现StopIteration不会报错,直接执行break

 ##在迭代器中值取一次就没有了 

迭代器的特点:节省内存,惰性运算,一次性取值

  具有next和iter方法

  通过一个next多次执行就可以获得所有这个容器中的值

  迭代器的值只能取一次

  不取值的时候,值不会出现

检查变量是不是不可迭代的

第一种:

  print("__iter__" in dir[])

dir([]) 内置函数  查看一个数据类型内部有哪些方法

两边带有下划线的方法叫"魔术方法","双下方法","内置方法"

整数内部是不含有"__iter__"的方法

第二种:

  from collections improt Iterable

  print(isinstance({},Iterable))

内置函数,判断一个具体的值是不是可迭代的,如果可以返回Turn,如果不可迭代返回False

 

for循环值:内部的机制就是迭代器取值的机制

  在for循环执行的过程中:先把可迭代的变成一个迭代器,然后在从中一个一个的取值

  range生成的就是一个迭代器,创建这个迭代器并不会真的把迭代器中的所有数据一次性生成

什么时候生成呢?

  只有通过next取值的时候才会生成

  迭代器的作用就是节省内存,for循环就是利用迭代器节省内存的特点来对python当中的变量来进行操作的

for循环的本质:

  1.生成迭代器

  2.循环每一次对这个迭代器执行next

  3.并且到迭代器最后停止

for循环和可迭代的关系:

  迭代器都是可迭代的

  迭代器是特殊的存在

for循环和迭代器的关系:

  无论是可迭代的还是迭代器都可以被for循环

  如果直接循环迭代器,那么就循环一次

  如果循环非迭代器,那么每次循环都是从头开始

用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('报错啦')

  

posted @ 2018-11-06 19:55  Stone李  阅读(371)  评论(0)    收藏  举报
var a_idx = 0; jQuery(document).ready(function($) { $("body").click(function(e) { var a = new Array("","","","","","","♪","",""); var $i = $("").text(a[a_idx]); a_idx = (a_idx + 1) % a.length; var x = e.pageX, y = e.pageY; $i.css({ "z-index": 999999999999999999999999999999999999999999999999999999999999999999999, "top": y - 20, "left": x, "position": "absolute", "font-weight": "bold", "color": "rgb("+~~(255*Math.random())+","+~~(255*Math.random())+","+~~(255*Math.random())+")" }); $("body").append($i); $i.animate({ "top": y - 180, "opacity": 0 }, 1500, function() { $i.remove(); }); }); });