如何在列表推导式中捕获 Python 异常?
在我们了解如何在列表推导式中捕获 Python 异常之前,让我们首先了解什么是列表推导式。
列表推导式是一种语句,允许您创建一个列表并执行 for 循环,所有这些都在单行代码中完成。
这还可以从其他可迭代对象(如元组、字符串、数组和列表等)创建列表。 列表推导式的语法如下所示:
List = [expression(element) for element in list if condition]
Python 列表和列表推导式功能是该语言最显著的特性之一,可以在一行代码中生成强大的功能。
Python 中没有专门的内置方法来处理列表推导式中出现的异常。因此,我们只能使用 try/except 块来处理。
示例
letters = [letter for letter in 'APPLE']print(letters)
输出
['A', 'P', 'P', 'L', 'E']
列表推导式中的异常处理
异常是在程序执行过程中发生的意外错误或事件。错误和异常经常被混淆;当程序中发生错误时,它会停止执行;但是当遇到异常时,程序会偏离其原始执行路径。因此,与错误不同,异常是可以处理的。因此,您的程序不会崩溃。
很多时候,既有有效的异常,也有无效的异常。异常可用于以多种方式管理程序中的错误和异常情况。当您认为您的代码可能会产生错误时,您可以使用异常处理技术。
raise 异常语句可用于在程序中引发异常。引发异常会终止当前代码执行,并返回异常,直到处理该异常为止。
处理内置异常
让我们来看一下列表推导式中的一些内置异常处理。
示例
由于我们正在使用列表,让我们尝试将一个列表的元素除以另一个列表的元素。这些列表还可以包含零。
当有限数除以零时,会抛出 ZeroDivisionError。它是一个内置异常,是 ArithmeticException 类的一部分。可以使用 try-except 块处理此异常,在引发此异常时更改输出。我们可以用一个例子更好地理解这一点。
list_1 = [12, 23, 34, 45, 56] list_2 = [0, 1, 2, 3, 4] def func(a, b): try: return a/b except ZeroDivisionError: print("Division by zero not allowed") list_3 = [func(x, y) for x, y in zip(list_1, list_2)] print(list_3)
输出
Division by zero not allowed [None, 23.0, 17.0, 15.0, 14.0]
示例
ValueError 是 Python 中的一个异常,当传递给函数的参数数据类型正确但值无效时引发此异常。例如,将负整数传递给尝试查找数字平方根的函数。
考虑一个包含整数、字符串格式的整数和单词的列表。现在必须通过对数字(以字符串和 int 格式表示)进行平方来创建一个新列表。但是,在这种情况下,字符串值必须简单地跳过,并且不发出错误通知。
list = ['10', '11', 7, 'abc', 'cats', 3, '5'] #helper function def func(a): try: return int(a)*int(a) except ValueError: pass # list comprehension new_list = [func(x) for x in list] print(new_list)
输出
我们没有收到任何异常消息,因为我们只想忽略非数值,并且在引发异常的区域中填充了 None 值。
[100, 121, 49, None, None, 9, 25]
其他内置异常也可以使用 try-except 块以相同的方式处理。
处理用户定义的异常
用户定义的异常可以是值在特定范围内到值可被某个数字整除的任何内容。必须为此创建一个继承内置 Exception 类的类。然后可以使用辅助函数测试异常。考虑下面的例子。
示例
考虑一个整数列表。目标是挑选出可被二整除的整数并形成一个新列表。对于不可被整除的数字,应打印数字以及错误消息。
# creating class for user-defined exception handling class error(Exception): def __init__(self, a): self.msg = "The number "+str(a)+" is not divisible by 2" # helper function def util_func(a): try: if a % 2 != 0: raise error(a) return(a) except error as e: print(e.msg) # input list list = [12, 23, 34, 45, 56, 67] # list comprehension to choose numbers # divisible by 2 new_list = [util_func(x) for x in list] print("\nThe new list has :", new_list)
输出
The number 23 is not divisible by 2 The number 45 is not divisible by 2 The number 67 is not divisible by 2 The new list has : [12, None, 34, None, 56, None]
示例
从现有列表创建一个新列表,其值介于 10 到 20 之间。如果值超出指定范围,我们将引发异常,如下例所示。
# class for user-defined exception handling class error(Exception): def __init__(self, a): self.msg = "The num "+str(a)+" is out of range!!!" # helper function def util_func(a): try: if a < 10 or a > 20: raise error(a) return(a) except error as e: print(e.msg) return 0 # input list new_list = [12, 23, 34, 45, 56, 67] # list comprehension to choose the numbers # in range 10 to 20 new_li = [util_func(x) for x in new_list] print("\nThe new list are:", new_list)
输出
输出 上述程序的输出如下所示:
The num 23 is out of range!!! The num 34 is out of range!!! The num 45 is out of range!!! The num 56 is out of range!!! The num 67 is out of range!!! The new list are: [12, 23, 34, 45, 56, 67]