【一】异常处理
【一】什么是异常
- 异常是程序运行时可能发生的错误或意外情况
- 当出现异常时,程序的正常流程会被中断,出现报错界面
【二】异常分类
- 在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)
标签:中级,推导,Python,list,except,try,num,print,异常
From: https://www.cnblogs.com/ligo6/p/18179978