viernes, 17 de octubre de 2014

Python (04) Funciones

Llegamos ya a una de las características básicas en todo lenguaje que se precie, las funciones, las cuales básicamente son partes del código que se utilizan varias veces y que pueden ser llamadas en varias ocasiones. De esta forma se ahorra el utilizar código de forma reiterativa para hacer lo mismo una y otra vez, aclarando el código y haciendo mucho más efectivo.
Para empezar a definir funciones debemos de empezar por el principio...

¿Cómo se declara una función?

Para declarar una función se utiliza la palabra reservada def,  seguida de un nombre, una lista de parámetros entre paréntesis y terminando por dos puntos.
El cuerpo de la función debe de estar indexado correctamente o de lo contrario Python nos dará un error.


Documentación

De forma opcional la siguiente parte una función es la documentación, aunque es una buena práctica hacerlo, la documentación tiene algunas convecciones sobre el contenido y el formato:
  • Siempre tiene que ir entre tres grupos de comillas dobles """ .... """
  • En la primera línea se debe de incluir un resumen corto y preciso del propósito de la función. Esta línea debe de empezar con letra mayúscula y terminar un punto.
  • La segunda debe de ir en blanco separando el resumen del resto de la descripción.
  • Las siguientes líneas deben de ser uno o más párrafos describiendo las variables, los valores de retorno, efectos secundarios...
Nota: Aunque esto es lo correcto, tan solo colocaremos esta documentación en algunas de las funciones que vamos a utilizar en este documento para ocupar menos espacio ya que se explican los ejemplos en el texto.

A continuación vemos un ejemplo de función en python:
def fib(n):
    """Esto es una prueba de Fibonacci."""
    a, b = 0, 1
    while a<n:
        print (a, end=' ')
        a, b = b, a+b
    print()

fib(100)

return

La sentencia return devuelve un valor de la función de hecho si no hay ninguna expresión return, o se alcanza el final de la función sin pasar por un return, la función devuelve none.
En el siguiente ejemplo vamos a ver como funcionan  los return dentro de una función.
def fib(n):
    result = []
    a, b = 0,1
    while a<n:
        result.append(a)
        a, b = b, a+b
    return result

f100 = fib(100)
print(f100)

Aquí vemos como en la función se declara una lista, result, a la cual se le va añadiendo el valor resultante en cada ciclo del while y finalmente se devuelve la lista con un return que es lo que muestra el print ya fuera de la función.
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]


Argumentos con valores por omisión

Podemos generar funciones que tengan un determinado número de argumentos, pero que para llamarla no haga falta enviarle todos, ya que se les puede poner algunos de ellos por omisión, es decir que vienen definidos dentro de la propia definición de la función por si no se le introducen en la llamada.
Un ejemplo de esto podría ser la siguiente función:
def pedir_confirmacion(prompt, reintentos=4, queja='Si o no, por favor!'):
    while True:
        ok = input(prompt)
        if ok in ('s', 'S', 'si', 'Si', 'SI'):
            return True
        if ok in ('n', 'no', 'No', 'NO'):
            return False
        reintentos = reintentos - 1
        if reintentos < 1:
            print('Pues le echo yo, por pelmazo')
            return True
        print(queja)

pedir_confirmacion('quiere usted salir?')

Aquí vemos como la función tiene tres argumentos, el primero es un prompt, el segundo el numero de reintentos, que si no se le envía, toma 4 como valor por defecto y una queja que introduce un mensaje de aviso.


Argumentos y palabras clave

En el siguiente ejemplo vemos como una llamada puede llevar un argumento especifico, argumentos sin clasificar y una serie de palabras clave definidas con una función, de este modo:
def pruebas(tipo, *argumentos, **palabrasclaves):
    print("-- ¿a que velocidad viaja una golondrina", tipo, "?")
    print("-- ¿La golondrina ", tipo, "lleva un coco?")
    print('ARGUMNETOS')
    for arg in argumentos:
        print(arg)
    print("-" * 40)
    print('PALABARAS CLAVE')
    claves = sorted(palabrasclaves.keys())
    for c in claves:
        print(c, ":", palabrasclaves[c])

pruebas("africana", "Err no lo se.",
             "Claro, una europea no puede hacerlo.",
             Rey="Arturo rey de lo bretones",
             Guardian="Mago del puente",
             Caballero="Sir Beldebere")

Aunque parece difícil de entender en realidad es bastante sencillo, viendo la definición de la función, se observa que hay un argumento tipo, luego *argumentos y finalmente **palabras clave, en la llamada a la función vemos las siguientes correspondencias:
  • tipo = africana (el primer argumento que se le envía)
  • * argumentos = "Err no lo se." y "Claro, una europea no puede hacerlo.", (los argumentos que no entran en las demás opciones)
  • **palabraclaves = Rey="Arturo rey de lo bretones", Guardian="Mago del puente", Caballero="Sir Beldebere") (Son las palabras clave que ya vienen definidas como si fueran variables.)
El resultado de este script es el siguiente:
-- ¿a que velocidad viaja una golondrina africana ?
-- ¿La golondrina  africana lleva un coco?
ARGUMNETOS
Err no lo se.
Claro, una europea no puede hacerlo.
----------------------------------------
PALABARAS CLAVE
Caballero : Sir Beldebere
Guardian : Mago del puente
Rey : Arturo rey de lo bretones


De este modo podemos introducir todos los argumentos arbitrarios que deseemos, y hacer que nuestras funciones trabajen sin limitaciones:
def concatenar (*args, sep='-'):
    return sep.join(args)

print(concatenar('lunes', 'martes', 'miercoles', 'jueves',
                 'viernes', 'sabado', 'domingo'))

En este ejemplo, la función tiene un numero indeterminado de argumentos y un argumento por omisión, y devuelve una cadena concatenando los argumentos con el valor de omisión sep de la siguiente forma:
lunes-martes-miercoles-jueves-viernes-sabado-domingo

Con esto ya sabemos lo suficiente de funciones como para comenzar a trabajar y hacer algunos scripts complejos, aunque aun nos falta mucho camino.

No hay comentarios:

Publicar un comentario