Dominar el uso de listas y bucles es una de las 5 habilidades fundamentales para construir algoritmos:
Funciones
.Básicamente, una función es un conjunto de líneas de código agrupadas para cumplir un objetivo específico. Por ejemplo, veamos esta función para multiplicar dos números:
1def multiplicar(a, b): 2 return a * b 3 4resultado = multiplicar(2, 6) 5print(str(resultado)) # Imprime: 12
Analizando el código de arriba tenemos las siguientes conclusiones:
def
.def
colocamos el nombre que le queremos dar a la función (en este caso "multiplicar").a
y b
). Puedes escoger el nombre de los parámetros, pero siempre deben tener el mismo orden.:
, de esa forma el computador sabrá que vamos a empezar a programar una función (algoritmo).return
(es una buena práctica), toda función debe retornar algo, así sea None
, en este caso retornamos la multiplicación entre los parámetros a y b (entradas).De ahora en adelante, cada vez que quiera multiplicar dos números puedo reutilizar la función multiplicar
de la siguiente manera, cuantas veces lo necesites:
1resultado_1 = multiplicar(2, 6) 2print(str(resultado_1)) # Imprime: 12 3 4resultado_2 = multiplicar(5, 2) 5print(str(resultado_2)) # Imprime: 10
📺 Haz clic aquí para ver un video explicativo sobre funciones (10min)
Veamos esta función que dado un número de invitados permite calcular el costo de organizar una fiesta con el siguiente algoritmo:
1def calcular_costo(numero_de_invitados): 2 precio_por_invitado = 10 3 costo_total = numero_de_invitados * precio_por_invitado 4 if numero_de_invitados > 200: 5 costo_total = costo_total - (costo_total * 0.1) # ← descuento de 10% 6 return costo_total
None
, pero debes reemplazarlo y siempre devolver algo útil. En este ejemplo, queremos devolver el resultado de una multiplicación de a por b.La idea es tener una librería de cientos de funciones y usarlas como nos plazca, declaras todas tus funciones y luego empiezas a usarlas y reutilizarlas todo el tiempo.
La programación es muy abstracta y sucede mucho que no tienes idea de lo que escribiste ayer. Antes de que existieran las funciones, los algoritmos eran una enorme serie interminable de líneas de código donde los desarrolladores tenían dificultades y se perdían. Es difícil para tu cerebro seguir un procedimiento/algoritmo de gran longitud; Cuantas más líneas de código, más abstracto se vuelve.
Al utilizar funciones tienes las siguientes ventajas:
☝ Si lo piensas bien, las funciones son equivalentes a los libros. Almacenan funciones y formas de hacer las cosas y en futuros desarrollos simplemente los reutilizas en lugar de tener que resolver todo de nuevo.
Todas las funciones deben comenzar y terminar en algún lugar, esto se llama alcance de la función. Puedes delimitar el alcance de la función utilizando la indentación de la siguiente manera:
1# Esta parte del código está FUERA de la función 'multiplicar' 2 3def multiplicar(a, b): 4 # Esta parte del código está DENTRO de mi función 5 # porque está después de la declaración e indentada a la derecha 6 7 return a * b 8 9 # Esta parte del código está DENTRO 10 # pero nunca se ejecutará porque se encuentra DESPUÉS del return 11 12 13# esta parte del código está FUERA de la función 'multiplicar' 14# porque ya no tiene la indentación a la derecha 15print(str(multiplicar(34, 2)))
Cualquier variable que declare dentro de la función no estará disponible fuera de ella.
1def multiplicar(a, b): 2 mi_variable = 'hello' 3 return a * b 4 5# Este print no funcionará, generará un error, porque mi_variable fue 6# declarada dentro de la función multiplicar, por lo tanto, no está disponible fuera de su alcance 7print(mi_variable)
☝ Es muy importante recordar que una vez que use la instrucción
return
, la función dejará de ejecutarse, si hay algún código después de esa instrucción, nunca se ejecutará.
Si tu función va a tener una sola línea de código, puedes declararla de una forma mucho más ágil utilizando la palabra reservada lambda
.
1multiplicar = lambda a, b : a * b 2resultado = multiplicar(2, 3) 3print(str(resultado))
Lambda es ideal para casos en los que tengas funciones muy pequeñas. Aprenderás a quererlas por lo rápido que resulta codificar, especialmente cuando tengas que iterar listas.
La única forma de usar una función (es decir, "llamarla") es usando paréntesis de esta forma:
1# Así se llama a una función sin parámetros 2multiplicar() 3 4# Así se llama a una función con parámetros 5multiplicar(<primer param>, <segundo param>) 6 7# Por ejemplo, para multiplicar 3 por 9 8multiplicar(3, 9)
Recuerda asignarle a la función del parámetro que debiese recibir. En nuestro ejemplo, la función multiplicar se declaró pidiendo dos números para multiplicar.
Puedes combinar funciones como quieras y tener llamadas encadenadas como esta:
1def suma(a, b): 2 return a + b 3 4def multiplicar(a, b) 5 return a * b 6 7resultado = multiplicar(suma(3, 5), suma(1, 1))) 8 9 10# Las ejecuciones van de adentro hacia afuera 11# Primero, se calculará la suma de 3 + 5 y 1 + 1 12# A continuación, se multiplicarán sus respectivos resultados 13primero = suma(3, 5) 14segundo = suma(1, 1) 15print(str(multiplicar(primero, segundo))
El siguiente código tiene 3 funciones declaradas:
1def get_average(ages): 2 # Código del algoritmo 3 4def get_youngest(ages): 5 # Código del algoritmo 6 7def get_person_info(name): 8 # Código del algoritmo
Como puedes ver, los nombres de las funciones son bastante específicos sobre lo que hacen las funciones, así como los parámetros asignados a ellas.
Otras cosas importantes a tener en cuenta:
get_person_info
dos veces, sin usar funciones tendríamos que usar más código porque no tendríamos ninguna opción para reutilizar la función.get_average
es obtener el valor promedio en una lista dada. No sabe nada más ¡Y eso es genial! Al separar tu código en pequeñas funciones, puedes concentrarte en una cosa a la vez.