Semana 9: Funciones#

9.1. Definición#

Las funciones pueden ser creadas con la sentencia def:

def mi_funcion(parametros):
  #tareas-procedimimentos
  return print('¡Esto es una función!')

Las funciones tienen tres partes importantes:

  • Entradas: Lo que se le conoce como parámetros. La entrada puede no ser necesaria, puede ser un valor que viene desde el principal o puede ser un valor predeterminado.

  • Salidas: Lo que regresa la función, en algunos casos la función no regresa nada y modifica sus entradas (lo que se llama in situ).

  • Procedimiento: Las funciones son códigos más pequeños que encapsulan algo que va ser repetitivo y que usaremos dentro de nuestro código principal.

def cuadrados(a):   #Uso de la sentencia def para definir la funcion de nombre 'cuadrados'.
  a2 = a**2
  return a2     #Con el return se sentencia que la funcion entregará una salida.
a = cuadrados(-5)
print(a)
25
def cuadrados_lista(lista:list):
  lista_cuadrados = []              #Crea una lista vacía
  for i in lista:            #Define un ciclo for ingresando a los elementos de lista
    lista_cuadrados.append(i ** 2)      #Llena la lista vacía con el cuadrado de los elementos en lista.
  return lista_cuadrados            #Devuelve la lista con los elementos elevados al cuadrado.
lista = [123, 2218, 3, 4]
cuadrados_lista(lista)
[15129, 4919524, 9, 16]

9.2. Funciones recursivas#

La recursividad o recursión es un concepto que proviene de las matemáticas, y que aplicado al mundo de la programación nos permite resolver problemas o tareas donde las mismas pueden ser divididas en subtareas cuya funcionalidad es la misma. Dado que los subproblemas a resolver son de la misma naturaleza, se puede usar la misma función para resolverlos. Dicho de otra manera, una función recursiva es aquella que está definida en función de sí misma, por lo que se llama repetidamente a sí misma hasta llegar a un punto de salida.

Cualquier función recursiva tiene dos secciones de código claramente divididas:

  1. Por un lado tenemos la sección en la que la función se llama a sí misma.

  2. Por otro lado, tiene que existir siempre una condición en la que la función retorna sin volver a llamarse. Es muy importante porque de lo contrario, la función se llamaría de manera indefinida.

Una función que calcule el factorial de un número \(n\), podría ser:

def factorial_normal(n):
    factorial = 1
    i = 1
    while i <= n:
        factorial *= i
        i += 1
    return factorial

factorial_normal(5) # 120= 1x2x3x4x5
120

Dado que el factorial es una tarea que puede ser dividida en subtareas del mismo tipo (multiplicaciones), podemos darle un enfoque recursivo y escribir la función de otra manera.

def factorial_recursivo(n):
    if n == 1 or n == 0:
        return 1
    else:
        return n * factorial_recursivo(n-1)

factorial_recursivo(5) # 120 = 5x4x3x2x1
120

Otro ejemplo muy usado para ilustrar las posibilidades de la recursividad, es calcular la serie de fibonacci. Dicha serie calcula el elemento \(n\) sumando los dos anteriores n-1 + n-2. Se supone que los dos primeros elementos son 0 y 1.

def fibonacci_recursivo(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci_recursivo(n-1) + fibonacci_recursivo(n-2)

fibonacci_recursivo(6)

# 0,1,1,2,3,5,8,13,...
8

9.3. Funciones anónimas#

Las funciones lambda o anónimas son un tipo de funciones en Python que típicamente se definen en una línea y cuyo código a ejecutar suele ser pequeño. Resulta complicado explicar las diferencias, y para que te hagas una idea de ello te dejamos con la siguiente cita sacada de la documentación oficial.

“Python lambdas are only a shorthand notation if you’re too lazy to define a function.”

Lo que significa algo así como, “las funciones lambda son simplemente una versión acortada, que puedes usar si te da pereza escribir una función”

def cuadrados(a):   #Uso de la sentencia def para definir la funcion de nombre 'cuadrados'.
  a2 = a**2
  return a2
# funcion anonima
cuadrado = lambda a: a**2   #Permite definir una función de forma rápida.

cuadrado(3)
9

9.4. Ejemplos#

#Función para determinar si un número es primo o no.

def primos(n:int):    #Se define para numeros enteros mayores a 2.

  if n==1:
    return print(f'{n} sale de la definicion')
  if n==2:
    return print(f'{n} es primo')

  for i in range(2,n):
    a = 0

    if n%i == 0:
      a = 1
      return print(f'{n} no es primo, es divisible por {i}')
      break

  if a==0:
    return print(f'{n} es primo')
primos(525)
525 no es primo, es divisible por 3
def primos(n:list):    #Se define para numeros enteros mayores a 2.

  lista_primos = []
  lista_noprimos = []

  for j in n:
    for i in range(2,j):
      a = 0

      if j%i == 0:
        a = 1
        lista_noprimos.append(j)
        break

    if a==0:
      lista_primos.append(j)

  return lista_primos, lista_noprimos
primos([3,56])
([3], [56])
a,b = primos([1258,11,20,55])
b
[1258, 20, 55]
#Función que reciba 6 números y los guarde en una lista.
#Función que cree un diccionario con los datos de nombre, identificación,
# género, edad, carrera, semestre.

9.5. Ejercicios#

  1. Define una función llamada raiz_cubica que devuelva el valor de \(\sqrt[3]{x}\).

  2. Define una función que convierta grados Farenheit en grados celsius.

  3. Define una función que convierta radianes en grados.

  4. Defiune una función cuya salida sea el n-ésimo término de la serie $\(\sum_{n=1}^{∞} \frac{1}{2^{n-1}}\)\( Además, que calcule la suma desde \)n=1$ hasta ese n-ésimo elemento.

Repita estos ejercicios para una lista de valores y cree un archivo con cada lista.