首页 > 编程语言 >Python中级之异常处理+推导式

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

时间:2024-05-08 15:46:18浏览次数:23  
标签:中级 推导 Python list except try num print 异常

【一】异常处理

【一】什么是异常

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

【二】异常分类

  • 在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

相关文章

  • 使用Python的DataFrame和duckdb查询PG数据库
    直接使用以下脚本:importpsycopg2importduckdbimportpandasaspd#ConnecttoPostgreSQLconn_postgres=psycopg2.connect(dbname="pg_test_db",user="your_username",#Replacewithyourusernamepassword="your_password&qu......
  • Python基础之基本运算符
    【一】参考网站菜鸟教程:https://www.runoob.com/python/python-operators.html【二】算数运算符python支持的算数运算符与数学的运算符号是一样的#【1】加法运算符a=3b=4c=a+bprint(c)#输出7#【2】减法运算符a=3b=4c=a-bprint(c)#......
  • Python基础之流程控制语句
    【一】流程控制语句介绍程序是由语句构成,而流程控制语句是用来控制程序中每条语句执行顺序的语句流程控制方式有顺序结构分支结构循环结构最简单最常用的就是顺序结构,执行方式是从上至下一句一句来【二】顺序结构【1】什么是顺序结构顺序结构是指按照代码书写的顺......
  • threading:Python线程锁与释放锁
    控制资源访问前文提到threading库在多线程时,对同一资源的访问容易导致破坏与丢失数据。为了保证安全的访问一个资源对象,我们需要创建锁。示例如下:importthreadingimporttimeclassAddThread():def__init__(self,start=0):self.lock=threading.Lock()......
  • nuitka: Python代码打包为exe
    一.pyinstaller和Nuitka使用感受1.1使用需求这次也是由于项目需要,要将python的代码转成exe的程序,在找了许久后,发现了2个都能对python项目打包的工具——pyintaller和nuitka。这2个工具同时都能满足项目的需要:隐藏源码。这里的pyinstaller是通过设置key来对源码进行加密的;而......
  • binaascii:A Python 在二进制和 ASCII 之间转换
    binaascii是一个用于在二进制和ASCII之间转换的模块。b2a_base64是binaascii模块中的一种方法,它将base64数据转换为二进制数据。下面是这个方法的一个例子:importbase64importbinasciimsg="Tandrew"encoded=msg.encode('ascii')base64_msg=base64.b64encode......
  • geopandas:Python绘制数据地图
    https://mp.weixin.qq.com/s/Nq5Ygy0axI83H2dclU56yQGeoPandas是一个Python开源项目,旨在提供丰富而简单的地理空间数据处理接口。GeoPandas扩展了Pandas的数据类型,并使用matplotlib进行绘图。GeoPandas官方仓库地址为:GeoPandas。GeoPandas的官方文档地址为:GeoPandas-doc。本......
  • difflib: Python 比较数据集
    difflib 是一个专注于比较数据集(尤其是字符串)的Python模块。为了具体了解您可以使用此模块完成的几件事,让我们检查一下它的一些最常见的函数。SequenceMatcherSequenceMatcher 是一个比较两个字符串并根据它们的相似性返回数据的函数。通过使用 ratio(),我们将能够根据比率/......
  • string:Python的文本常量与字符串模板
    前言在程序中,有很多高效率的字符串处理方式,如果开发者能够完全掌握这些高效的字符串处理,往往在开发者也能事半功倍。比如针对于字符串的处理,也是自然语言处理的基础知识。而python3中,处理字符串的库为:string。本篇将详细介绍各种字符串的高效处理方式。首字母大写对于英文单词......
  • time:Python的时间时钟处理
    前言time库运行访问多种类型的时钟,这些时钟用于不同的场景。本篇,将详细讲解time库的应用知识。获取各种时钟既然time库提供了多种类型的时钟。下面我们直接来获取这些时钟,对比其具体的用途。具体代码如下:importtimeprint(time.monotonic())print(time.monotonic_ns())pri......