迭代器相关、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('处理措施')

六、异常处理补充

  1. 结合else使用
# 当try检测的代码没有发生异常,正常运行之后执行else的子代码
try:
    name  # 可能会出错的代码
except Exception as e:
    print('处理措施')
else:
    print('执行else子代码')  # 可能会出错的代码没有出错就执行else子代码
  1. 结合finally使用
# 无论try检测的代码有无异常最后都会执行finally子代码
try:
    name
except Exception as e:
    print(e)
finally:
    print('执行finally子代码')
  1. 全部整合到一起使用
try:
    username
except Exception as e:
    print(e)  # name 'username' is not defined
else:
    print('没报错时执行')
finally:
    print('不管报错不报错都执行')  # 不管报错不报错都执行
  1. 断言
pwd = '88888888'
assert isinstance(pwd, int)**
  1. 主动报错
raise KeyError('^^^^^^^0^^^^^^^^')  # 由于是主动报错,需要指出错误的类型
图片名称
posted @ 2022-03-23 18:39  一梦便是数千载  阅读(137)  评论(0编辑  收藏  举报