ProgramaciónPythonVLA6. Funciones

Cuando hablamos de funciones en Python nos referimos a pequeños programas los cuales podemos hacer uso es cualquier momento.

Un ejemplo más claro de este tema es la empresa de gaseosas la cual vende cinco tipos de refrescos: naranja, uva, manzana, mango, fresa.  Si la empresa necesita vender 150 refrescos de naranja, es evidente que va a necesitar un programa que se encargue de la sumatoria del producto, pero este mismo escenario se puede repetir con los otros refrescos. Es en estos casos donde vamos a utilizar las funciones. En vez de escribir el código de la sumatoria para cada refresco, vamos a crear la función sumatoria y haremos el llamado las veces que sean necesarias, sin importar lo que necesitemos sumar.

Creando nuestra primera función

Para hacer uso de una función debemos de crearla. La palabra reservada para la creación de una función es def seguidamente escribimos el nombre con el que llamaremos a la función y cerramos con ( ):

def mensaje():
    print("Bienvenido a temas de funciones")

Realizando el llamado a una función

En este punto hemos creado nuestra primera función y así ejecutamos nuestro código, no va a pasar absolutamente nada. Esto se debe a que no le hemos hecho el debido llamado a la función para su ejecución.

Para hacer el llamado a la función, debemos de escribir el nombre de la función. Con el siguiente código podrán observar el mensaje que hemos escrito en el print

def mensaje():
    print("Bienvenido a temas de funciones")
# De esta forma se llama a la funcion
mensaje()

Las funciones reciben parámetros

Las funciones pueden simplemente retornar una información, como la función que acabamos de realizar. Pero también las funciones pueden realizar operaciones matemáticas o hacer uso de variables para la implementación de condicionales. Para esto necesitamos preparar la función para que reciba parámetros y estos sean utilizados dentro de la misma.

Las funciones que reciben parámetros

Las funciones puede recibir valores de tipo String. Como podemos notar en el código hemos colocado la variable nombre  dentro de los paréntesis que están en la misma línea de la de la función.

En la segunda línea, hemos realizado un print con el mensaje Saludos y la concatenación a la variable nombre.

Como hemos habilitado la función para la recepción de un valor, a la hora de escribir el llamado debemos de incluir dentro de los paréntesis el valor para el cual a sido preparado.

A la hora de la impresión notaremos como se visualiza el mensaje de la función sumado el nombre que ha introducido el usuario.

def mensaje2(nombre):
    print("Hola " + nombre)
mensaje2("Adolfo")

Así como las funciones pueden recibir cadenas de caracteres, también pueden recibir varios valores numéricos y con esos valores implementarlos en operaciones matemáticas.

En este caso realizaremos una función que va a recibir dos valores numéricos, mismos que serán utilizados por la variable resultado para la ejecución de una suma y seguidamente el resultado se imprime por medio de un print.

En esta oportunidad podemos observar que por medio de los inputs estamos solicitando al usuario que digite los valores que se almacenarán en las variables a,b mismas que serán utilizadas dentro de la función suma.

def suma(numUno, numDos):
    resultado = numUno + numDos
    print("\\nEl resultado de la suma es: ", resultado)
a = int(input("Escriba el primer valor: "))
b = int(input("Escriba el segundo valor: "))
suma(a, b)

Nosotros podemos crear múltiples funciones y hacer el debido llama en el momento que sea necesario.

Si pensamos en un programa que nos permita seleccionar cual operación matemática desea realizar entre suma, resta, multiplicación o división. Podríamos realizar una función para cada operación y  que esta función recibe dos parámetros.

Ahora procedemos por medio de varios print a crear un menú de opción.

Seguidamente creamos un try – except

En la sección del try hemos colocado la parte del programa que corresponde a las condiciones y dentro de cada condición realizamos el llamado correspondiente a cada función.

Finalizamos con un except Exception previendo que el usuario ingrese un valor de tipo string en la selección de la operación matemática.

def suma(numUno, numDos):
    resultado = numUno + numDos
    print("\\nEl resultado de la suma es: ", resultado)
def resta(numUno, numDos):
    resultado = numUno - numDos
    print("\\nEl resultado de la resta es: ", resultado)
def multiplicacion(numUno, numDos):
    resultado = numUno * numDos
    print("\\nEl resultado de la multipliacion es: ", resultado)
def division(numUno, numDos):
    resultado = numUno / numDos
    print("\\nEl resultado de la division es: ", resultado)
print("1. Suma")
print("2. Resta")
print("3. Multiplicación")
print("4. División")
try:
    seleccion = int(input("\\nSeleccione la operación que desea realizar: "))
    a = int(input("\\nEscriba el primer valor: "))
    b = int(input("Escriba el segundo valor: "))
    if(seleccion == 1):
        suma(a, b)
    elif(seleccion == 2):
        resta(a, b)
    elif(seleccion == 3):
        multiplicacion(a, b)
    elif(seleccion == 4):
        division(a, b)
    else:
        print("\\nLa opción seleccionada no existe")
except Exception:
    print("\\nLa opción que usted ha seleccionado no es válida")

Las funciones también se pueden crear con propósitos más complejos, como lo podría ser la verificación de credenciales haciendo uso de diccionarios.

Como podemos observar tenemos la función privilegios, la cual contiene un fragmento de código para la verificación de credenciales, por otro lado tenemos la función invitado la cual proyecta simplemente un mensaje por medio de un print.

Procedemos a realizar la estructura del programa para el debido llamado del cada función dentro de las condicionales.

def privilegios():
    credenciales = {"David":"123", "Martin":"456"}
    nombre = input("\\nDigite el nombre: ")
    contra = input("Digite la contrasena: ")
    nombreVerificado = credenciales.get(nombre)
    if nombreVerificado == contra:
        print("\\nAcceso permitido")
    else:
        print("\\nAcceso bloqueado")
def invitado():
    print("\\nBienvenido a nuestra sección de invitado")
print("\\nSeleccione su condición de acceso a la plataforma: ")
print("1. Con privilegios")
print("2. Como invitado")
try:
    seleccion = int(input("\\nSelecione la operación que deseas realizar: "))
    if seleccion == 1:
        privilegios()
    elif seleccion == 2:
        invitado()
    else:
        print("\\nOpción no existe")
except Exception:
    print("\\nLa opción que usted ha seleccionado no es válida")

Funciones - Recursividad

La recursividad en programación es una técnica fundamental que permite a una función llamarse a sí misma para resolver un problema. Esta estrategia es particularmente útil para abordar problemas que pueden descomponerse en instancias más pequeñas y manejables, siguiendo la filosofía de "divide y vencerás".

Lógica no funcional de una función recursiva.

def repetir():
    repetir()
repetir()

Una función recursiva debe tener lógica de parada, si no se ejecutará indeterminadamente.

def imprimir(x):
    print(x)
    imprimir(x-1)

imprimir(5)

La función en el código mostrado tiene lógica de parada de manera que no se ejecute de manera indeterminada

def imprimir(x):
    if x>0:
        print(x)
        imprimir(x-1)

imprimir(5)

Reglas:

  1. El procedimiento se llama a sí mismo.
  2. El problema se resuelve, tratando el mismo problema pero de tamaño menor.
  3. La manera en la cual el tamaño del problema disminuye asegura que el caso base eventualmente se alcanzará

¿Porque existe?

La recursividad permite ejecutar algoritmos repetitivos pero que reduzcan el problema en cada iteración, es crear código más eficiente. Un caso práctico es el factorial de un número.

def factorial(fact):
    if fact > 0:
        valor = fact * factorial(fact-1)
        return valor
    else:
        return 1;
numero = int(input("Digite un número para calcular el factorial: "))
print(f"El factorial del número {numero} es: {factorial(numero)}")

Algoritmo para ordenar una lista de números:

def ordenar(lista, cant):
    if cant > 1:
        for f in range(0, cant-1):
            if lista[f] > lista[f + 1]:
                aux = lista[f]
                lista[f] = lista[f + 1]
                lista[f + 1] = aux
            ordenar(lista, cant-1)
datos = [60, 44, 22, 33, 2]
print(datos)
ordenar(datos, len(datos))
print(datos)

Links de interés:

Try Except

Al programar en Python algunas veces podemos anticipar errores de ejecución, incluso en un programa sintáctica y lógicamente correcto, pueden llegar a haber errores causados por entrada de datos inválidos o inconsistencias predecibles.

En Python, puedes usar los bloques try y except para manejar estos errores como excepciones.

NOTA: cuando uno no puede controlar la excepción, el try y except capta el evento y nos muestra el error técnico.

División por cero: Este bloque try-except maneja la excepción ZeroDivisionError, que ocurre cuando se intenta dividir un número por cero. En el código, se intenta dividir 5 por 0, lo cual generaría un error de división por cero.

# Que el sistema controle el error
try:
    resultado = 5 / 0
except ZeroDivisionError:
    print("No puedes dividir entre cero")
#El desarrollador trata de controlarlo
valor1 = 5
valor2 = 0
if valor2 == 0:
    print("No puedes dividir entre 0")
else:
    resultado = valor1 / valor2
    print("El resultado es: ", resultado)

Valor no numérico: En este caso, el bloque try-except maneja la excepción ValueError, la cual se genera cuando se intenta convertir un valor a un tipo numérico (como int) y el valor no es numérico. El código intenta convertir la entrada del usuario a un entero, pero si el usuario ingresa algo que no se puede convertir a un entero, se genera la excepción.

try:
    numero = int(input("Ingrese un numero: "))
except ValueError:
    print("Debes ingresar un numero valido")

Acceso a un índice fuera de rango: Aquí se maneja la excepción IndexError, que ocurre cuando se intenta acceder a un índice fuera del rango válido de una lista. En el código, se intenta acceder al cuarto elemento de una lista que solo tiene tres elementos, lo que generaría un error de índice fuera de rango.

lista = [1, 2, 3]
try:
    print(lista[4])
except IndexError:
    print("Indice fuera de rango")

Operación con tipos de datos no compatibles: Este bloque try-except maneja la excepción TypeError, que ocurre cuando se realiza una operación entre dos tipos de datos que no son compatibles. En el código, se intenta sumar un string y un entero, lo cual generaría un error de tipo.

try:
    resultado = "a" + 5
except TypeError:
    print("Operacion no valida entre el str y el int")

Apertura de un archivo inexistente: Aquí se maneja la excepción FileNotFoundError, la cual ocurre cuando se intenta abrir un archivo que no existe en el sistema de archivos. En el código, se intenta abrir un archivo llamado "archivo.txt" en modo lectura, pero como el archivo no existe, se genera la excepción.

try:
    with open("archivo.txt", "r") as archivo:
        contenido = archivo.read()
except FileNotFoundError:
    print("El archivo no existe")

Intentar convertir un string a un tipo de dato no compatible: En este caso, se maneja la excepción ValueError, que ocurre cuando se intenta convertir un string a un tipo de dato que no es compatible con su contenido. En el código, se intenta convertir el string "hola" a un entero, lo cual no es posible y genera la excepción.

try:
    valor = int("Hola")
except ValueError:
    print("No se puede convertir hola a entero")

División entre tipos de datos no numéricos: Aquí se maneja la excepción TypeError, similar al ejemplo 4, pero en este caso se intenta realizar una operación de división entre dos strings, lo cual no es una operación válida.

try:
    resultado = "a" / "b"
except TypeError:
    print("Operacion no valida entre str y str")

Acceso a una clave inexistente en un diccionario: Este bloque try-except maneja la excepción KeyError, que ocurre cuando se intenta acceder a una clave que no existe en un diccionario. En el código, se intenta acceder a la clave "c" en un diccionario que solo tiene las claves "a" y "b", generando la excepción.

diccionario = {"a":1, "b": 2}
try:
    print(diccionario["c"])
except KeyError:
    print("La clave c no existe en el diccionario")

Uso de un módulo no instalado: Aquí se maneja la excepción ImportError, que ocurre cuando se intenta importar un módulo que no está instalado o no se puede encontrar. En el código, se intenta importar un módulo llamado "modulo_inexistente", lo cual generaría la excepción si dicho módulo no existe o no está instalado.

try:
    import modulo_inexistente
except ImportError:
    print("El módulo no está instalado o no se puede importar")
Built with LogoFlowershow