Problemas en Python

Python es un lenguaje de referencia para la mayoría de los recién llegados al mundo de la programación. Esto se debe a que es bastante simple, tiene mucha demanda y, en última instancia, es poderoso. Pero hay algunos casos que pueden confundir o más bien engañar a un programador novato. ¡Estos se llaman «Gotchas»! Con origen en el término informal «¡Te tengo!», un problema es un caso o escenario en el que el programa juega el truco y da como resultado un resultado que es bastante diferente de lo que se esperaba. Cabe señalar que un gotcha no es un error o una excepción . Es un código perfectamente válido que da como resultado una salida incorrecta solo porque nos perdimos un pequeño hecho o punto mientras escribíamos nuestro programa. Por lo tanto, también podemos considerar las trampas como “errores comúnmente cometidos durante la codificación”.

python-gotchas

Echemos un vistazo a algunos errores más comunes en Python3 y cómo abordarlos:

  1. Los paréntesis fallan:
  2. Hay algunas trampas que surgen cuando el paréntesis se usa incorrectamente o innecesariamente.

    Ejemplo:

    Python3

    # results in False
    print(5>2 == True

    Producción:

    False

    Esto da como resultado Falso porque la expresión anterior significa efectivamente que 5>2 y 2==Verdadero. Esto implica, Verdadero y Falso. Por lo tanto, el resultado final es Falso.
    Se puede corregir mediante el uso de paréntesis.

    Python3

    # results in True
    print((5>2) == True)

    Producción:

    True
    

    Aquí hay un ejemplo más:

    Python3

    # results in False
    print(5 is (not None)) 

    Producción:

    False

    Esto se debe a que "is not"es diferente "is"y "not"se usa por separado. La parte (not None)es igual a Verdadero y 5 es Verdadero da como resultado Falso. Se puede corregir no usando ningún paréntesis.

    Python3

    # results in True
    print(5 is not None)

    Producción:

    True
    

  3. “es”, “==”, “no es”, “!=”: Este es un error corto pero muy común. Muchos programadores nuevos a menudo piensan eso isy ==son lo mismo. ¡Pero definitivamente no lo es!

    Python3

    # results in True
    print(1 == True)
      
    # results in False
    print(1 is True

    Producción:

    True
    False
    

    Por otro lado, is noty !=son iguales.

    Python3

    # results in True
    print(1 != False
      
    # results in True
    print(1 is not False)

    Producción:

    True
    True
    

  4. Argumentos predeterminados gotcha:

    En Python, los argumentos predeterminados se declaran solo una vez cuando la función se ejecuta por primera vez y, a partir de ese momento, el argumento declarado se usa cada vez.

    Python3

    def appendNew(appendTo =[]):      
        appendTo.append(1)   
        return appendTo
          
    # Driver's code
    print(appendNew())
    print(appendNew())

    Se espera que cada vez que llamemos appendNew(), se cree una nueva lista que tendrá 1 en ella. Pero lo que pasa es esto:

    [1]
    [1, 1]
    

    La variable appendTono se vuelve a crear cuando la función se ejecuta por segunda vez. En cambio, se crea solo la primera vez y se usa una y otra vez. Podemos abordarlo:

    Python3

    def appendNew(appendTo = None):  
        if appendTo == None:
            appendTo =[]    
        appendTo.append(1)   
        return appendTo
          
    # Driver's code
    print(appendNew())
    print(appendNew())

    Producción:

    [1]
    [1]
    

  5. Errores de alcance:

    A veces, debemos tener en cuenta el alcance de la variable con la que estamos tratando, es decir, si es un alcance global (funciona pero dentro y fuera de una función) o un alcance local (funciona solo dentro de la función).

    Ejemplo:

    Python3

    list1 = [1, 2, 3]
    def baz1():
      
        # the code works fine
        list1.append(4
        return list1
    def baz2():
      
        # Doesn't work fine
        list1 += [5]      
        return list1
          
    # Driver's code
    print(baz1())
    print(baz2())

    Producción:

    [1, 2, 3, 4]
    
    Traceback (most recent call last):
      File "/home/ba0dfa25407638b061076b45ce165ce5.py", line 15, in 
        print(baz2())
      File "/home/ba0dfa25407638b061076b45ce165ce5.py", line 10, in baz2
        list1 += [5]      
    UnboundLocalError: local variable 'list1' referenced before assignment
    

    Esto sucede porque

    list1 += [5]

    significa que estamos asignando a la variable list1pero lista1 está definida fuera del alcance de nuestra función. Mientras estamos en baz1(), estamos agregando a list1 en lugar de asignar y, por lo tanto, funciona bien.

  6. Las variables se vinculan tarde en los cierres:

    Python tiene un comportamiento de enlace tardío infame . Con esto, queremos decir que el valor de una variable que se está iterando finaliza en el valor cuando alcanza su última iteración. Veamos un ejemplo:

    Python3

    def create_multipliers():
      
        # lambda function creates an iterable
        # list anonymously
        return [lambda c : i * c for i in range(6)] 
      
      
    for multiplier in create_multipliers():
        print multiplier(3)

    El resultado esperado es, por supuesto:

    0
    3
    6
    9
    12
    15
    

    Pero lo que obtenemos es:

    15
    15
    15
    15
    15
    15
    

    Esto se debe a que cuando se completa la iteración del bucle, itiene un valor de 5 y, por lo tanto, 3*5 cada vez da como resultado 15.
    Se puede resolver de la siguiente manera:

    Python3

    def create_multipliers():
        return [lambda x, i = i : i * x for i in range(6)]
          
          
    for multiplier in create_multipliers():
        print(multiplier(3))

    Producción:

    0
    3
    6
    9
    12
    15
    

  7. Mutar una lista mientras se itera sobre ella:

    Este es el problema más común que enfrentan los nuevos codificadores casi todo el tiempo. Mientras trabajamos con una lista u otros elementos mutables, si lo mutamos mientras iteramos sobre él, es seguro que causará errores. Se recomienda que, en su lugar, creemos la copia de la lista y la transformemos en lugar de la lista original.

    Python3

    # buggy program to print a list 
    # of odd numbers from 1 to 10
      
      
    even = lambda x : bool(x % 2)
    numbers = [n for n in range(10)]
      
    for i in range(len(numbers)):
        if not even(numbers[i]):
            del numbers[i]

    Producción:

    Traceback (most recent call last):
      File "/home/92eed8bfd8c92fca3cf85f22e8cfd9ea.py", line 9, in 
        if not even(numbers[i]):
    IndexError: list index out of range
    

    Pero si usamos una copia de numbersen su lugar:

    Python3

    # working program to print a 
    # list of odd numbers from 1 to 10
      
      
    even = lambda x : bool(x % 2)
    numbers = [n for n in range(10)]
      
    numbers[:] = [n for n in numbers if even(n)]
    print(numbers)  

    Producción:

    [1, 3, 5, 7, 9]
    

Publicación traducida automáticamente

Artículo escrito por agarwalkeshav8399 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 *