Sie sind auf Seite 1von 17

5.

Funciones en Python
• Concepto de función
• Definición y utilización de funciones en Python
• Documentación de funciones
• Argumentos de una función
• Return
• *args y **kwargs
• Generadores
5. Funciones

Concepto de función en Python


 Una función es un conjunto de código con un nombre asociado, que realiza una
serie de tareas cada vez que se ejecuta.
 Las funciones suelen utilizar unos datos de entrada (parámetros o argumentos) y
siempre devuelven un valor(es) de salida.

Valores entrada Función Valores de salida


(argumentos)

 Ya hemos visto algunas funciones:

num = random.randrange(0, 10)


¿Cuál es el nombre de la función?
¿Qué valor devuelve la función?
¿Cuáles son los valores de entrada (argumentos?
¿Cómo se ejecuta la función?
5. Funciones

Definición y utilización
 Para definir una función en Python lo haremos:

def nombre_funcion(parametro1, parametro2, … ):


<código>
<código>
<código>
<código>
return valor

 Para utilizar una función, la llamaremos utilizando paréntesis

nombre_funcion(parametro1, parametro2, … )

 Podemos guardar el valor devuelto por la función en una variable

valor = nombre_funcion(parametro1, parametro2, … )


5. Funciones

Documentación de funciones
 Es siempre una muy buena idea documentar la función
def nombre_funcion(parametro1, parametro2, … ):
"""Aquí digo lo que hace la función, aunque me
parezca muy obvio"""
<código>
<código>
<código>
return valor

help(nombre_funcion)

(siempre sabremos que


hace nuestra función)
5. Funciones

Argumentos de una función


 Una función puede tener argumentos. Se especificarán dentro de los paréntesis

def saludador(nombre, saludo):


"""
Función que te saluda educadamente

Parámetros:
==========
nombre : str
Nombre de la persona
saludo : str
Saludo a utilizar
"""
print("{0} {1}, bienvenido a este curso de Python".format(saludo, nombre))

 Los argumentos deben de ir en orden o ser especificados explícitamente


>>> saludador("Vicente", "Hola")
Hola Vicente, bienvenido a este curso de Python

>>> saludador("Hola", "Vicente")


Vicente Hola, bienvenido a este curso de Python

>>> saludador(saludo = "Hola", nombre = "Vicente")


Hola Vicente, bienvenido a este curso de Python
5. Funciones

Argumentos de una función


 No podemos llamar a una función con un numero incorrecto de argumentos
 Debemos utilizar el tipo de argumento correcto para no tener ‘sorpresas’
 Python utiliza un tipado dinámico conocido comúnmente como “duck typing”.

import datetime
def get_edad(nombre, ano_nacimiento):
"""Función que calcula tu edad"""
print("Hola {0}".format(nombre))
edad = datetime.date.today().year - ano_nacimiento
print("Tienes {0} años".format(edad))

Observa que pasa en cada caso, y cuando se produce el error:


>>> edad('Vicente', 1979)
>>> edad('Vicente', 'hola')
5. Funciones

Argumentos de una función


 Podemos utilizar argumentos por defecto, especificando su valor
def saluda(nombre, saludo="Hola"):
"""Función que nos saluda"""
mensaje = saludo + ", " + nombre
mensaje += " es un placer tenerte en este curso."
print(mensaje)

Si no indicamos el parámetro saludo, se utilizará el valor "Hola"

>>> saluda("Ana")
Hola, Ana es un placer tenerle aquí.

>>> saluda("Mr Marshal", "Bienvenido")


Bienvenido, "Mr. Marshal" es un placer tenerle aquí.
5. Funciones

Return
 Sale de la función devolviendo el valor indicado
 Si no especificamos return …, la función sigue retornando un valor!

¿Podrías decir cual es la diferencia entre estas dos funciones?

def presentacion1():
"""Función educada"""
print("Hola soy una función")

def presentacion2():
"""Función educada"""
return "Hola soy una función"
5. Funciones

Return
 Una función puede tener múltiples return

def ordena(x, y):


"""Función que ordena dos números"""
if x <= y:
return x, y
else:
return y, x

¿Qué tipo de valor retorna esta función?

Cuando se devuelve una tupla [lista], podemos desempacarla al vuelo:


>>> valor = ordena(45, 34)
>>> minimo, maximo = ordena(45, 34)
5. Funciones

Return
 La instrucción return siempre fuerza la salida de la función

def saluda_alumno(alumno):
"""Función que te saluda si eres un alumno"""
alumnos = ("Vicente", "Sara", "Daniel")
if alumno not in alumnos:
return
else:
print("Hola " + alumno + " bienvenido al curso")

¿Qué pasará en cada uno de estos casos?

>>> saluda_alumno("Vicente")
>>> saluda_alumno("Sara")
>>> saluda_alumno("Joaquin")
5. Funciones

*args y **kwargs
 Si una función toma como argumento *args (lo importante es el asterisco)
significa que acepta cualquier número de argumentos "sin nombre" (non-
keyworded arguments)

def media(*args):
"""Función que calcula la media"""
acumm = 0
n = 0
for valor in args:
acumm += valor Dentro de la función, args
n += 1 se comporta como una tupla.
return acumm / n

>>> media(4, 4, 6, 7, 5, 7, 8, 9)
6.25
>>> media(15, 14.5, 14, 16)
14.875 ¿Podrías reducir las líneas
de código del ejemplo?
5. Funciones

*args y **kwargs
 Si una función toma como argumento **kwargs (lo importante son los dos
asteriscos) significa que acepta cualquier número de argumentos con nombre
"keyworded arguments".
 kwargs dentro de la función será un diccionario (podemos utilizar sus métodos
específicos):
 claves  nombres de los argumentos que toma la función (texto)
 valores  valores de cada argumento (cualquier tipo)

Prueba lo que hace la siguiente función:


def prueba(**kwargs):
"""Función ejemplo para kwargs"""
print("Elementos del diccionario: ")
n = 0
for key, value in kwargs.items():
print("Argumento {0}: key={1} ; value={2}".format(n, key, value))
n += 1
5. Funciones

*args y **kwargs
Ejemplo de utilidad de *args y **kwargs

Vamos a crear una función que dibuje una línea con el siguiente estilo por defecto:

Argumento valor
linewidth 2
color 'black'
Pero como buena función, nos
marker 'o'
permitirá cambiar cualquier
markerfacecolor '0.7' (70% gris) elemento de este estilo
5. Funciones

*args y **kwargs
Observa estas dos funciones:
5. Funciones

*args y **kwargs
x = [2, 3, 4, 5, 6, 7, 8]
y = [5, 6, 7, 6, 5, 4, 2]
[1] draw(x, y)
[2] draw2(x, y)
[3] draw2(x, y, color="blue", markerfacecolor="orange", linewidth=1)
[4] draw2(x, y, markerfacecolor="green", marker="s", linestyle="--", linewidth=0.5, markersize=4)

[1] Genera línea con estilo [2] Genera línea con [3] Cambiamos los [4] Cambiamos cualquier
por defecto de plot() nuestro estilo por defecto parámetros, clor, parámetro aceptado por
markerfacecolor, y plot, incluso sin estar
linewith a nuestro estilo definido en nuestro estilo
por defecto por defecto.
5. Funciones

Generadores
 Si una función utiliza yield en vez de return, define un objeto generador
 Al llamar a esta función, se crea el objeto generador (su código no se ejecuta)
 Un objeto generador es iterable y podemos utilizar la función next() en él
 En cada iteración del generador, cuando se encuentra un yield se "congela" el
estado de la función hasta la siguiente iteración
 Solo podemos iterar el generador una sola vez
 Llamar a next() cuando ha terminado el iterador genera un error StopIteration
5. Funciones

Expresiones generadoras
generador = (expression for item in iterable [if condition])

Ejemplo de utilidad de los generadores


f = open("data.txt") # Abre el archivo
lines = (t.strip() for t in f) # Lee lineas y quita espacios
comments = (t for t in lines if t[0] == ‘#’) # Comentarios

for c in comments:
print(c)

✓ En el ejemplo de arriba, el archivo no es leído enteramente en memoria.


✓ Las dos expresiones generadoras, van extrayendo líneas "a demanda" en el bucle for
✓ Esto puede mejorar notablemente la eficiencia si queremos extraer los comentarios de
un archivo con un tamaño de varios Gb

Das könnte Ihnen auch gefallen