迭代:
迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值
为什么要有迭代器:
数据类型的取值,字符串,列表,元组依靠索引可以取值,但是字典,集合,文件这些数据类型无法通过索引取值,
那么迭代器提供了一种不依靠索引取值的方法,这个方法就是迭代器
可迭代对象
内置有__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循环,我们可以实现不依赖索引取值
dic={'a':1,'b':2,'c':3}
for k in dic:
print(dic[k]
for循环的工作原理
1,执行in后对象的_ _iter_ _()方法,得到一个迭代器对象
2,执行_ _next_ _ 方法,将得到的值赋值变量,然后执行循环体代码
3,重复过程2,直到捕捉到异常StopIteration
迭代器的优缺点
优点:提供了一种不依赖索引的迭代方式
缺点:无法获长度
只能一直往后取,无法往前取
生成器
函数内包含有yield关键字
再调用函数,就不会执行函数体代码,拿到的返回值就是一个生成器对象
注意:生成器本质就是迭代器,也就是说迭代器的用法也就是生成器的用法