Funciones en Python

Generalidades

numeros = [5, 9, 2, 10, 7]

maximo = numeros[0]

for num in numeros:
    if num > maximo:
        maximo = num

No puedo reutilizar ese código sin copiar/pegar/meterlo en un ciclo

Toca copiarlo, si lo pongo en un if/for me toca sangrarlo, etc.

¿para qué funciones?

  • Permite reutilizar un segmento de código en otras partes de mi programa
  • Encapsula un segmento de código:
    • Separa las variables de la función, de las variables del resto de mi programa

anatomía y uso básico de funciones

Paso 1: definir la función:

def obtener_maximo(numeros):

    maximo = numeros[0]

    for num in numeros:
        if num > maximo:
            maximo = num

    return maximo
  • decido cómo se llama la función
    • def obtener_maximo
  • decido qué variables recibe y cómo se llaman
    • (numeros):
    • (x, y, z):
  • escribo el código (cuerpo) de la función
  • decido si necesito sacar algún dato de la función, o no
    • return maximo
    • return [max1, max2]

Paso 2: usar (llamar) la función

precios = [5, 9, 2, 10, 7]
mas_caro = maximo(precios)
print('el más caro es', mas_caro)

definición vs. ejecución - ejercicio

# celda 1
print("definiendo f1")

def f1():
    print("ejecutando f1")

# celda 2
print("definiendo f2")

def f2():
    print("ejecutando f2")

# celda 3
f2()
f1()
f2()
  • hipotetice cuál será la salida de ejecutar todas las celdas (Ctrl+F9)
  • compruebe su hipótesis

ejercicio - una función es una variable

Examine qué pasa al ejecutar el siguiente código en una nueva celda:

f1

vs.

f1()

ejercicio - raíz de polinomios

Tome el código que escribimos hace millones de años para sacar raíces y conviértalo en una función:

  • Que recibe tres datos de entrada, los coeficientes
  • Y retorna una, cualquiera, de las dos raíces

Llame la función con distintos coeficientes para comprobar su funcionamiento correcto.

Alcance de nombres

Variables dentro y fuera de funciones

x = 0

def f1():
    x = 1
    print('en f1:', x)

def f2():
    x = 2
    print('en f2, antes de llamar f1', x)
    f1()
    print('en f2, después de llamar f1', x)

print('antes de llamar f2', x)

f2()

print('después de llamar f2', x)

cada función tiene sus propias variables, y no interfieren

  • con las variables de otras funciones
  • ni con las variables globales (las del nivel principal)

Argumentos

Argumentos y nombres de variables

def obtener_maximo(numeros):

    maximo = numeros[0]

    for num in numeros:
        if num > maximo:
            maximo = num

    return maximo
precios = [5, 9, 2, 10, 7]
mas_caro = maximo(precios)
print('el más caro es', mas_caro)

Por orden y por nombre

def saludar(saludo, nombre):
    print('¡', saludo, nombre, '!')
saludar('Javier', 'Hola')

saludar('Hola', 'Javier')
saludar(nombre='Javier', saludo='Hola')

Llamadas a funciones como argumentos

def obtener_maximo(numeros):

    maximo = numeros[0]

    for num in numeros:
        if num > maximo:
            maximo = num

    return maximo

def mult(x, y):
    return x * y
precios_pasajes = [20, 38, 15, 48]

mayor_pasaje = obtener_maximo(precios_pasajes)

presupuesto_semana = mult(7, mayor_pasaje)
precios_pasajes = [20, 38, 15, 48]

presupuesto_semana = mult(7, obtener_maximo(precios_pasajes))

ejercicio - funciones como argumentos de funciones

Cree una función mult, que calcule la multiplicación de sus dos argumentos

Use únicamente llamadas a la función (sin variables), para calcular:

  • 2 * 3 * 4 * 5
  • 2^10

Valores de retorno

Valores de retorno

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

total = suma(12, 20)
print(total)
def suma(a, b):
    resultado = a + b
    return resultado

total = suma(12, 20)
print(total)

None

Es un valor usado para denotar la ausencia de un valor.

Examine qué resultado obtiene con las siguientes operaciones:

  • None solito en una celda
  • print(None)
  • 1 + None
  • "hola" + None

Múltiples puntos de retorno

def es_par(numero):
    if numero % 2 == 0:
        return True
    else:
        return False

None en la práctica

from math import sqrt

def raices_pol(a, b, c):
    det = (b * b) - (4 * a * c)

    if det < 0:
        # no hay raíces reales
        return None

    return [
        (-b + det) / (2 * a),
        (-b - det) / (2 * a),
    ]
raices = raices_pol(1, 0, 1)

if raices is None:
    print('eeeh, no hay raíces')
else:
    print(
        'las raíces son',
        raices[0],
        'y',
        raices[1]
    )

ejercicio - máximo y mínimo

Escriba una función que:

  • Reciba una lista de números
  • Entregue como resultado
    • Una pareja [maximo, minimo] con los valores esperados
    • None, si la lista está vacía

Funciones y archivos