Programación en Python

0 de 19 lecciones completas (0%)

Programación en Python – Módulo 5 – Funciones

Lección 12 – Definición y llamada de funciones

Esta es una vista previa de la lección

Compra el curso, o accede si ya te has inscrito, para acceder a esta lección.

En Python, una función es un bloque de código reutilizable que realiza una tarea específica. Existen algunas funciones que vienen ya en Python, por ejemplo la función print() que ya conoces. También hay funciones que puedes crear. Esto significa que estarás creando un bloque de código que vas a dejar «guardado» y que no se va a ejecutar hasta que lo llames. Este tipo de función está definida con la palabra clave def, seguida del nombre de la función, paréntesis que pueden contener parámetros y dos puntos. Aquí hay un ejemplo básico de una función:

# Definimos la función
def saludar(nombre):
    print(f"Hola, {nombre}!")

# Llamada a la función
saludar("Juan")

Este ejemplo define una función llamada saludar que toma un parámetro nombre y imprime un saludo utilizando ese nombre. Al llamar la función con «Juan» como argumento, se imprime «Hola, Juan!».

Escribir funciones, en cualquier lenguaje de programación no solo en Python. Nos permite separa nuestro código en varios documentos, lo que hace más fácil que leamos lo que hae determinada línea de código. Otro beneficio es que cuando necesitemos hacer un cambio en el código, basta con ir al archivo donde tengamos la definición de la función y hacer el cambio necesario. De otra forma sin funciones tendríamos que ir línea por línea buscando donde hacer el cambio.

Parámetros y argumentos

El poder de las funciones viene de los argumentos. Son variables que puedes enviar a la función de forma que ésta utilice su valor en el bloque que le pertenece. En el ejemplo que vimos arriba, cuando llamamos la función saludar lo hacemos con el valor «Juan». Pero bien podemos llamar a la función otra vez y ponerle otro valor, otro argumento, y la función lo va a trabajar dentro de su lógica interna con el parámetro nombre. Estas fueron muchas palabras, veamos algo de código:

# Definimos la función
def saludar(nombre):
    print(f"Hola, {nombre}!")

# Llamada a la función
saludar("Juan")
saludar("Laura")

Y cuando corremos el programa tenemos el siguiente resultado:

En Python, los parámetros y los argumentos son conceptos clave al trabajar con funciones:

  1. Parámetros:
    • Son variables utilizadas en la definición de la función.
    • Actúan como marcadores de posición para los valores que la función espera recibir cuando se llama.
    • Definidos dentro de los paréntesis en la declaración de la función.
    Ejemplo:
def saludar(nombre):  # 'nombre' es un parámetro
    print(f"Hola, {nombre}!")

  1. Argumentos:
    • Son los valores reales que se pasan a una función durante su llamada.Corresponde a los valores concretos que se asignan a los parámetros de la función al invocarla.

Ejemplo:

saludar("Juan")  # 'Juan' es un argumento pasado al parámetro 'nombre'

Ambos conceptos son esenciales para la comunicación entre el llamado de la función y la función misma. Los parámetros definen lo que la función espera recibir, y los argumentos son los valores reales que cumplen con esas expectativas durante la llamada a la función.

Funciones con múltiples argumentos

Cuando una función en Python tiene múltiples parámetros, significa que puede recibir varios valores al ser llamada. Como ya vimos, los parámetros actúan como variables locales dentro de la función. Los argumentos son los valores concretos que se asignan a esos parámetros al llamar la función.

Ejemplo de función con múltiples parámetros:

#la función suma tiene dos parámetros (a y b)
def suma(a, b):
    resultado = a + b
    return resultado

# Llamada a la función con múltiples argumentos
resultado_suma = suma(3, 5)

En este ejemplo, la función suma tiene dos parámetros (a y b). Al llamar la función con suma(3, 5), se están proporcionando dos argumentos (3 y 5), que se asignarán a a y b respectivamente. Si corres este código verás el resultado esperado:

Pero si intentas llamar la función con más argumentos o con menos, con una cantidad de argumentos que no se corresponda con los parámetros tendrás un error.

Y cuando intentas ejecutar el código la consola también te da el error «suma() takes 2 positional arguments but 3 were given».

Esto es fácil de resolver, solo tienes que recordad que tus argumentos deben corresponderse a los parámetros que definiste en la función.

# Llamada a la función con múltiples argumentos
resultado_suma = suma(3, 5)
print(resultado_suma)

Argumentos opcionales

En Python, los argumentos opcionales en funciones permiten mayor flexibilidad al llamarlas. Puedes asignar un valor por defecto a un parámetro, convirtiéndolo en opcional. Cuando llamas a la función, si no proporcionas un valor para ese parámetro, se utilizará el valor por defecto.

# El parámetro saludo es opcional
def saludar(nombre, saludo="Hola"):
    print(f"{saludo}, {nombre}!")

