Python中级之异常处理+推导式

【一】异常处理

【一】什么是异常

  • 异常是程序运行时可能发生的错误或意外情况
  • 当出现异常时,程序的正常流程会被中断,出现报错界面

【二】异常分类

  • 在Python中异常分为内建异常和用户自定义异常

【1】BaseException(所有异常的基类)

  • SystemExit:解释器请求退出
  • KeyboardInterrupt:用户中断执行(通常是输入^C)
  • Exception:常规错误的基类
  • StopIteration:迭代器没有更多的值
  • GeneratorExit:生成器(generator)发生异常来通知退出
  • StandardError:所有的内建标准异常的基类
  • ArithmeticError:所有数值计算错误的基类
  • FloatingPointError:浮点计算错误
  • OverflowError:数值运算超出最大限制
  • ZeroDivisionError:除(或取模)零 (所有数据类型)
  • AssertionError:断言语句失败
  • AttributeError:对象没有这个属性
  • EOFError:没有内建输入,到达EOF 标记
  • EnvironmentError:操作系统错误的基类
  • IOError:输入/输出操作失败
  • OSError:操作系统错误
  • WindowsError:系统调用失败
  • ImportError:导入模块/对象失败
  • LookupError:无效数据查询的基类
  • IndexError:序列中没有此索引(index)
  • KeyError:映射中没有这个键
  • MemoryError:内存溢出错误(对于Python 解释器不是致命的)
  • NameError:未声明/初始化对象 (没有属性)
  • UnboundLocalError:访问未初始化的本地变量
  • ReferenceError:弱引用(Weak reference)试图访问已经垃圾回收了的对象
  • RuntimeError:一般的运行时错误
  • NotImplementedError:尚未实现的方法
  • SyntaxError:Python 语法错误
  • IndentationError:缩进错误
  • TabError:Tab 和空格混用
  • SystemError:一般的解释器系统错误
  • TypeError:对类型无效的操作
  • ValueError:传入无效的参数
  • UnicodeError:Unicode 相关的错误
  • UnicodeDecodeError:Unicode 解码时的错误
  • UnicodeEncodeError:Unicode 编码时错误
  • UnicodeTranslateError:Unicode 转换时错误

【2】Warning(警告的基类)

  • DeprecationWarning:关于被弃用的特征的警告
  • FutureWarning:关于构造将来语义会有改变的警告
  • OverflowWarning:旧的关于自动提升为长整型(long)的警告
  • PendingDeprecationWarning:关于特性将会被废弃的警告
  • RuntimeWarning:可疑的运行时行为(runtime behavior)的警告
  • SyntaxWarning:可疑的语法的警告
  • UserWarning:用户代码生成的警告

【三】触发异常

  • 使用raise语句自己触发异常
#异常可以是字符串、类和对象
for i in range(10):
    if i == 5:
       # 主动报错,告诉其他这里不能为 5      
    raise ValueError('不能为 5')
  • except语句捕获异常
try:
    正常逻辑
except Exception,err:
    触发自定义异常    
else:
    其余代码

【四】异常处理

  • 捕捉异常可以使用try/except语句

【1】异常捕获的语法

#【1】语法
try:
    # 正常可能会触发异常的代码
except ExceptionType as e:
    # 触发异常后执行的代码
    
#【2】示例   
try:
    name = 'ligo'
    name[5] = 's'
except Exception as e:
    print(f"触发异常{e}")
    #触发异常'str' object does not support item assignment

【2】不带任何异常类型使用except

#【1】语法
try:
   # 正常的操作
except:
   # 发生异常,执行这块代码

#【2】示例
try:
    x = 0 / 0
except:
    print("你错了")
# 输出 你错了

【3】异常分支语法

#【1】语法
try:
    # 正常的操作
except:
    # 发生异常,执行这块代码
else:
    # 如果没有异常执行这块代码

#【2】示例
try:
    num = int(input(">>>>"))
except ValueError:
    print("触发异常!")
else:
    print("你对了!")
#>>>>wwwwww
#输出:触发异常!
# >>>>111
#输出:你对了!

【4】使用相同的except语句来处理多个异常信息

#【1】语法
try:
    # 正常的操作
except(Exception1[, Exception2[, ...ExceptionN]]]):
    # 发生以上多个异常中的一个,执行这块代码
else:
    # 如果没有异常执行这块代码
    
#【2】示例
try:
    x = 0 / 0
    y = 10 / 2
    z = x * y
except (ZeroDivisionError, TypeError) as e:
    print("触发异常")
else:
    print("没有异常")
# 输出 触发异常

【5】无论是否发生异常都将执行最后的代码

#【1】语法
try:
	# 正常执行的代码
except:
    # 发生异常,执行这块代码
finally:
	#退出try时总会执行
    
#【2】示例
try:
    x = 0 / 0
    y = 10 / 2
    z = x * y
except ZeroDivisionError as e:
    print("触发异常")
finally:
    print("没有异常")
# 输出 触发异常
# 输出 没有异常

【6】异常可以带上参数

#【1】语法
try:
   # 正常的操作
except ExceptionType as  Argument:
    # 你可以在这输出 Argument 的值
    
