4. Funciones - manuelmarinduque/Apuntes_Python_3 GitHub Wiki

Funciones

Tomado de Funciones I. Vídeo 5

Características de las funciones

  • Conjunto de líneas de código agrupadas (bloque de código), que funciona como una unidad realizando una tarea específica (se puede dividir en subtareas).

  • Las variables definidas en su interior son de ámbito local.

  • Pueden devolver valores a través de la instrucción return, conectando la función con el exterior.

  • Pueden tener parámetros de distintos tipos, separados por comas.

    • Parámetros: Están en la definición de la función.
    • Argumentos: Están en la llamada a la función, son los valores que se le dan a los parámetros.
  • También se les denomina métodos cuando se definen dentro de una clase.

  • Su utilidad es la reutilización de código, es decir, una vez creada puede ser llamada cada vez que se necesite.

  • Función predefinida: Es proporcionada por el lenguaje.

  • Función propia: Es creada por uno mismo.

Sintaxis de una función

def nombre_funcion(parámetros):
    # Instrucciones de la función
    return valor

La función se ejecuta o se llama escribiendo su nombre seguido de paréntesis y dentro los argumentos, si tiene parámetros.

Retorno de valor

La función devuelve un valor mediante la instrucción return y para poder visualizarlo se debe usar la instrucción print():

def suma(num1, num2):
    resultado = num1 + num2
    return resultado

print(suma(5,9))

También se puede almacenar en una variable el valor que retorna o devuelve una función:

def suma (num1, num2):
    resultado = num1 + num2
    return resultado

valor_retornado = suma(5,9)

print(valor_retornado)

Retorno de varios valores

Tomado de 043. Retorno de valores. Curso Python 3 Udemy

Una función puede retornar varios valores. Al llamar la función retorna una tupla con dichos valores, que para ser porteriormente manipulados se hace desempaquetado de tuplas. (Ver archivo de Tuplas):

def lista_retorno():
    return "Hola", 1230, [0,1,2,3]

cadena, entero, lista = lista_retorno()

print(cadena)
print(entero)
print(lista)

Paso de argumentos por valor en memoria y por referencia en memoria

Tomado de 046. Argumentos por valor y referencia. Curso Python 3 Udemy Fuente de complemento: identificadores

Los argumentos que recibe una función pueden ser:

  • Directos: Se especifica el argumento o valor del parámetro al llamar la función.

  • Variables: En este caso, se genera una copia de tal variable dentro la función, operando con ella y sin afectar el valor de la variable original. Por tanto, hay un paso de argumento por valor en memoria.

# Paso de argumento por valor:
def doblar_valor(n):
    return n*2

numero = 4
# el parámetro n es una copia del argumento numero:
doblar_valor(numero)
# por lo que numero no se ve afectado por la función:
print(numero)
# Salida: 4
  • Estructuras como listas, tuplas, dicccionarios y conjuntos; también objetos: En este caso, la función opera con la estructura original afectando el valor de sus elementos. Por tanto, hay un paso de argumento por referencia en memoria.
# Paso de argumento por referencia:
def doblar_valor(l):
    for i,n in enumerate(l):
        l[i] = n*2

# el parámetro l es el argumento ns original:
ns = [2,4,5,8,9]
doblar_valor(ns)
# por lo que ns se ve afectado por la función:
print(ns)
# Salida: [4, 8, 10, 16, 18]

No es posible indicar a Python cuándo se ingresa un argumento por valor o referencia. En otros lenguages de programación es posible al utilizar punteros. Aunque en Python se puede simular al emplear trucos: creando una copia de la estructura; asignando a la variable original el retorno de la función que emplea su copia.

Asignar valores por defecto a los parámetros de una función

Tomado de 045. Argumentos y parámetros. Curso Python 3 Udemy

Al llamar a una función y no se le pase la totalidad de sus parámetros se genera un error. Para que no resulte dicho error y se pueda omitir varios parámetros estos deben tener un valor por defecto, especificado en la definición de la función:

def suma (num1=0,num2=0,num3=0,num4=0):
    return num1+num2+num3+num4

print(suma())
print(suma(5,6))
print(suma(9+6+3+2))

La función debe poder operar con los valores por defecto, por lo que a veces se deben hacer algunas validaciones:

def resta(num1=None, b=None):
    if a == None or b == None:
        print("Error!, debes ingresar un valor entero)
        return
    else:
        return num1-num2

print(resta())
# Salida: "Error!, debes ingresar un valor entero

Ingreso de argumentos por clave y valor

Tomado de 045. Argumentos y parámetros. Curso Python 3 Udemy

Al llamar a una función los argumentos concuerdan en posición con los parámetros, pero esto no es del todo exacto en Python. Al pasar argumentos por clave y valor, que corresponden con el nombre del parámetro y su valor dado (el argumento), dicha concordancia deja de ser un problema. Este tipo de ingreso de argumentos se utiliza en interfaces gráficas.

Ejemplo

La resta no es conmutativa, por lo que restar dos números en diferente orden no da el mismo resultado:

def resta(num1, num2):
    return num1-num2

print(resta(5,3))
print(resta(num1=5,num2=3))
# Con clave y valor no hay dependencia de posición entre el argumento y el parámetro:
print(resta(num2=3,num1=5))

Número indeterminado de parámetros

Tomado de 047. Argumentos indeterminados. Curso Python 3 Udemy

Existen dos maneras de enviar argumentos a una función y dependiendo de cada una se gestiona diferente los argumentos indeterminados:

  • Argumentos corrientes: Se indica en la zona de parámetros de la función un parámetro iterable precedido por un asterisco, por convención su nombre es args: *args. Este parámetro dentro de la función se toma como una tupla.

  • Argumentos por clave y valor: Se indica en la zona de parámetros de la función un parámetro iterable precedido por dos asteriscos, por convención su nombre es kwargs: **kwargs. Este parámetro dentro de la función se toma como un diccionario.

Si una función recibe los anteriores tipos de parámetros iterables, cuando se llame, sus argumentos se pasan en orden: primero los correspondientes con *args y luego los correspondientes con **kwargs:

Ejemplo

def super_funcion(*args, **kwargs):

        suma = 0
        for i in args:
                suma += i
        print ("La suma de los argumentos es {}".format(suma))
        
        for i,item in enumerate(kwargs):
                print("Item {} de los argumentos clave es: {} {}".format(i,item, kwargs[item]))

# Argumentos correspondientes con  _*args_ y luego los correspondientes con _**kwargs_:
super_funcion(4,5,8,6,nombre="Manuel",edad="21")

# Salida:
# La suma de los argumentos es 23
# Item 0 de los argumentos clave es: nombre Manuel
# Item 1 de los argumentos clave es: edad 21

La definición en una función de un número indeterminado de parámetros se utiliza en la sobreescritura de métodos de clases en POO y al crear decoradores.

⚠️ **GitHub.com Fallback** ⚠️