异常处理与推导式

异常处理

【一】什么是异常

异常就是程序在运行当中遇到的报错

为了程序的健壮性 要捕获异常后进行处理

断掉程序 / 重启程序 / 进入指定处理流程

【二】捕获异常

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}
posted @   随机昵称yi  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示