python基础day17 迭代器和for循环原理
可迭代对象
什么是迭代?
迭代言外之意就是更新换代,每次的更新都是要依赖于上一次的结果
什么是可迭代对象?
就是内置有__iter__()方法的都可以称之为是可迭代对象。
八种基本数据类型:
可迭代对象:
字符串
列表
元组
字典
集合等
文件对象也是可迭代对象:ff = open('a.txt', 'w', encoding='utf8')
整型、浮点型、布尔值都不是可迭代对象
可迭代对象调用__iter__()方法就变成了''迭代器对象'' print(d.__iter__()) print(iter(d)) # 两个是一样的 ''' 一般情况下,双下划线开头的方法都有一个与之对应的简化方法。名字() '''
迭代器对象
迭代器对象:迭代器
什么是迭代器对象?
即内置了__iter__()方法,又内置了__next__()方法的就是迭代器对象
ps:文件对象本身就具备__iter__()和__next__()方法,即是可迭代对象,也是迭代器对象
那些数据类型是迭代器对象?
str、list、dict、tuple、set、文件等
迭代器作用:
是一种不依赖于索引取值的取值方法
可迭代对象多次调用__iter__()方法之后还是迭代器对象,所以你只需要调用一次即可 l = [1, 2, 3, 4] # print(l[0]) # print(l[1]) # print(l[2]) res1 = l.__iter__() # print(res1.__next__()) # print(res1.__next__()) # print(res1.__next__()) print(next(res1)) print(next(res1)) print(next(res1)) d = {'username': 'ly', 'age': 18} # res = d.__iter__() # print(res.__next__()) # print(res.__next__()) # print(d.__iter__()) # print(d.__iter__().__iter__().__iter__().__iter__()) """易错题""" ll = [1, 2, 3, 4] # res = ll.__iter__() # print(res.__next__()) # print(res.__next__()) # print(res.__next__()) # print(res.__next__()) # print(res.__next__()) # StopIteration 当数据被取值完的时候,如果在次next会直接报错 print(ll.__iter__().__next__()) # 1 print(ll.__iter__().__next__()) # 1 print(ll.__iter__().__next__()) # 1 print(ll.__iter__().__next__()) # 1 res = ll.__iter__() print(res.__next__()) print(res.__next__()) print(res.__next__()) print(res.__next__())
异常捕捉
1. 什么是异常?
一场就是错误发生的信号,如果不对此信号做正确处理,那么之后的程序都不能正常运行。
2. 异常的分类
1.Traceback
是异常所在的位置,一般情况我们直接可以定位到异常发生的位置所在处
2. xxxError
错误的类型
3. xxxError后面的详细信息
重要,一般情况我们直接看错误发生的详细信息都可以定位原因
4. 一场都有哪些类型
1.语法错误
坚决不允许的,容易解决,借助pycharm工具就可以很容易的定位到
2. 逻辑错误
是允许出现的,但是,我们在写代码的时候,尽量的避免逻辑错误的发生
3.错误的类型
# print(name) # NameError # l = [1,2,3,4] # print(l[5]) # IndexError # d = {'a':1} # print(d['b']) # KeyError # 1/0 # ZeroDivisionError
4. 如何解决这种异常
""" 语法结构: try 被监测的代码:一般是可能会发生的错误 except 错误类型1 as e print(e) except 错误类型2 as e print(e) except 错误类型3 as e print(e) except 错误类型4 as e print(e) """ try: # print(name) # 1/0 # l = [1,2,3] # print(l[6]) # 1/0 d = {'a':1} print(d['aaa']) except NameError as e: print(e) # name 'name' is not defined except IndexError as e: print(e) # name 'name' is not defined except Exception as e: print(e) else: print('看一下else什么时候走的?') finally: print('看一下finally什么时候走?') """ 没有异常的时候else会走,有异常的时候else不会走 finally是不管有没有异常都会走 """ try: pass except NameError: pass try: pass finally: pass # 这里面你只需要记住try和else不能单独使用, try: pass except : pass else: pass # 断言:我断定你一定是正确的、成功的、可行的等 s = 1+2 # 在这一行我居断定s必须是2,如果不是2直接拦截, assert s == 2 # assert 条件 条件必须成立,如果不成立,代码在这一行直接中断 print(123)
for循环的原理
''' for循环的原理: 1. 先把关键字in后面的可迭代对象先调用__iter__() 2. while循环,next()取值 3. for的内部当出现异常的时候,做了捕捉处理: StopIteration的错误,break ''' l = [1,2,3,4,5,6,7,8] # 循环打印出列表中的每一个元素,但是不能使用for循环,必须要使用__next__()取值 l = [1,2,3,4,5,6,7,8,9,10,11,12,13,14] # 循环打印出列表中的每一个元素,但是不能使用for循环,必须要使用__next__()取值 res = l.__iter__() while True: try: print(res.__next__()) except Exception: break for i in l: print(i)
迭代取值和索引取值的对比
迭代取值:
1. 不依赖于索引取值
2. 只能从左往右一次取值,不能重复取值
索引取值:
1. 必须依赖于索引取值
2. 可以重复取值 l[0]
3. 必须是容器类型,字符串也可以

浙公网安备 33010602011771号