【迭代器与生成器】

一、什么是迭代?

  迭代通俗的讲就是一个遍历重复的过程。

  维基百科中 迭代(Iteration) 的一个通用概念是:重复某个过程的行为,这个过程中的每次重复称为一次迭代。具体对应到Python编程中就是,对于一个可迭代对象,比如Python中的list、tuple、string、dictionary,set等,使用某种循环结构来遍历其中的元素,这种遍历就是迭代。

 1 #对列表进行遍历!
 2 
 3 l=['a','b','c','d','e']
 4 
 5 #while循环的方式
 6 i=0
 7 while i < len(l):
 8     print(l[i])
 9     i+=1
10 
11 #for 循环的方式
12 for i in range(len(l)):
13     print(l[i])

二、迭代器

1、迭代器定义

  首先先明确 可迭代对象

  在现所学的数据类型中,只有 文件 是迭代器,其他的数据类型:元组,字符串,字典,集合,列表都是 可迭代对象。

 

判断是否可迭代:只要判断对象本身是否内置了_iter_方法,那它就是可迭代的。

1 #可迭代的:只要对象本身有__iter__方法,那它就是可迭代的
2 d={'a':1,'b':2,'c':3}
3 d.__iter__ #iter(d) 

可迭代对象实现了 __iter__ 和 __next__ 方法,这两个方法对应内置函数 iter() 和 next() 。__iter__ 方法返回可迭代对象本身,这使得他既是一个可迭代对象同时也是一个迭代器。

#执行对象下的__iter__方法,就会得到一个返回值,得到的返回值就是迭代器。
# 使用next()就能依次取出迭代器中的值(在迭代器元素个数之内,超出会报错,也是一次性的元素,不可重复取值),这样就不用再依赖下标的方式。
d={'a':1,'b':2,'c':3}
d.__iter__ #iter(d)

i=d.__iter__()  #返回值,迭代器

print(i.__next__())  #print(next(i))
print(i.__next__())
print(i.__next__())  #3个元素,依次取三次,由于迭代器中的元素是一次性的,超出个数会报错!
print(i.__next__())

执行结果如下:

 
a
b
c
Traceback (most recent call last):
  File "H:/迭代器.py", line 29, in <module>
    print(i.__next__())
StopIteration
 

 

  迭代器

 

  迭代器是访问集合中元素的一种方式,从集合中的第一个元素开始访问,直到所有的元素都被访问一遍后结束。迭代器不能回退,只能往前进行迭代。

  迭代器提供了一个统一的访问的接口,只要是定义了iter()方法的对象,就可以使用迭代器进行访问。只要可以进行访问,就能被next()方法调用并不断返回下一个值的对象称为迭代器。换句话说,迭代器对象具有next()方法。

  对于迭代器的理解,可以把迭代器看成是一个数据流,迭代器对象被next()函数调用不断返回下一个数据,直到没有数据时抛出StopIteration错误。

  把这个数据流看做是一个有序序列,但却不能提前知道这个数据流到底有多长,而对于list、tuple等可迭代对象来说,对象的长度是可知的。这也是可迭代对象和迭代器的区别所在。

 

  StopIteration异常:是迭代终止的信号,迭代器内的内容是有限的,迭代器内元素已全部取完,及取值结束再继续取的话,会报错。

  异常捕捉:迭代器正常执行代码的过程中,print(next(*))  *代表迭代器 会抛出异常。为保证代码的正常运行,此时就用到了 try 和 except。

1)while:循环

1 l=['a','b','c','d','e']
2 i=l.__iter__()
3 while True:
4     try:  #监听代码是否会报异常 StopIteration
5         print(next(i))
6     except StopIteration:  #判断异常是否为 StopIteration,是break
7         break

执行结果如下:

 a
 b
 c
 d
 e

2)for 循环 :for 循环本质就是内部封装了迭代器,对 可迭代的对象 进行遍历取值,同时会在遇到异常捕获的时候会自行处理,所以for 循环作用在迭代器上不报错。

 d={'a':1,'b':2,'c':3}
 print(d.__iter__())
 for k in d: #d.__iter__()
     print(k)

执行结果如下:

<dict_keyiterator object at 0x00000000021A7728>
a
b
c
1 #集合及文件 for 循环 迭代形式
2 s={1,2,3,4}
3 for i in s:
4     print(i)
5 #a.txt ="aaaaaa bbb cccc eee ffffff"
6 with open('a.txt','r') as f:
7     for line in f:
8         print(line.strip())
 1 1
 2 2
 3 3
 4 4
 5 aaaaaa
 6 bbb
 7 cccc
 8 eee
 9 ffffff
10 
11 执行结果
执行结果

相关文章: