Intuición detrás de saber cómo usar la sangría en Python

0

Soy completamente nuevo en programación y he decidido comenzar mi viaje aprendiendo Python. En el camino, he tenido algunos problemas para saber cómo se comporta el código con respecto a la sangría. Daré un ejemplo:

Problema:

Dada una matriz de enteros, devuelve el número de 9 en la matriz.

Mi primer intento hizo esto:

def array_count9(nums):
    list_of_9 = []
    for num in nums:
        if num == 9:
            list_of_9.append(1)
        return sum(list_of_9)

Esto estaba mal, y descubrí más tarde (después de prueba y error) que la razón era porque no había sangrado correctamente mi última línea de código.

La respuesta correcta debería:

def array_count9(nums):
    list_of_9 = []
    for num in nums:
        if num == 9:
            list_of_9.append(1)
    return sum(list_of_9)

Este es un problema con el que me he encontrado repetidamente, y creo que es porque realmente no entiendo cómo Python trata con la sangría.

Ahora entiendo que la respuesta correcta es correcta porque con mi primer intento, le estoy diciendo a Python que devuelva la suma de los objetos dentro de la lista inmediatamente después de probar si el primer número entero es 9. En el ejemplo correcto, Python se ejecutará todos los números, y solo cuando esté hecho, regrese a la sangría anterior y devuelva la lista.

No sé, supongo que me pregunto si alguien puede proporcionar un "recorrido" de lo que está sucediendo en cada línea del bien o dirigirme a un recurso que lo analice más a fondo. He buscado un recurso de este tipo en línea, pero no he podido encontrarlo.

¡Cualquier ayuda sería apreciada!

  • 2
    PythonTutor.com tiene un visualizador interactivo que le permite avanzar (y retroceder) a través de un código simple línea por línea para ver cómo funciona. El depurador incorporado pdb permite avanzar una línea a la vez: no puede ir hacia atrás y no está tan orientado visualmente, pero funciona en todo el código y tiene todo tipo de características potentes que podrá apreciar con el tiempo . La mayoría de los IDE tienen un contenedor GUI alrededor del depurador. – 
  • 1
    Hmm, ¿cuál es exactamente tu pregunta entonces? Parece que ya has entendido la diferencia entre tus pruebas. – 
Mostrar mas 3 comentarios
Etiquetas de preguntas:
list
indentation

1 respuesta

1
Mejor respuesta

En muchos idiomas, la sangría se usa para hacer que el código se vea ordenado y fácil de leer. Sin embargo, este no es el caso con Python. En Python, se requiere una sangría para indicar a qué bloque de código pertenece una declaración. Por ejemplo, veamos el siguiente código:

for i in range(0,5):
   print(i)
print("All done!")

La declaración print(i) está sangrado debajo del ciclo for; Esto significa que la declaración está bajo el ciclo for. Por lo tanto, la declaración se ejecutará 5 veces. Desde la declaración print("All done!") no está sangrado, no está bajo el ciclo for; por lo tanto, solo se ejecutará una vez. La salida para el código anterior es

0

1

2

3

4

All done!

Ahora, modifiquemos un poco el código.

for i in range(0,5):
    print(i)
    print("All done!")

Ahora, dado que ambas declaraciones de impresión están sangradas bajo el ciclo for, se ejecutarán 5 veces. Por lo tanto, el resultado ahora será este:

0

All done!

1

All done!

2

All done!

3

All done!

4

All done!

Ahora, veamos la versión inicial de su código.

def array_count9(nums):
    list_of_9 = []
    for num in nums:
        if num == 9:
            list_of_9.append(1)
        return sum(list_of_9)

Tiene la declaración return debajo del ciclo for, debido a la sangría. Esto significa que para cada iteración del ciclo for, se llamará a la declaración return. Sin embargo, dado que las declaraciones de retorno finalizan la función, el ciclo for se detiene en su primera iteración. Desea devolver la suma de la matriz list_of_9 después de recorrer los números. Por lo tanto, la instrucción return estará después del ciclo for, por lo que no se sangrará bajo el ciclo for. Es por eso que funciona la siguiente versión corregida:

def array_count9(nums):
    list_of_9 = []
    for num in nums:
        if num == 9:
            list_of_9.append(1)
    return sum(list_of_9)
La respuesta fue
Fuente
  • 0
    Muchas gracias! Esto fue muy útil y exactamente la respuesta que estaba buscando. – 
Comunidad Progexpertos
Arriba
Menu