¿Cómo manejar una excepción de Python en una lista de comprensión?

Una excepción es algo que interrumpe el flujo del programa. Estas excepciones detienen la ejecución del proceso y envían un mensaje de error. Las excepciones se pueden ver simplemente como un objeto que representa un error. Hay excepciones predefinidas y excepciones definidas por el usuario en Python. En este artículo, discutiremos cómo manejar la excepción de Python en una lista de comprensión , pero primero aprendamos qué es la lista de comprensión.

Lista de comprensión en Python

La comprensión de listas se usa para crear nuevas listas a partir de las listas existentes o cualquier otra iterable en Python. Los elementos en un iterable se iteran, se verifica alguna condición si es necesario y si cumple con los criterios especificados, se agregará al nuevo iterable. 

Sintaxis:

new_list=[variable_name  <for loop>  <if-condition>]

En Python, no hay métodos incorporados especiales para manejar las excepciones que ocurren en las listas de comprensión. Este artículo contiene los fragmentos de código que se pueden usar para manejar las excepciones que surgen en las listas de comprensión.

Manejo de excepciones predefinido

Veamos algunos de los manejos de excepciones predefinidos en la comprensión de listas.

1) Manejo de ZeroDivisionError

Considere dos listas (lista1, lista2) que contienen números enteros. Ahora se requiere formar una nueva lista (lista3) dividiendo los elementos de lista1 por los elementos de lista2. Se puede formular como se indica a continuación.

list3 [i] = list1 [i] / list2 [i]

Al sumergir los elementos por 0, surge el error. Esta excepción debe detectarse y debe mostrarse el mensaje de error. Esto se puede lograr escribiendo una función de utilidad como se indica en el fragmento de codificación a continuación.

Python3

list1 = [2, 6, 41, 1, 58, 33, -7, 90]
list2 = [1, 3, 2, 0, 6, 3, 7, 0]
  
  
def util_func(a, b):
    try:
        return round(a/b, 3)
    except ZeroDivisionError as e:
        print("Division by zero not permitted!!!")
  
  
list3 = [util_func(x, y) for x, y in zip(list1, list2)]
  
print(list3)

Producción:

Division by zero not permitted!!!
Division by zero not permitted!!!
[2.0, 2.0, 20.5, None, 9.667, 11.0, -1.0, None]

En este caso, se imprime un mensaje de error personalizado. 

2) Manejo de ValueError

Considere una lista que contiene números enteros, números enteros en formato de string y también palabras juntas. Ahora se requiere formar una nueva lista tomando los números (que están en el formato de string e int) solos y cuadrándolos. Pero aquí los valores de string deben omitirse y no se requiere que se imprima ningún mensaje de error.

Python3

li = ['10', '11', 7, 'abc', 'cats', 3, '5']
  
# helper function
def util_func(a):
    try:
        return int(a)*int(a)
    except ValueError:
        pass
  
  
# list comprehension
new_li = [util_func(x) for x in li]
  
print(new_li)

Producción:

[100, 121, 49, None, None, 9, 25]

Dado que solo queríamos ignorar los valores no numéricos, no recibimos ningún mensaje de excepción y el valor Ninguno se completa en los lugares donde se generó la excepción.

Manejo de excepciones definido por el usuario

Las excepciones definidas por el usuario pueden ser cualquier cosa, como que el valor debe estar en un rango específico o el valor debe ser divisible por algún número o cualquier otra cosa. Para esto, se debe construir una clase que herede la clase Exception incorporada. Luego, la excepción se puede verificar con el uso de la función auxiliar. Considere los siguientes ejemplos.

Ejemplo 1: considere una lista de números enteros [2,43,56,-78,12,51,-29,17,-24]. La tarea es seleccionar los números enteros que son divisibles por 2 y formar una nueva lista. Para los números no divisibles, el número debe imprimirse con un mensaje de error .

Python3

# 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
li = [2, 43, 56, -78, 12, 51, -29, 17, -24]
  
# list comprehension to choose numbers
# divisible by 2
new_li = [util_func(x) for x in li]
  
print("\nThe new list has :", new_li)

Producción:

¡¡El número 43 no es divisible por 2!!
¡¡El número 51 no es divisible por 2!!
¡¡El número -29 no es divisible por 2!!
¡¡El número 17 no es divisible por 2!!

La nueva lista tiene: [2, Ninguno, 56, -78, 12, Ninguno, Ninguno, Ninguno, -24]

Ejemplo 2: Formar una nueva lista a partir de la existente de modo que los valores seleccionados estén entre 10 y 20.

Python3

# class for user-defined exception handling
class error(Exception):
    def __init__(self, a):
        self.msg = "The number "+str(a)+" is not in 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
li = [11, 16, 43, 89, 10, 14, 1, 43, 12, 21]
  
# list comprehension to choose numbers
# in range 10 to 20
new_li = [util_func(x) for x in li]
  
print("\nThe new list has :", new_li)

Producción:

The number 43 is not in range!!!
The number 89 is not in range!!!
The number 1 is not in range!!!
The number 43 is not in range!!!
The number 21 is not in range!!!

The new list has : [11, 16, 0, 0, 10, 14, 0, 0, 12, 0]

Publicación traducida automáticamente

Artículo escrito por erakshaya485 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *