异常处理与推导式
异常处理
【一】什么是异常
异常就是程序在运行当中遇到的报错
为了程序的健壮性 要捕获异常后进行处理
断掉程序 / 重启程序 / 进入指定处理流程
【二】捕获异常
if 捕获不到异常,要用python自带的捕获语句
try:...
except:...
【三】异常捕获详细
对代码熟悉,能确保代码报错是哪个
【1】指定捕获的异常
ZeroDivisionError
try:
print(int('a'))
# 异常捕获的 try语法 要和 except 搭配
# 值错误
except ValueError:
print(f"当前报错了! {ValueError}")
try:
print(1 / 0)
except ZeroDivisionError:
print(f"除数不能为0")
【2】捕获多个异常
try:
# print(int('a'))
print(1 / 0)
except (ValueError, ZeroDivisionError) as e:
print(e)
【3】多分支捕获异常
try:
# print(int('a'))
print(1 / 0)
except ValueError:
print(ValueError)
except ZeroDivisionError:
print(ZeroDivisionError)
【四】捕获基本异常
捕获基本异常
只要是异常就捕获
try:
# print(int("a"))
print(1/0)
except Exception as e:
print(e)
【五】主动触发异常
达到某个条件时主动触发异常
使用raise关键字主动抛出我们想要的异常信息
for i in range(10):
if i == 6:
# 主动报错,这里不能为 6
# raise 错误类型
raise ValueError('不能为 6')
【六】断言
# assert关键字: 达到某个为真的条件抛出异常信息
# assert 条件,
for i in range(0, 10):
assert i == 6, '不能为6'
【七】异常捕获语法扩充
try:
# 可能会发生报错的代码
int('a')
except Exception as e:
# 一旦上面代码抛出异常就会被捕获
print(e)
else:
# 上面代码没有异常,就走else
print("11")
finally:
# 无论有没有异常都会执行的代码
print("1324")
invalid literal for int() with base 10: 'a'
1324
列表、字典推导式
【一】固定语法
【1】 列表推导式
[表达式 for i in 列表/字典/可迭代类型]
[字符串切分/去除空格 for i in 列表/字典/可迭代类型]
[if判断 for i in 列表/字典/可迭代类型]
【2】字典推导式
{key:value for key in 可迭代类型 for value in 可迭代类型}
【3】三元运算符
为真时的结果 if 返回布尔值的判断条件 else 为假时的结果
【二】列表推导式
【1】直接使用range关键字构建列表
num_list = [i for i in range(10)]
print(num_list)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
相当于
num_list = []
for i in range(10):
num_list.append(i)
print(num_list)
【2】遍历列表
name_list = ['qwer','123']
# 让每个人名前加 11_10
name_list = ['11_' + i for i in name_list]
print(name_list)
【3】对每个元素进行去除空格
with open('11.txt','r',encoding='utf8') as file:
print(file.readlines())
['qwe\n', '111\n', 'sada']
with open('11.txt','r',encoding='utf8') as file:
list = [line.strip() for line in file]
print(list)
['qwe', '111', 'sada']
第一次输出带换行符,第二次输出换行符被去除了
【4】利用一个元素生成新的列表
放列表
list = [[num , num * num] for num in [i for i in range(10)]]
print(list)
[[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81]]
放元组
list = [{i : i*i} for i in [i for i in range(10)]]
print(list)
[{0: 0}, {1: 1}, {2: 4}, {3: 9}, {4: 16}, {5: 25}, {6: 36}, {7: 49}, {8: 64}, {9: 81}]
【5】行列转换
test = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
list_new = [[row[i] for row in test] for i in range(len(test[0]))]
print(list_new)
num_list = []
for i in range(len(test[0])):
num_list_ = []
for row in test:
num_list_.append(row[i])
num_list.append(num_list_)
print(num_list)
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
【6】加入条件进行过滤
est = [1, 2, 3, 4, 5, 6]
list_one = [x for x in test if x % 2 == 0]
print(list_one)
# [2, 4, 6]
num_one = []
for x in test:
if x % 2 == 0:
num_one.append(x)
print(f'num_one {num_one}')
list_two = list(filter(lambda x: x % 2 == 0, test))
print(list_two)
[2, 4, 6]
num_one [2, 4, 6]
[2, 4, 6]
【三】字典推导式
user_data_dict = {}
with open('11.txt','r',encoding='utf8') as fp:
for line in fp:
username,password = line.strip().split('|')
user_data_dict[username] = password
print(user_data_dict)
with open('11.txt', 'r', encoding='utf8') as fp:
user_data_dict = {line.strip().split('|')[0]: line.strip().split('|')[1] for line in fp}
print(user_data_dict)
{'q': 'we', '11': '1', 'sa': 'a'}
{'q': 'we', '11': '1', 'sa': 'a'}
【四】元组生成式
生成的是生成器对象
num_tuple = (i for i in range(10))
print(num_tuple)
<generator object <genexpr> at 0x000002030DC48430>
要强转一下
print(tuple(num_tuple))
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
【五】集合推导式
# 类似 列表推导式
set_num = {i for i in range(10)}
print(set_num)
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?