可迭代的:内部含有__iter__方法的数据类型叫可迭代的,也叫迭代对象实现了迭代协议的对象
运用dir()方法来测试一个数据类型是不是可迭代的的。
迭代器协议是指:对象需要提供next方法,它要么返回迭代中的下一项,如果要么就引起一个StopIteration异常(当对象没有下一项时),以终止迭代。我们知道for循环可以遍历列表,元组,字符串等等,还可以遍历文档,这是为什么么呢?迭代器协议是指:对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代,这是因为在python中实现了迭代协议,for循环不知道它遍历的是一个文件,它只管用迭代协议去访问对象。
迭代器:包含__next__,__iter__方法的数据就是迭代器。
迭代器的特点:
1.节省内存
2.惰性运算(什么时候用到,什么时候运行)
3.从前到后一次取值,过程不可逆,不可重复。
如果把迭代对象转变为迭代器?
迭代器的方法:
1.__next__方法:返回迭代器的下一个 元素。
2.__iter__方法:返回迭代器对象本身。
- l=["ha","hei","he"]
- ret=l.__iter__() #这个步骤生成迭代器,ret就称为了一个迭代器。
- print(ret.__next__())
- print(ret.__next__())
迭代器比可迭代对象多一个__next__方法
包含__next__方法的可迭代对象就是迭代器
判断一个变量是不是迭代器或者可迭代对象?
- from collections import Iterator
- from collections import Iterable
- print(isinstance([1,2,3,4],Iterable))
- str_iter="abc".__iter__()
- print(isinstance(str_iter,Iterator))
结果:
- True
- True
模拟for循环,解释for循环的内部原理。
不加try ....except 的情况下:
范例一:
- l=[1,2,3,4,5]
- ite=l.__iter__()
- while True:
- print(ite.__next__())
- 结果:
- 1
- 2
- 3
- 4
- 5
- StopIteration 出现这种原因是while 循环不可以自动停止,然而迭代器从前到后一次取值,
- 过程不可逆,不可重复,所以就出现了这种情况。
如何避免这种错误?
范例二:
- l=[1,2,3,4,5]
- ite=l.__iter__()
- while True:
- try:
- print(ite.__next__())
- except StopIteration:
- break
结果:
- 1
- 2
- 3
- 4
- 5
总结:for循环是让我们更简单的使用迭代器,用迭代器取值不需要关心索引或者key.
生成器:
带有yield 的函数叫做被称之为生成器(generator)。生成器是迭代器,它包含一切迭代器的方法。
创建生成器的两种方法:
1.生成器函数。常规函数定义,但是使用yield语句而不是return语句返回结果,return语句返回的是整个结果,而yield一次只返回一个结构,在每个结果中间它会记住函数状态,以便下次从他离开的地方开始。
2.生成器表达式:
生成器函数函数和普通函数之间的区别?
1.生成器函数中有yield关键字。
2.生成器函数执行后不会立即执行,而是返回一个生成器。
- ef func():
- print("你好")
- yield 1
- print("中国")
- yield 2
- func()
- print(func())
结果:
- <generator object func at 0x000002DD23F698E0> #直接执行生成器函数后形成了一个生成器
如何让它打印执行?
- ef func():
- print("你好")
- yield 1
- print("中国")
- yield 2
- func()
- g=func()
- print(g.__next__()) #生成器就是迭代器。
- print(g.__next__())
结果:
- 你好
- 1
- 中国
- 2
来源: http://www.cnblogs.com/sticker0726/p/7778598.html