#【2】示例
try:
    num = int(input(">>>>"))
except ValueError as Argument:
    print(f"触发异常:{Argument}")
# 输出:触发异常:invalid literal for int() with base 10: 'aaaa'

【7】自定义异常

  • 通过创建一个新的异常类,程序可以命名它们自己的异常
  • 异常应该是典型的继承自Exception类,通过直接或间接的方式
# 实例中创建了一个类,基类为RuntimeError,用于在异常触发时输出更多的信息
# 在try语句块中用户自定义的异常后执行except块语句
# 变量 e 是用于创建Networkerror类的实例
class Networkerror(RuntimeError):
    def __init__(self, arg):
        self.args = arg

# 在你定义以上类后,你可以触发该异常,如下所示:
try:
    raise Networkerror("Bad hostname")
except Networkerror as e:
    print(e.args)
# ('B', 'a', 'd', ' ', 'h', 'o', 's', 't', 'n', 'a', 'm', 'e')

【五】断言

  • 如果断言的条件为False,会触发AssertionError异常。

【1】语法

assert condition, message
  • condition:断言的条件,如果为False,则触发异常。
  • message:可选参数,用于指定触发异常时的错误消息。

【2】示例

a = 5
assert a > 0, "a is not a"
#断言一般在代码中检查某个条件是否满足,如果不满足则抛触发异常

【二】列表/字典推导式

【一】语法

列表推导式:
[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]]
[表达式 for i in 列表/字典/可迭代类型]
[字符串切分/去重空格 for i in 列表/字典/可迭代类型]
[if判断 for i in 列表/字典/可迭代类型]

字典推导式
{键:值 for 迭代变量 in 可迭代对象 [if 条件表达式]}
{key:value for key in 可迭代类型 for value in 可迭代类型}

三元运算符
为真时的结果 if 返回布尔值的判断条件 else 为假时的结果

【二】列表推导式

(1)使用range关键字构建列表

#直接序列构建列表
num_list = []
for i in range(10):
    num_list.append(i)
print(num_list)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

#使用列表推导式
num_list = [i for i in range(10)]
print(num_list)  
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

(2)新生成列表的每个元素都可以是任意的表达式或对象

num_list = [1, 2, 3, 4, 5]
print([i*i for i in num_list])
#输出[1, 4, 9, 16, 25]
print([[i, i + 1] for i in num_list])
#输出[[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]

(3)让每个元素执行相同的操作

#去除空格
num_list = ['1  ', '  2  ', '   3']
print([i.strip() for i in num_list])
#输出 ['1', '2', '3']

(4)加入嵌套循环

num_list1 = [1, 2, 3]
num_list2 = [4, 5, 6]
list_one = [x * y for x in num_list1 for y in num_list2]
print(list_one)
#输出 [4,5,6,8,10,12,12,15,18]

list_two = [[x, x * y] for x in num_list1 for y in num_list2]
print(list_two)
#输出 [[1, 4], [1, 5], [1, 6], [2, 8], [2, 10], [2, 12], [3, 12], [3, 15], [3, 18]]

list_three = [num_list1[i] * num_list2[i] for i in range(len(num_list2))]
print(list_three)
#输出 [4, 10, 18]

list_four = [x * y for x, y in zip(num_list1, num_list2)]
print(list_four)
#输出 [4, 10, 18]

(5)行和列转换

num_list = [[1, 2, 3], [4, 5, 6,], [7, 8, 9]]
new_num_list = [[row[i] for row in num_list] for i in range(len(num_list[0]))]
print(new_num_list)
#输出 [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

(6)加入判断条件,组成过滤器

num_list = [1, 2, 3, 4, 5]
list_one = [i for i in num_list if i % 2 == 0]
print(list_one)
#输出 [2, 4]

list_two = list(filter(lambda i: i % 2 == 0, num_list))
print(list_two)
#输出 [2, 4]

(7)判断列表中有几个对称数

num_list = [12345, 22222, 789987, 13131, 505]
list_one = sum([num == num[::-1] for num in map(str, num_list)])
print(list_one)
# 4

list_two = len([num for num in map(str, num_list) if num == num[::-1]])
print(list_two)
# 4

【三】字典推导式

my_dict = {key: value for key in range(5) for value in range(10)}
print(my_dict)
#输出:{0: 9, 1: 9, 2: 9, 3: 9, 4: 9}

#用列表遍历一个含有键值对的可迭代对象
user_list = [('name', 'ligo'), ('age', 20)]
data_dict = {key: value for key, value in user_list}
print(data_dict)
#输出 {'name': 'ligo', 'age': 20}

【四】元祖推导式和集合推导式

#【1】元祖推导式
#元组推导式生成的结果不是元组,而是一个生成器对象
tuple_ = (i for i in range(10))
print(tuple_)
#输出 <generator object <genexpr> at 0x0000024C23794270>
print(tuple(tuple_))
#用tuple给它转一下就输出元祖了 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

#【2】集合推导式
num_set = {i for i in range(10)}
print(num_set)
posted @ 2024-05-08 15:32  Ligo6  阅读(82)  评论(0)    收藏  举报