python迭代器 for循环本质 异常捕获

目录

可迭代对象

# 迭代
	迭代即更新换代 每次的更新都必须依赖于上一次的结果
    
#  迭代其实给我们提供了一种不依赖索引取值的方式

可迭代对象:
	内置__iter__方法的都称之为可迭代对象
     	内置的意思是可以通过点(.)的方式直接查看到的
'''
针对双下划线开头  双下划线结尾的方法, 最为专业的标准的读法为
		双下方法名
		
		
面向对象的时候为了与隐藏变量区分后
'''

# n = 1
# while True:
#     n+=1
#     print(n)

# l = [11,22,33,44,55,66]
# n = 0
# while n < len(l):
#     print(l[n])
#     n += 1
'''
含有__iter__的有
	字符串 列表 集合 字典 元组 文件对象
	
他们通常为可迭代对象

'''


'''
可迭代对象调用__iter__方法会变成迭代器对象

__iter__方法在调用的时候还有一个简便的写法iter()

一般情况下所有的双下方法都会有一个与之对应的简化版本 方法名+()

'''


迭代器对象

# 迭代器对象 
	既有__iter__方法 又含有__next__方法
# 如何生成迭代器对象
	让可迭代对象执行__iter__方法
'''
文件对象本身即是可迭代对象又是迭代器对象
迭代器对象无论执行多少次__iter__方法 还是迭代器对象(本身)

迭代器给我们提供了不依赖于索引取值的方式

'''    
缺点:取值不够灵活 一次性的只能往后取,无法预知数据的个数


s = 'jason'
res = s.__iter__()  # 转成迭代器对象
print(res.__next__())  # 迭代器对象执行__next__方法其实就是在迭代取值(for循环)
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())


d = {'username':'jason','pwd':123}  
res = d.__iter__()  # 转成迭代器对象
print(res.__next__())  # 迭代器对象执行__next__方法其实就是在迭代取值(for循环)
print(res.__next__())
#  正常执行 输出 username  pwd  

d = {'username':'jason','pwd':123}  
res = d.__iter__()  # 转成迭代器对象
print(res.__next__())  # 迭代器对象执行__next__方法其实就是在迭代取值(for循环)
print(res.__next__())
print(res.__next__())  #  如果多一次执行就会打印完在报错

# 易错
d = {'username':'jason','pwd':123}
print(d.__iter__().__next__())  # username
print(d.__iter__().__next__())  # username
print(d.__iter__().__next__())  # username
print(d.__iter__().__next__())  # username
print(d.__iter__().__next__())  # username
print(d.__iter__().__next__())  # username

for循环本质

l1 = [1,2,3,4,5,6,7,8,9,11,22,33,44,55]
#  循环打印出列表中每个元素 
1. 先将列表转为迭代器对象
res = l1.__iter__()
2. 循环执行__next__()取值
while True:
    print(res.__next__)
    
for i in l1:
    print(i)
    
'''
for循环内部原理:
	1.将关键字in后面的数据先调用__iter__方法转为迭代器对象
	2.循环执行__next__方法
	3.取完之后__next__会报错 但是for循环会自动捕获该错误并处理

res = 数据.__iter__()
while True:
	检测代码是否会报错
	res.__next__()
	如果报错了则自动处理掉并结束while循环

'''

异常捕获

# 什么是异常
	代码运行出错会导致异常 异常发生后如果没有解决方案则会到底整个程序结束
# 异常三个重要组成部分
	1.traceback
    	翻到最下面从下往上的第一个蓝色字体鼠标左键点击即可可跳转到错误的代码所在的行
    2.XXXError
    	错误的类型
    3.错误类型冒号后面的内容
    	错误的详细原因(这个地方是主要的错误  仔细看完后可能就会找到解决的方法)
        
# 错误的种类
	1.语法错误
    	这个是非常不被允许的 出现应立刻修改!!!
    2.逻辑错误
    	可以被允许的 出现了之后尽快修改即可
# 其实修改逻辑错误的过程就是从头到尾理清思路的过程

eg:
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是错误的详细信息)
    except 错误类型 as e:
    	出错之后对应的处理机制(e是错误的详细信息)
    except 错误类型 as e:
    	出错之后对应的处理机制(e是错误的详细信息)
'''

# try:
#     int('abc')
# except NameError as e:
#     print('变量名name不存在',e)
# except ValueError:
#     print('值不是纯数字')


# 万能异常
try:
    # int('abc')
    print(name)
    # l = [11]
    # l[100]
except Exception:
    print('什么错误都无所谓!!')

"""
异常捕获句式和万能异常
    1.有可能会出现错误的代码才需要被监测
    2.被监测的代码一定要越少越好
    3.异常捕获使用频率越低越好
"""
上一篇:最好的语言!(16)


下一篇:Python 迭代器