Clase Numero 05 – Funciones

Introducción

Hasta ahora usamos varias funciones sin saberlo; range(), str(), int(), y definimos nuestras propias al usar def main ().

Es fácil identificar una función al leer código, ya que el nombre de la función esta seguida por paréntesis () vacios o con algún argumento.

Usamos funciones para tener un código más “limpio” y organizado, para encapsular tareas repetitivas y llamarlas cuando las necesitemos.

Una ventaja fundamental de las funciones es que no necesitamos saber cómo funcionan, sino que sea correcto el valor que regrese. Esto por supuesto con funciones que no creamos nosotros, sino que ya están  definidas (srt, len, type, range, etc). Al usarlas, jamás nos interesó cómo funcionan, solo que devolvían el valor que necesitábamos.

Podemos definir nuestras propias funciones, de hecho ya lo  hicimos a lo largo del curso

La sintaxis es la siguiente

def nombre_de_mi_funcion ():
    aca_va_el_codigo_de_la_funcion

Los nombres de funciones siguen las mismas reglas que las variables, el código en su interior debe ir indentado y no existe un límite de cuantas líneas, condicionales o ciclos podamos añadir en su interior.

En Python las funciones pueden, o no, recibir argumentos con los que trabajar, así como pueden o no, regresar un valor.

Para poder utilizar una función en Python, es necesario invocarla después de haberla definido. Esto lo hacemos escribiendo su nombre seguido de parentesis. Siguiendo con el ejemplo anterior, la “llamamos” como sigue

def nombre_de_mi_funcion ():
    aca_va_el_codigo_de_la_funcion
    
nombre_de_mi_funcion ()

Ejemplo

"""
Ejercicio inicial funciones
"""

def saludo():
    print("Hola! Este print se llama desde la función saludo()")

Resultado

>>> %Run Funciones_Intro_ej_01.py
Hola! Este print se llama desde la función saludo()
>>> 

Recordar que las variables son LOCALES a la funcion y no pueden ser llamadas desde afuera

def test(): # Defino la funcion
    x = 10 # Asigno valor a variable DENTRO de la funcion

test() # invoco la funcion
print(x)#muestro la variable definida en la funcion
#Dara error proque la variable estaba definida DENTRO del ambito (local)
#de la funcion y fue llamada desde afuera

Ahora lo hacemos como corresponde

def test(): # defino la funcion
    print(x) # MUESTRO por pantalla la variable "x"

x = "Variable LOCAL" # le asigno un valor a la variable DENTRO del ambito de la funcion
test() # invoco la funcion

Resultado

>>> %Run Funciones_Intro_ej_01.py
Variable LOCAL
>>> 

Si declaramos de nuevo una variable en la función, se creará un copia de la misma que sólo funcionará dentro de la función.

Entonces NO podemos modificar una variable externa dentro de una función

Ejemplo

def test(): # defino funcion
    x = "Variable local a la funcion"  # variable que sólo existe dentro de la función
    print(x) # Muestra "x" como Variable local a la funcion

x = "Variable EXTERNA a la funcion"  # variable externa, no modificable
test() # invoco funcion
print(x) # mostrara "x" como Variable EXTERNA a la funcion

Resultado

>>> %Run Funciones_Intro_ej_01.py
Variable local a la funcion
Varaible EXTERNA a la funcion
>>> %Run Funciones_Intro_ej_01.py

Si qeremos modificar una variable externa en la función, debemos indicar que es GLOBAL de la siguiente forma:

def test():
    global x  # variable que hace referencia a la o externa
    x = "Variable declarada como GLOBAL"
    print(x) # va a mostrar Variable declarada como GLOBAL

x = "defino nuevamente la variable, pero como ya la defini como global no pasa nada"
test()
print(x) # va a mostrar Variable declarada como GLOBAL

Resultado

>>> %Run Funciones_Intro_ej_01.py
Variable declarada como GLOBAL
Variable declarada como GLOBAL

A fin de “comunicarse” con el exterior, las funciones pueden devolver valores al proceso principal (main) usando la instrucción return.

Al momento de “retornar” un valor, FINALIZA  la ejecución de la función

def test():
    return "Regresa lo que solicito con return"

test()
print (test()) # Muestra lo que "retorna" RETURN
# y se llama desde afuera de la funcion porque justamente ese
#es el objeto de return; comunicar a la funcion con el exterior

Resultado

>>> %Run Funciones_Intro_ej_01.py
Regresa lo que solicito con return
>>> 

Los valores devueltos se tratan como valores literales directos del tipo de dato retornado:

print(test()) retorna “Regresa lo que solicito con return”

Por ejemplo no podemos sumar una cadena con un número:

c = test() + 10


Mas ejemplos de Funciones

Otro ejemplo y su resultado

def saludar(nombre, mensaje): 
    print (nombre, mensaje)

saludar(mensaje="Buen día", nombre="Majuma")

Resultado

>>> %Run Funciones_Intro_ej_01.py
Majuma Buen día
>>> 

¿Y que pasa si cambio de lugar el nombre y mensaje en el Print?

def saludar(nombre, mensaje): 
    print (mensaje, nombre)

saludar(mensaje="Buen día", nombre="Majuma")

Resultado

>>> %Run Funciones_Intro_ej_01.py
Buen día Majuma
>>> 

¿Y si cambio de lugar nombre y mensaje en la invocacion (saludar(nombre=”Majuma”, mensaje=”Buen día”))?

def saludar(nombre, mensaje): 
    print (mensaje, nombre)

saludar(nombre="Majuma", mensaje="Buen día")

Resultado

>>> %Run Funciones_Intro_ej_01.py
Buen día Majuma
>>> 

Pasa que siempre “presenta” los valores de acuerdo al formateo que YO le indico mediante, en este caso, el Print. A ver, probemos algo mas:

def saludar(nombre, mensaje): 
    print (mensaje, nombre, mensaje, nombre, "\nY puedo seguir...\n",nombre, mensaje, mensaje, nombre)

saludar(nombre="Majuma", mensaje="Buen día")

Resultado

>>> %Run Funciones_Intro_ej_01.py
Buen día Majuma Buen día Majuma 
Y puedo seguir...
 Majuma Buen día Buen día Majuma
>>> 

Yo simplemento utilizo los valores de mi funcion y los presento como quiero, en este caso.

Otro ejemplo

"""Ejemplo que muestra como llamo a una
funcion desde otra y muestro x pantalla
resultados
"""


def saludo (x): #defino la funcion "saludo" y le paso como
                #argumento una variable aun sin llenar
    print (x)   #Muestro por pantalla ese valor

def concatena_doble(parte1, parte2): #defino otra funcion "concatena_doble"
                                     #con argumentos "parte1 y parte2"
    concatena = parte1 + parte2 #le asigno los argumentos a la variable "concatena"
    saludo(concatena)#invoco a la funcion "saludo" con los valores que tiene
                     #en "concatena"

parte1 = " Colegas Developers \n "#primer mensaje a mostrar
parte2 = "Esta FUNCION funciona :)"# segundo mensaje a mostrar
concatena_doble(parte1, parte2)#invoco a la funcion "concatena_doble"

Resultado

>>> %Run Funciones_Intro_ej_02.py
 Colegas Developers 
 Esta FUNCION funciona :)
>>> %Run Funciones_Intro_ej_02.py

Funciones que reciben valores

Nos permiten modificar el resultado de la función en base a los valores con los que tengamos que trabajar en ese momento.

Su sintáxis es la siguiente:

def mi_funcion(argumento_1, argumento_2, … , argumento_N):

    codigo_de_la_funcion

Donde argumentos_1, argumento_2, …, argumento_N es el valor o valores que recibe la función.

"""
Funcion que recibe valores
Funcion simple que genera un random y calcula si es par o no
y lo muestra x pantalla
"""


import random as R # importo el modulo random
numero = R.randint(1, 1000) # genero un numero aleatorio entre 1 y 1000

def es_par(numero): # defino la funcion es_par que recibira un valor

    if numero % 2 == 0: # si el modulo es cero, entonces el numero es PAR
        print(numero, "es par") # muestro que es par
    else:               # si no es 0 el numero es impar
        print(numero, "no es par") # muestro que es impar
        
es_par (numero) # invoco a la funcion

Resultado

>>> %Run ejercicio_funciones_es_par.py
719 no es par
>>> %Run ejercicio_funciones_es_par.py
897 no es par
>>> %Run ejercicio_funciones_es_par.py
996 es par
>>> %Run ejercicio_funciones_es_par.py
568 es par
>>> 

Otra forma de hacerlo

"""
Ejemplo de funcionamiento de PASANDOLE valor
desde "afuera" de la funcion e invocando esa variable (x)
"""

import random as R # importo el modulo random
x = R.randint(1, 1000) # genero un numero aleatorio entre 1 y 1000

def es_par(numero): # defino la funcion es_par que recibira un valor

    if numero % 2 == 0: # si el modulo es cero, entonces el numero es PAR
        print(numero, "es par") # muestro que es par
    else:               # si no es 0 el numero es impar
        print(numero, "no es par") # muestro que es impar
        
es_par (x) # invoco a la funcion

Resultado

>>> %Run Funciones_Intro_ej_03.py
737 no es par
>>> %Run Funciones_Intro_ej_03.py
418 es par
>>> %Run Funciones_Intro_ej_03.py
624 es par

Mas ejemplos llamando a la funcion de diversas formas

"""
Ejemplo de funcionamiento de PASANDOLE valor
para trabajar con un input e invocando esa variable
Tambien valida que entrada sea numerica y no texto
"""
def es_par(num): # defino la funcion es_par que recibira un valor
    
    numero = input ("Ingrese un valor numerico: ") # pido que ingrese un numero
    
    try:
        val = int(numero) # convierto ingreso a entero
                
        if val % 2 == 0: # si el modulo es cero, entonces el numero es PAR
            print (val, "es par") # muestro que es par
        else:               # si no es 0 el numero es impar
            print (val, "no es par") # muestro que es impar
        
    except ValueError: # si no es un valor numerico
        
        print ("Ingreso una cadena, no un numero") # muestra mensaje
        
es_par (0) # invoco a la funcion 

Resultado

>>> %Run Funciones_Intro_ej_02b.py
Ingrese un valor numerico: 43434
43434 es par
>>> %Run Funciones_Intro_ej_02b.py
Ingrese un valor numerico: 645
645 no es par
>>> %Run Funciones_Intro_ej_02b.py
Ingrese un valor numerico: sdfds
Ingreso una cadena, no un numero
>>> 

Mismo ejercicio anterior pero definiendo variable ANTES de funcion

"""
Ejemplo de funcionamiento de PASANDOLE valor
para trabajar con un input e invocando esa variable
Tambien valida que entrada sea numerica y no texto
"""

num = 0

def es_par(c): # defino la funcion es_par que recibira un valor
    
    numero = input ("Ingrese un valor numerico: ") # pido que ingrese un numero
    
    try:
        val = int(numero) # convierto ingreso a entero
                
        if val % 2 == 0: # si el modulo es cero, entonces el numero es PAR
            print (val, "es par") # muestro que es par
        else:               # si no es 0 el numero es impar
            print (val, "no es par") # muestro que es impar
        
    except ValueError: # si no es un valor numerico
        
        print ("Ingreso una cadena, no un numero") # muestra mensaje
        
es_par (num) # invoco a la funcion 

Resultado

>>> %Run Funciones_Intro_ej_02b.py
Ingrese un valor numerico: 33
33 no es par
>>> %Run Funciones_Intro_ej_02b.py
Ingrese un valor numerico: gdf
Ingreso una cadena, no un numero

Volviendo al ejemplo inicial

"""
Funcion que recibe valores
Funcion simple que genera un random y calcula si es par o no
y lo muestra x pantalla
"""


import random as R # importo el modulo random
numero = R.randint(1, 1000) # genero un numero aleatorio entre 1 y 1000

def es_par(numero): # defino la funcion es_par que recibira un valor

    if numero % 2 == 0: # si el modulo es cero, entonces el numero es PAR
        print(numero, "es par") # muestro que es par
    else:               # si no es 0 el numero es impar
        print(numero, "no es par") # muestro que es impar
        
es_par (numero) # invoco a la funcion

Nota: En la función anterior la variable numero (que recibe la función) reemplaza su valor por cualquiera que le especifiquemos entre parentesis a la función al momento de invocarla.

O sea: argumentos = comodines que varian su valor en función de los valores que pasemos.

Es importante mencionar que la función no modifica la variable que le estamos pasando, ya que genera una copia temporal que existe sólo mientras se ejecuta la función, copia sobre la cual aplica las operaciones que le indiquemos. Esta copia temporal que sólo existe dentro de la función es llamada variable local.

Comprobacion:

"""
Ejemplo de funcionamiento de variable local
"""

numero = 10 # defino valor de variable

def cuadrado(n):
  n = n * n # calculo el cuadrado de la variable
  print(n)# muestro el resultado de calcular el cuadrado

cuadrado(numero) # invoco la funcion "cuadrado" con el valor "numero"

print(numero) # muestro el valor de la variable

Resultado

>>> %Run ejercicio_funciones_variable_local.py
100
10
>>> 

Uso de variables Globales

Podemos modificar variables dentro de una función importandolas en el cuerpo de esta precedidas por la palabra global,

Para usar una variable global en una función hay que declararla previamente fuera de la función.

y = 100

def funcion_cuadrado ():
    global y
    y = y*y
    
funcion_cuadrado ()
print (y)

Resultado

>>> %Run Funciones_Intro_ej_02c.py
10000

Funciones que regresan valores

Recursos

https://docs.hektorprofe.net/python/programacion-de-funciones/definicion-y-llamada/

Leave a Reply

Your email address will not be published. Required fields are marked *