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”.
Echemos un vistazo a algunos errores más comunes en Python3 y cómo abordarlos:
- Los paréntesis fallan:
- “es”, “==”, “no es”, “!=”: Este es un error corto pero muy común. Muchos programadores nuevos a menudo piensan eso
is
y==
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 not
y!=
son iguales.Python3
# results in True
print
(
1
!
=
False
)
# results in True
print
(
1
is
not
False
)
Producción:
True True
- 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
appendTo
no 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]
- 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
list1
pero lista1 está definida fuera del alcance de nuestra función. Mientras estamos enbaz1()
, estamos agregando a list1 en lugar de asignar y, por lo tanto, funciona bien. - 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,
i
tiene 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
- 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
numbers
en 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]
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
Publicación traducida automáticamente
Artículo escrito por agarwalkeshav8399 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA