迭代
即更新换代,每次的更新都必须依赖于上一次的结果
迭代其实给我们提供了一种不依赖索引取值的方式
内置有__iter__方法的都称之为可迭代对象
内置的意思是可以通过点的方式直接查看到
针对双下滑线开头 双下滑线结尾的方法 最为专业标准的读法为:双下方法名
i = 1 # 没有 f = 11.11 # 没有 s = 'jason' # 有 l = [1,2,3,4] # 有 d = {'username':'tony','pwd':123} # 有 t = (11,22,33) # 有 se = {11,22,33} # 有 b = True # 没有 file = open(r'a.txt','w',encoding='utf8') #有
含有__iter__的有:字符串,列表,字典,元组,集合,文件对象
上述通常称为可迭代对象
可迭代对象调用__iter__方法会变成迭代器对象
__iter__方法在调用的时候还有一个简便的写法iter()
一般情况下所有的双下方法都会有一个与之对应的简化版本 方法名()
print(d) print(d.__iter__()) # 等价于调用了一个内置方法 d.get() print(iter(d)) print(d.__len__()) print(len(d))
迭代器对象:既含有__iter__方法 又含有__next__方法
如何生成迭代器对象:让可迭代对象执行__iter__方法
文件对象本身既是可迭代对象又是迭代器对象
迭代器对象无论执行多少次__iter__方法 还是迭代器对象(本身)
迭代器给我们提供了不依赖于索引取值的方式
l = [1,2,3,4] res = l.__iter__() # 转成迭代器对象 print(res.__next__()) # 迭代器对象执行__next__方法其实就是在迭代取值(for循环)
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__()) # 取完元素之后再取会"报错"
for循环内部原理
1.将关键字in后面的数据先调用__iter__方法转为迭代器对象
2.循环执行__next__方法
3.取完之后__next__会报错 但for循环会自动捕获该错误并处理
res = 数据.__iter__() while True: 检测代码是否会报错 res.__next__() 如果报错了则自动处理掉并结束while循环
# 1.先将列表转为迭代器对象 res = l1.__iter__() # 2.循环执行__next__取值 while True: print(res.__next__()) #等价于下面的代码 for i in l1: print(i)
代码运行出错会导致异常,异常发生后如果没有解决方案则会导致整个程序结束
1.traceback
翻到最下面从下往上第一个蓝色字体鼠标左键点击即可跳转到错误的代码所在的行
2.XXXError
错误的类型
3.错误类型冒号后的内容
错误的详细原因(重要)
1.语法错误
不被允许的 出现了应该立刻修改!!!
2.逻辑错误
可以被允许的 出现了之后尽快修改即可
'''修改逻辑错误的过程其实就是在从头到尾理清思路的过程'''
print(idna) # NameError l = [11,22,33] print(l[100]) # IndexError d = {'username':'jason'} print(d['xxx']) # KeyError int('abc') # ValueError
try:
有可能会出错的代码
except 错误类型 as e:
出错之后对应的处理机制(e是错误的详细信息)
try: int('abc') except NameError as e: print('变量名name不存在',e) except ValueError: print('值不是纯数字') except StopIteration: #捕捉异常终止循环 break # 万能异常 try: # int('abc') print(name) # l = [11] # l[100] except Exception: print('万能异常')
异常捕获句式和万能异常
1.有可能会出现错误的代码才需要被监测
2.被监测的代码一定要越少越好
3.异常捕获使用频率越低越好