Las funciones de Python

Las funciones de Python

Empezamos nuevo bloque en el curso con las funciones de Python.

¿Qué son las funciones de Python?

Las funciones son bloques de código que se ejecutarán solo cuando sean llamados. No dependen de una condición como los bucles o los condicionales.

Para crear una función en Python debes escribir la palabra reservada "def" y darle un nombre, con unos paréntesis y dos puntos.

Dentro, indenta todo el código que quieras. Aquí tienes un pequeño ejemplo:

def saludar():
    print("Hello PCMaster!")

Si ejecutas esto, no aparece nada en la consola. Tengo que realizar la llamada cuantas veces quiera y donde quiera a lo largo del código para que se ejecute.

def saludar():
    print("Hello PCMaster!")
 
saludar()

Resultado en la consola

Hello PCMaster!

Las funciones pueden contener mucho código. Sin embargo, te recomiendo que las hagas lo más reducidas posible y que si tienes una muy grande, que consideres si la puedes dividir en varias a modo de mini módulos.

El alcance o "scope" de las funciones

Vamos a ver lo que es el alcance o "scope" en inglés de las funciones.

En el siguiente ejemplo, tengo la variable "numero" declarada dentro de la función. Si la llamo dentro de ella, no hay ningún problema.

def mostrar_numero():
    numero = 10
    print(numero)
 
mostrar_numero()

Resultado en la consola

10

¿Qué ocurre si intento utilizar esa variable fuera de la función?

def mostrar_numero():
    numero = 10
   
mostrar_numero()
 
print(numero)

Error en la consola

NameError: name 'numero' is not defined

Vaya, me dice que numero no existe.

Esto es por el tema del alcance. Las variables declaradas dentro de una función, solo se pueden usar desde ahí mismo. Es lo que se conoce como alcance local.

En cambio, sí que podemos emplear una variable declarada fuera de la función. Esta tiene un alcance global, es accesible fuera y dentro de las funciones del código.

numero = 10
 
def mostrar_numero():
    print(numero)
 
mostrar_numero()

Resultado en la consola

10

Si llamo a esta función, me imprime el valor de la variable global sin problemas.

Sin embargo, ¿qué ocurre si hay otra variable local dentro de la función llamada igual?

numero = 10
 
def mostrar_numero():
    numero = 5
    print(numero)

mostrar_numero()
 
print(numero)

Resultado en la consola

5
10

Según el resultado, ha quedado demostrado que las funciones acceden a las variables globales, pero que si tienen otra local con el mismo nombre no se redeclaran sus valores, sino que funcionan como dos variables diferentes.

Parámetros y argumentos en las funciones

La siguiente función contiene el código necesario para realizar una suma, almacenar su valor e imprimirlo.

def sumar():
    numero1 = 10
    numero2 = 70
    resultado = numero1 + numero2
    print(resultado)
 
sumar()
sumar()
sumar()

Resultado en la consola

80
80
80

He puesto tres llamadas para que veas que el resultado es siempre el mismo, a no ser que edite el programa.

Las funciones están pensadas para reutilizar código de manera eficiente, y esta función, no cumple correctamente con su cometido.

Voy a crear una pequeña función capaz de realizar sumas diferentes en cada llamada. Para ello utilizaré los paréntesis de la declaración, los cuales sirven para añadir parámetros. Estos parámetros pueden ser tratados como variables, a los cuales, les podemos dar valores. Estos valores se conocen como argumentos.

Hay que tener clara la distinción entre argumento (valor dado al parámetro) y parámetro (contenedor para un argumento).

def sumar(numero1, numero2):
    resultado = numero1 + numero2
    print(resultado)

He añadido los valores fijos de "numero1" y "numero2" como parámetros. No les doy ningún valor en la función, ya que se lo pasaré como argumento en cada llamada.

Así hay que hacerlo:

def sumar(numero1, numero2):
    resultado = numero1 + numero2
    print(resultado)
 
sumar(10, 70)
sumar(45, 90)
sumar(5, 98)

Resultado en la consola

80
135
103

¿Ves? Ahora los resultados van variando según los argumentos que especifique en cada llamada.

Los parámetros en las funciones, son opcionales. Ya has visto que podemos dejar una función sin ellos. También puedes poner todos los argumentos que necesites, no solo dos como en el ejemplo de la función de suma.

Si yo declaro "numero1" y "numero2" dentro de la función, les tengo que dar un valor. Al darles un valor, la función no se puede reutilizar, ya que cada llamada a ella, va a dar como resultado, siempre lo mismo.

def sumar():
    numero1 = 80
    numero2 = 100
    resultado = numero1 + numero2
    print(resultado)

sumar()

Resultado en la consola

180

En una función como la vista hasta ahora, se esperan dos argumentos en la llamada. Hay dos parámetros, pues esos son el número de argumentos que pasaremos. Ni uno más ni uno menos. Si haces esto en la llamada, te dará el siguiente error:

def sumar(numero1, numero2):
    resultado = numero1 + numero2
    print(resultado)
 
sumar(10, 70, 90)

Resultado en la consola

TypeError: sumar() takes 2 positional arguments but 3 were given

TypeError: sumar() tiene 2 argumentos posicionales pero se le dieron 3.

Con lo de posicionales, se refiere a que son argumentos para pasar en el mismo orden en el que son especificados los parámetros. Por lo tanto, el primer argumento en la llamada corresponde a "numero1" y el segundo a "numero2".

def sumar(numero1, numero2, numero3):
    resultado = numero1 + numero2 + numero3
    print(resultado)
 
sumar(10, 70, 90)

Resultado en la consola

170

Si al ejemplo anterior le añadimos un tercer parámetro, ahora si que funcionará con los 3 argumentos.

Los tipos de datos en los parámetros de las funciones de Python

Vamos a complicar un poco más el tema de las funciones.

Pongamos dos parámetros de diferentes tipos. Uno para un string y otro para un integer.

Ya sabes si has seguido el curso, recuerda que en Python, los tipos de datos se asignan en torno a los valores que almacena una variable, así que en los parámetros, no hay que indicar el tipo de dato al igual que pasa con las variables.

En las llamadas que hagamos, hay que ser coherentes con el orden especificado de los parámetros, por ejemplo, si viene primero nombre, sabemos que se espera un string y luego para la edad un integer.

def saludar(nombre, edad):
    saludo = f"Me llamo {nombre} y tengo {edad} años."
    print(saludo)
 
saludar("Raúl", 30)
saludar("Ana", 34)
 
saludar(50, "Lara")

Resultado en la consola

Me llamo Raúl y tengo 30 años.
Me llamo Ana y tengo 34 años.
Me llamo 23 y tengo Lara años.

Si haces lo de la última llamada, verás que pierde todo el sentido, aunque al no especificar en Python el tipo de dato, no nos da error.

No te pierdas todo el contenido de este curso y más cosas sobre Python.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

raíz linux Entrada anterior Navegación por el sistema de archivos desde la consola de Linux
visual studio code Entrada siguiente Introducción al curso de HTML, CSS y JavaScript