Inicio Programación Cómo programar en Python | Lección 4 – Funciones

Cómo programar en Python | Lección 4 – Funciones

0
Cómo programar en Python | Lección 4 – Funciones

Aprende a programar en python funciones, si vienes de las anteriores lecciones te resultará sencillo ya que es muy parecido a cuando usamos insert(), pop()…etc

Bueno bueno bueno, si has llegado hasta aquí te mereces un FELICIDADES. Este es el primer checkpoint así que salva la partida y tómate un respiro. En esta lección te meteré menos caña que en la anterior ya que era mucho material para estudiar. Y aunque me gusta meterte caña la verdad es que esta parte tiene que quedar MUY MUY clara ya que tu futuro programa va a tener muchas funciones.

¿Qué es una función?

Sr. Malvado, llevas todo el maldito curso hablando de que si función por aquí, función por allá, que si todavía no estamos preparados…¡pues bien!, una función es un conjunto de código que recibe algo, hace algo con ello y devuelve algo. No me mires así, es la simplicidad en su viva esencia; si te digo que según Wikipedia: «una función es un subprograma o subrutina que realiza una tarea específica y devuelve un valor.»

¿A que te gusta más mi definición?, sé que por el momento es muy simple pero quiero que os quede bien claro ahora que vamos a crear funciones, pasarle argumentos y recibir una respuesta. FIN

Después de esta palmada en la espalda es hora de meterse en faena. Vamos allá

Crear funciones

Cuando creamos una función debemos tener claras dos cosas, qué tiene que recibir y qué tiene que devolver. Con estas dos premisas podemos hacer una función en un momento.

Vamos a desarrollar dos funciones, una que recibe dos números y devuelve su suma y otra que devuelve su resta. Para ello tenemos que definir la función con «def nombre(loquerecibe):«, podéis pasarle tantos argumentos como queráis separados por una coma pero si una función reciben muchos argumentos es casi mejor que le pasemos un diccionario.

# Definimos una función suma y una resta
def suma(a,b):
    return a+b

def resta(a,b):
    return a-b

print(suma(2,3))
print(resta(2,3))

Si hacéis la prueba en repl.it, veréis que nos devuelve 5 y -1 que equivale a la suma 2+3 y a la resta 2-3.

Tal y como os habréis dado cuenta, hay una palabra nueva, return, esto devuelve lo que le pasemos al hilo principal de manera sincrona (de arriba a abajo), más adelante os explicaré que es la asincronía y para qué se suele usar pero si os lo explicara ahora sin tener ciertas nociones os explotaría la cabeza.

Acabo de deciros que nuestro programa es síncrono, eso quiere decir que empieza de arriba a abajo y se ejecuta de la siguiente manera:

  • Carga en memoria nuestras funciones SIN EJECUTARLAS.
  • Pido que se imprima el valor de la suma con los argumentos 2 y 3. (Pausa)
  • Espero a que suma finalice su trabajo, mientras tanto el hilo principal NO sigue. (Pausa)
  • Pido que se imprima el valor de la resta con los argumentos 2 y 3. (Pausa)
  • Fin

Tal y como dicta la sincronía, hasta que no ha finalizado suma no va a mostrarse en pantalla, y lo mismo con resta.

Se puede asemejar mucho a una vía de tren, si hay otro tren parado nuestro programa se parará, sin embargo si tenemos 2 vías aunque haya una vaca en medio podremos continuar sin que afecte a nuestro programa (asincronía / multithread)

Creo que ha quedado muy sencillo lo que es una función, además habéis visto que para llamar a una función se pone su nombre y entre paréntesis los argumentos.

Crear funciones con parámetros por defecto

Imaginad que vuestra función siempre recibe uno de los parámetros igual en el 99% de los casos pero queréis tener la opción de cambiarlo. Para eso usamos parámetros por defecto y son parámetros que podemos cambiar haciendo alusión a su nombre. Un ejemplo

# Recibe uno o dos años y devuelve la diferencia # Si recibe 1 sólo parámetro cuenta hasta 2020 # Si recibe 2 parámetros cuenta hasta el 2º parámetro def getEdad(desde,hasta=2020) return hasta-desde print(getEdad(1997, hasta=2050)) # Defines hasta 2050 # Podemos obviar el nombre del parámetro en este caso porque sólo # hay 2 parámetros. print(getEdad(1997,2050) print(getEdad(1997)) # Toma por defecto hasta 2020
Lenguaje del código: PHP (php)

Puede resultar útil usar parámetros por defecto cuando establezcamos una configuración básica o una avanzada. Por ejemplo la URL a la que se debe conectar nuestro programa para consultar algo. Si el cliente quiere poner su propia URL puede, pero normalmente lo hará a la nuestra. Esto lo hablaremos cuando lleguemos a llamadas con requests.

Variables globales y locales

Ahora que ya sabemos hacer funciones os voy a hablar de las variables globales y locales. Una variable local es aquella que se encuentra dentro de una función o una clase, sólo se puede acceder desde dentro de esa función y desde ninguna otra. Un claro ejemplo sería el siguiente

def miFuncion(): a = 10 print(a) # 10 print(a) # None
Lenguaje del código: PHP (php)

La variable a dentro de «miFuncion» valdrá 10, pero fuera de esta valdrá None porque su valor se reduce al scope (¡palabrota!) de la función en la que se declara.

Las variables globales se suelen declarar al principio del programa, en minúsculas si es una variable que vas a modificar en algún momento y en mayúsculas si es una variable inmutable, que siempre debe mantener su valor. Si quieres modificar una variable global debes declararla en la función como tal, si no te dará error.

# Variable global a = "hola" def miFuncion(): print(a) def miFuncionConCambio(): # declaramos a con su global global a a = "adios" miFuncion() miFuncionConCambio() # el valor de a se ha cambiado print(a)
Lenguaje del código: PHP (php)

Puedes verlo en acción aquí

Como última reseña si tienes una variable global «a» y declaras una variable local con el mismo nombre, la variable global NO se verá afectada. Sólo deberás tener en cuenta que no podrás acceder desde esa función a la variable global.

Qué es el scope

Las variables globales y locales existen a cuenta del scope. El scope es hasta dónde llega una variable dentro de una función o programa. Cuando hablamos de scope las variables son visibles desde el «bloque» en el que se declaran. Si declaras una variable global, todos pueden verla. Si la declaras dentro de una clase, todas las funciones la heredan y la ven. Pero en esta lección con que sepas que es una variable global y una local es suficiente.

CONCLUSIÓN

Hemos visto cómo crear funciones para transformar y obtener datos de una forma ordenada por separado dejando el hilo principal para lo que realmente es. En la próxima lección hablo de cómo recoger datos por teclado y te propongo un ejercicio en condiciones explicado desde una necesidad compleja hasta una solución descompuesta en problemas más pequeños.

EJERCICIOS

Crea una función que reciba un nombre y un apellido y devuelva ambos en un mismo string. (Ojo con el espacio entre nombre y apellido).
Haz una función que reciba 1 lista y un elemento y devuelva la lista con el elemento añadido al final de esta.
[EXTRA] Construye una función que recibe un objeto y devuelve el valor de una propiedad. (TIP: los argumentos de la función que debe recibir son (lista,string).

Mejoras

Si crees que se puede mejorar este tutorial puedes dejarnos en comentarios tus consejos, trabajo activamente para que los manuales resulten lo más sencillo posible pero también os escucho para mejorarlos.

¿Tienes dudas?
Da igual que seas perro, gato, erizo, [email protected] o gremlin, estaré encantado de escucharte en las redes sociales o en los comentarios.

Si te ha gustado este tutorial un comentario con un gracias ayuda a seguir adelante con estos manuales; dan ánimo y no sientes que estás perdiendo el tiempo escribiendo y dedicando esfuerzos en hacer estas cosas. No te voy a pedir que te suscribas a Youtube ni que me sigas en Facebook o Instagram, un gracias es suficiente.

¿Te sientes MUY [email protected]?

Puedes usar el enlace de Amazon antes de terminar una compra o invitarme a un café en ko-fi, este dinero se usa para mantener el servidor encendido a través del siguiente enlace:

KO-FI Banner