python之路--day11---迭代器和生成器

迭代:

  迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值

为什么要有迭代器:

  数据类型的取值,字符串,列表,元组依靠索引可以取值,但是字典,集合,文件这些数据类型无法通过索引取值,

  那么迭代器提供了一种不依靠索引取值的方法,这个方法就是迭代器

可迭代对象

  内置有__iter__方法,执行该方法会拿到迭代器

    字符串,列表,元组,字典,集合,文件都是可迭代对象

迭代器对象

  内置有__next__方法,执行该方法会拿到迭代器对象中的一个值
  内置有__iter__方法,执行该方法会拿到迭代器本身

  文件是迭代器对象

注意:迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象

迭代器的使用

dic={'a':1,'b':2,'c':3}

iter_dic=dic.__iter__()   #可迭代对象执行_ _iter_ _方法得到的结果就是迭代器对象

           #迭代器对象内置有_ _iter_ _方法和_ _next_ _方法

iter_dic.__iter__() is iter_dic  #True   迭代器.__iter__()得到的仍然是迭代器本身

print(iter_dic.__next__())

print(iter_dic.__next__())

print(iter_dic.__next__()) #等同于next(iter_dic)

#迭代对象有几个值就需要执行几次,直到没有值可取

print(iter_dic.__next__()) #抛出异常StopIteration,标志迭代对象的值已经全部取出

#有了迭代器,我们就可以不依赖索引迭代取值了

iter_dic=dic.__iter__()

while 1:

  try:

    k=next(iter_dic)

    print(dic[k])

  except StopIteration:

    break

====================================================================

异常处理

捕捉异常可以使用try/except语句。

try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。

如果你不想在异常发生时结束你的程序,只需在try里捕获它。

语法:

try:
<语句>        #运行别的代码
except <名字><语句>        #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生

 ================================================================================

for 循环

基于for循环,我们可以实现不依赖索引取值

1 dic={'a':1,'b':2,'c':3}
2 for k in dic:
3     print(dic[k]

for循环的工作原理

1,执行in后对象的_ _iter_ _()方法,得到一个迭代器对象

2,执行_ _next_ _ 方法,将得到的值赋值变量,然后执行循环体代码

3,重复过程2,直到捕捉到异常StopIteration

迭代器的优缺点

优点:提供了一种不依赖索引的迭代方式

缺点:无法获长度

    只能一直往后取,无法往前取

生成器

  函数内包含有yield关键字

  再调用函数,就不会执行函数体代码,拿到的返回值就是一个生成器对象

注意:生成器本质就是迭代器,也就是说迭代器的用法也就是生成器的用法

原文地址:https://www.cnblogs.com/guodengjian/p/8678337.html