# Llamadas a la función con argumento opcional
saludar("Juan")  # Salida: Hola, Juan!
saludar("Maria", "Buenos días")  # Salida: Buenos días, Maria!

En este ejemplo, «saludo» es un parámetro opcional con el valor por defecto «Hola».

Argumentos nombrados

En Python, los argumentos nombrados en las funciones permiten pasar valores a través de sus nombres, lo que ofrece claridad y flexibilidad al llamar a una función. Puedes asignar un valor a un parámetro específico al proporcionar su nombre seguido del valor al llamar a la función.

# El parámetro saludo es opcional
def saludar_opcional(nombre, saludo="Hola"):
    print(f"{saludo}, {nombre}!")
  
# Argumentos nombrados
saludar_opcional(saludo="Hello, my darling", nombre="María")

De esta forma se puede cambiar el orden de los argumentos y el código funcionará igual.

saludar_opcional(nombre="María", saludo="Hello, my darling")

Xargs

En Python, puedes utilizar *args como parámetro de una función para permitir que esta reciba un número variable de argumentos posicionales. Para esta clase haré un nuevo archivo xargs.py y allí guardaré mi código.

def ejemplo_args(*args):
    for arg in args:
        print(arg)

ejemplo_args(1, 2, 3)  # Imprime: 1 2 3

Esto permite pasar cualquier cantidad de argumentos a la función, los cuales se recogen en una tupla.

xargs en Python ejecución del programa

Ahora veamos otro ejemplo, nuestro argumento en xargs puede tomar varios valores y esto funciona como un iterable, una colección de valores que pueden recorrerse uno por uno para realizar alguna tarea.

def suma(*numeros):
    resultado = 0
    for numero in numeros:
        resultado += numero
    print(resultado)

suma(3, 2, 6)
suma(1, 3)
suma(2, 8, 9, 6, 52, 100)

Este xarg *numeros, nos permite tomar cualquier cantidad de números y asignarla como argumento dentro de la función. En la función tomaremos este valor, esa colección de números y la recorreremos en un for loop para ir sumando todo en un acumulador, en la variable resultado, para después al final imprimir el acumulador con la suma de todos los números.

Kwargs

Los Kwargs o Keyword arguments nos permiten «empaquetar» nuestros parámetros en uno solo. **kwargs se utiliza como un parámetro especial en funciones para aceptar un número variable de argumentos con nombres o palabras clave.

