迭代器相关、for循环原理和异常处理
目录
迭代器相关
可迭代对象
一、什么是迭代?
迭代其实就是更新换代,每一次迭代的过程都是依据上一次的结果
eg:软件的更新其实就是版本的迭代
# 单纯的循环
import time
while True:
time.sleep(1)
print('qaq')
# 迭代
count = 0
while count < 8:
print(count)
count += 1
# 迭代取值
t1 = (12, 55, 88, 66, 74, 25, 31, 49)
count = 0
while count < len(t1):
print(t1[count])
count += 1
二、什么是可迭代对象?
内置有__iter__方法的都可以称之为可迭代对象
三、哪些数据是可迭代对象?
num = 8 # 没有
f = 8.8 # 没有
str1 = 'python' # 有
l1 = [111, 222, 333, 444] # 有
dic1 = {'name': 'johnson', 'age': 24} # 有
s = {1, 2, 3, 4, 5, 6} # 有
t = (1, 2, 3, 4, 5, 6) # 有
b = False # 没有
str1.__iter__()
l1.__iter__()
dic1.__iter__()
s.__iter__()
t.__iter__()
迭代器对象
一、什么是迭代器对象?
可迭代对象调用__iter__方法之后生成的结果就是迭代器对象
二、迭代器对象的特征
同时含有__iter__方法和__next__方法
三、迭代器对象的作用
迭代器对象能够极大的节省存储空间
四、迭代器对象如何取值
调用__next__方法,如果取不到值则会直接报错
五、迭代器对象补充说明
- 一些双下方法具有简便写法
"""
__方法名__ 等价 方法名()
迭代器最常用的
__iter__ iter()
__next__ next()
"""
s = 'johnson'
print(s.__iter__()) # <str_iterator object at 0x000002B1D1AFA390>
print(iter(s)) # <str_iterator object at 0x000002B1D1AFA390>
print(s.__iter__().__next__()) # j
print(s.__len__()) # 7
print(len(s)) # 7
- 可迭代对象调用一次__iter__方法变为迭代器对象,继续调用多次的结果还是迭代器对象本身
s = 'johnson'
res1 = s.__iter__()
res2 = s.__iter__().__iter__().__iter__()
print(res1, res2) # <str_iterator object at 0x0000019C2BC2A390> <str_iterator object at 0x0000019C2BC2A320>
- 迭代取值的要求
s = 'johnson'
print(s.__iter__().__next__()) # j 每次先产生一个新的迭代器对象然后取值
print(s.__iter__().__next__()) # j 每次先产生一个新的迭代器对象然后取值
res = s.__iter__() # 已经变为迭代器对象
print(res.__iter__().__next__()) # j 之后再调用多次仍是最初的的迭代器对象
print(res.__iter__().__next__()) # o 之后再调用多次仍是最初的的迭代器对象
print(res.__iter__().__next__()) # h 之后再调用多次仍是最初的的迭代器对象
print(res.__iter__().__next__()) # n 之后再调用多次仍是最初的的迭代器对象
print(res.__iter__().__next__()) # s 之后再调用多次仍是最初的的迭代器对象
print(res.__iter__().__next__()) # o 之后再调用多次仍是最初的的迭代器对象
print(res.__iter__().__next__()) # n 之后再调用多次仍是最初的的迭代器对象
for循环内部原理和本质
for循环内部原理
t1 = (111, 222, 333, 444, 555, 666, 777,)
'''需求:不依赖于for循环,完成对列表元素的取值'''
res = t1.__iter__()
count = 0
while count < len(t1):
print(res.__next__())
count += 1
"""
for循环底层原理
for 变量名 in 可迭代对象:
循环体代码
1.会将in后面的数据集调用__iter__()变成迭代器对象
2.针对产生的迭代器对象依次调用__next__()方法迭代取值
3.当值取完之后,自动处理报错并退出循环
"""
for循环本质
# 利用while与异常处理,实现for循环的功能
data_info = {'name': 'boris', 'age': 55, 'nationality': 'UK'}
# 1.先转换为迭代器对象
res = data_info.__iter__()
# 2.迭代取值
while True:
try:
print(res.__next__())
except StopIteration as e:
break
异常处理
一、什么是异常?
代码运行出错就是异常,异常会导致程序立刻停止。外号是bug,在编程过程中需要极力避免出现
二、异常信息的组成部分
# input(>>>:)
# File "D:/PyCharm 2021/week4/day16/04.异常处理.py", line 5
# input(>>>:)
# ^
# SyntaxError: invalid syntax
# 1.line关键字所在的一行
# 提示你代码异常的位置,点击前面的蓝色字体可以定位到该位置
# 2.SyntaxError错误的类型
# 代码的报错分为很多类型,SyntaxError只是常见的一种
# 3.invalid syntax
# 具体的报错原因,也是我们解决报错的依据
三、异常的分类
# 1.语法异常
# 尽量不要出现,如果出现了必须立刻改正
# eg:简单的if分支和while循环语法报错
# 2.逻辑异常
# 可以偶尔出现,如果出现了尽快修改即可
# eg:代码动态获取到了一个列表类型的变量名调用了字典的内置方法(属性)
l1 = [1, 2, 3, 4, 5, 6, 7]
l1.keys() # AttributeError: 'list' object has no attribute 'keys'
四、异常的类型
username # NameError 名字错误
l1 = [11, 22, 33, 44, 55, 66]
print(l1[10]) # IndexError 索引错误
d = {'name': 'jason', 'age': 25, 'height': '188m'}
print(d['weight']) # KeyError 键错误
list(True) # TypeError 类型错误
float('qaq') # ValueError 值错误
五、异常处理实际操作
python提供了异常处理功能来处理python程序在运行中出现的异常和错误,你可以使用该功能来调试python程序。
- 基本语法结构
try:
可能会出错的代码
except 错误的类型1 as e: # e指代的就是错误的提示信息
针对性的处理措施
except 错误的类型2 as e: # e指代的就是错误的提示信息
针对性的处理措施
except 错误的类型3 as e: # e指代的就是错误的提示信息
针对性的处理措施
- 针对未知错误类型
try:
name
except Exception as e: # Exception,万能异常;常见的报错都可以照单全收
print('处理措施')
六、异常处理补充
- 结合else使用
# 当try检测的代码没有发生异常,正常运行之后执行else的子代码
try:
name # 可能会出错的代码
except Exception as e:
print('处理措施')
else:
print('执行else子代码') # 可能会出错的代码没有出错就执行else子代码
- 结合finally使用
# 无论try检测的代码有无异常最后都会执行finally子代码
try:
name
except Exception as e:
print(e)
finally:
print('执行finally子代码')
- 全部整合到一起使用
try:
username
except Exception as e:
print(e) # name 'username' is not defined
else:
print('没报错时执行')
finally:
print('不管报错不报错都执行') # 不管报错不报错都执行
- 断言
pwd = '88888888'
assert isinstance(pwd, int)**
- 主动报错
raise KeyError('^^^^^^^0^^^^^^^^') # 由于是主动报错,需要指出错误的类型