欢迎来到无荨的博客

想一千次,不如去做一次。如果自己不努力,那么这一辈子只可能在原地踏步!

python中的迭代器

1、为何要有迭代器?
  对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。
  但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器

2、什么是可迭代对象?
可迭代对象

  • 以直接作用于 for 循环的数据类型有以下几种:
  • 一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
  • 一类是 generator ,包括生成器和带 yield 的generator function。
  • 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。

判断是否可以迭代?

可以使用 isinstance() 判断一个对象是否是 Iterable 对象:

In [1]: from collections import Iterable
In [2]: isinstance({}, Iterable)
Out[2]: True
In [3]: isinstance(100, Iterable)
Out[3]: False  

可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下:

  • 'world'.__iter__
  • (4,5,6).__iter__
  • [1,2,3].__iter__
  • {'a':1}.__iter__
  • {'a','b'}.__iter__
  • open('a.txt').__iter__

3、什么是迭代器对象?

  1. 可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
  2. 而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象
  3. 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

可以使用 isinstance() 判断一个对象是否是 Iterator 对象:(用法与isinstance一样)

实例:

a='abcdefg'
a1={'a','b','c','d','e'}
a2={'a':1,'b':12,'c':'cd'}

res=iter(a1) #集合无序
print(next(res))
print(next(res))
print(next(res))
>>> e
>>> d
>>> c
res2=iter(a2) #字典出来的是key
print(next(res2))
print(next(res2))
>>> a
>>> b
res=iter(a1)
n=0
whilen<len(a2):
print(next(res))
n += 1
>>> d
>>> e
>>> c 

4、文件类型是迭代器对象
  open('a.txt').__iter__()
  open('a.txt').__next__()

5、总结

  1、凡是可作用于 for 循环的对象都是 Iterable 类型;

  2、凡是可作用于 next() 函数的对象都是 Iterator 类型;

  3、集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数转化成 Iterator 对象;

  4、生成器不但可以作用于 for 循环,还可以被 next() 函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续返回下一个值了。

posted @ 2019-10-22 07:36  无荨  阅读(334)  评论(0编辑  收藏  举报