def ejemplo_kwargs(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

ejemplo_kwargs(nombre="Juan", edad=25, ciudad="Aguascalientes")  # Imprime: nombre: Juan, edad: 25, ciudad: Aguascalientes

Esta forma de acceder a los valores de **kwargs con un for y usando key y value para recorrer los valores en la colección de datos lo veremos más adelante cuando estudiemos los diccionarios. Por ahora solo estudia el código y esto te lo explicaré después.

Veamos otro ejemplo. Haremos una función que llamaré obtener_producto. El código de esta lección lo guardaré en kwargs.py. En obtener_producto usaré un parámetro que llamaremos **datos. Esto nos obligará a usar keyword arguments o kwargs cuando mandemos a llamar a nuestra función.

def obtener_producto(**datos):
    print(datos)

obtener_producto(id="id")

Esta salida tiene formad de diccionario. Todavía no vemos ese tipo de dato, pero por ahora debes saber que en un diccionario los valores se guardan en pares key:value.

Al igual que con los *args, con los **kwargs podemos meter cualquier número de argumentos a la función, siempre con la forma key=value.

Return

En Python, la declaración return se utiliza en funciones para finalizar la ejecución de la función y devolver un valor opcional al lugar desde donde se llamó la función.

def suma(a, b):
    resultado = a + b
    return resultado

resultado_suma = suma(3, 5)
print(resultado_suma)  # Imprime: 8

En este ejemplo de código llamamos la función suma con dos valores, 3 y 5 que se suman y pasan a la variable resultado. Desde allí el valor en resultado se retorna desde la función por lo que podemos usarla dentro de la variable resultado_suma.

Omisión del valor de retorno

Si no se proporciona un valor con return o si se omite, la función devuelve None por defecto.

def saludar(nombre):
    print(f"Hola, {nombre}!")

saludo = saludar("Juan")
print(saludo)  # Imprime: Hola, Juan! \n None

La función saludar no tiene un return explícito, por lo que devuelve None.

Alcance

En Python, el alcance de las variables se define por su ubicación en el código, ya sea dentro de funciones o a nivel global. Aquí tienes una explicación con ejemplos:

  1. Alcance Local (Dentro de Funciones):
    • Las variables definidas dentro de una función tienen un alcance (contexto) local y solo son accesibles dentro de esa función.
    • Ejemplo de código:
def ejemplo_funcion():
    variable_local = "Hola, soy local"
    print(variable_local)

ejemplo_funcion()  # Imprime: Hola, soy local
# print(variable_local)  # Esto generaría un error, la variable no está definida fuera de la función

La variable variable_local solo es válida dentro de la función ejemplo_funcion.

  1. Alcance Global:
    • Las variables definidas fuera de las funciones tienen un alcance (o contexto) global y son accesibles en todo el programa.
    • Ejemplo de código:
variable_global = "Hola, soy global"

def ejemplo_funcion():
    print(variable_global)

ejemplo_funcion()  # Imprime: Hola, soy global
print(variable_global)  # También es accesible aquí fuera de la función

La variable variable_global es válida tanto dentro como fuera de la función.

Ejercicio: Identifica si es palídromo o no

Un palíndromo es una palabra, frase o secuencia de caracteres que se lee igual de izquierda a derecha que de derecha a izquierda. Es decir, mantiene la misma secuencia de letras o elementos al invertir su orden. Este término proviene del griego «palin» (de nuevo) y «dromein» (volver), lo que significa «que vuelve a recorrer».

Ejemplos comunes de palíndromos incluyen palabras como «reconocer» o frases como «Anita lava la tina». La característica principal de un palíndromo es que su lectura no cambia aunque se lea en sentido inverso.

Ejemplos:

  • Amo la paloma
  • Anita lava la tina
  • Luz azul
  • Lavan esa base naval
  • Sometamos o matemos

Para este ejercicio vamos a crear una función que te diga si determinado string es palíndromo. Mi solución está en el archivo ejercicio_palindromo.py, pero antes de que vayas a revisar intenta resolverlo por tu cuenta. Hasta este punto ya tienes todo lo necesario para resolverlo, y si algo falta siempre está Google (es el pan de cada día del programador).

Te daré algunas pistas sobre cómo lo resolví:

  • Piensa cómo revertir la cadena de texto (¿Puedes recorrer la cadena carácter por carácter o Python tiene un modo más directo de hacerlo? Google it)
  • Piensa cómo gestionar el que algunas palabras empiecen con mayúscula
  • Por ahora ignora los acentos
  • Tu programa debe gestionar bien los espacios de palíndromos como «Lavan esa base naval»
  • Por ahora no usaes palídromos con coma (aunque puntos extra si tu programa gestiona esta puntuación)

Ahora, si quieres aquí puedes parar y ver si puedes resolver el ejercicio. Si quieres una base para inciar puedes tomar este código:

def cadena_palindromo(cadena):
    # Aquí tu código


print(cadena_palindromo("Amo la paloma"))
print(cadena_palindromo("Anita lava la tina"))
print(cadena_palindromo("Luz azul"))
print(cadena_palindromo("Lavan esa base naval"))
print(cadena_palindromo("Sometamos o matemos"))
print(cadena_palindromo("Esto no es palindromo")) # Debe dar False

Ahora mi solución

Primero busqué cómo revertir el orden de una cadena de texto. Después de navegar un rato di con una solución que me gustó porque es «elegante». Pude haber echo un loop, recorrer la cadena de texto e ir metiendo todo en un acumulador de forma que quede «al revéz», pero me pareció mejor resolverlo en unas pocas líneas de código.

Como ya vimos, en los strings de Python podemos hacer slices (rebanadas) tomar segentos de la cadena de texto con una notación sencilla:

string[start:stop:step]

Entonces, para invertir una cadena con slices usamos un índice negativo:

# Definir una cadena
mi_cadena = "Python"

# Invertir una cadena
cadena_invertida = mi_cadena[::-1]  # Devuelve "nohtyP"

Ahora necesito una forma de deshacerme de los espacios en la cadena de texto. Una vez más, buscando en Google di con este método:

string.replace(" ", "")

Esto resuelve el tema de los espacios, pero ¿qué hacemos con las mayúsculas como la «L» de «Luz azul»? Eso ya lo vimos, podemos usar lower().

Entonces cuando ponemos todo junto dentro de nuestra función queda así:

def cadena_palindromo(cadena):
    cadena_reversed = cadena[::-1].replace(" ", "").lower()
    return cadena.replace(" ", "").lower() == cadena_reversed


print(cadena_palindromo("Amo la paloma"))
print(cadena_palindromo("Anita lava la tina"))
print(cadena_palindromo("Luz azul"))
print(cadena_palindromo("Lavan esa base naval"))
print(cadena_palindromo("Sometamos o matemos"))
print(cadena_palindromo("Esto no es palindromo"))

  1. La función cadena_palindromo toma una cadena como argumento.
  2. cadena_reversed se obtiene invirtiendo la cadena, eliminando espacios y convirtiéndola a minúsculas.
  3. Se compara la cadena original (sin espacios y en minúsculas) con la cadena invertida.
  4. Si son iguales, la función devuelve True, indicando que la cadena es un palíndromo.

En las siguientes lecciones veremos las colecciones de datos en Python: listas, tuplas y diccionarios.

Scroll al inicio