Si consideramos la siguiente función
# la función siguiente efectua la suma entre dos números
def suma(a,b):
resultado = a + b
print(resultado)
suma(1,1)
2
notemos que en la sección correspondiente a las instrucciones hemos declarado una variable que almacene la suma y después hemos imprimido el resultado utilizando print()
. Ahora bien, si deseamos modificar de alguna forma la variable resultado
tendríamos que recurrir a modificar la función misma, lo cual no sería lo recomendado. Para ello emplearemos el comando return
el cual ejecutará las instrucciones que asignemos a la función sin la necesidad de declarar una variable para el resultado. Por ejemplo
def suma(a,b):
return a + b
# llamemos a la función
suma(1,1)
# o alternativamente
print("Suma:", suma(1,1))
2
Por otro lado, además de utilizar return
en las instrucciones de la función podemos emplear condicionales y bucles como lo hemos aprendido hasta ahora. Por ejemplo podemos crear una función que, de acuerdo a la nota obtenida en un examen por un alumno, indique si dicho estudiante ha pasado el examen o no
# creamos la función:
def calificador(nota):
if nota > 0 and nota < 6:
print("El estudiante ha reprobado")
elif nota >= 6 and nota <= 8:
print("El estudiante ha aprobado con una buena nota")
else:
print("El estudiante ha aprobado con una excelente nota")
# invocamos la función
calificador(7)
El estudiante ha aprobado con una buena nota
una alternativa interesante al código de la función calificador
utilizando return
puede ser
def calificador(nota):
mensaje = ''
if nota > 0 and nota < 6:
mensaje = "El estudiante ha reprobado"
elif nota >= 6 and nota <= 8:
mensaje = "El estudiante ha aprobado con una buena nota"
else:
mensaje = "El estudiante ha aprobado con una excelente nota"
return mensaje
# invocamos la función
calificador(9)
'El estudiante ha aprobado con una excelente nota'
o también
def calificador(nota):
if nota > 0 and nota < 6:
return "El estudiante ha reprobado"
elif nota >= 6 and nota <= 8:
return "El estudiante ha aprobado con una buena nota"
else:
return "El estudiante ha aprobado con una excelente nota"
# invocamos la función
calificador(10)
'El estudiante ha aprobado con una excelente nota'
Podemos entender de manera más sencilla el comando return
si recordamos el funcionamiento de break
cuando trabajamos el bucle while
, pues éstos básicamente actúan de manera muy similar.
Al crear una función y definirla con parámetros estamos condicionados a que, al llamar la función, declaremos los parámetros que deseamos asignar a la función. Por ejemplo, anteriormente hemos creado la función calificador()
de modo que reciba una nota para que ésta pueda accionar, esto es, al invocar la función utilizamos calificador(7)
, calificador(9)
, etcétera (donde declaramos como parámetro el número 7 y 9 respectivamente para accionar la función). Sin embargo, si empleamos
calificador()
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-12-8642049b2044> in <module> ----> 1 calificador() TypeError: calificador() missing 1 required positional argument: 'nota'
obtenemos un error pues por cómo construimos la función debemos de asignarle forzosamente un parámetro. Para evitar este tipo de errores podemos colocar un valor por defecto a los parámetros para que la función actúe aún si nosotros no le asignamos algún parámetro. Por ejemplo, nuevamente consideremos la función
def suma(a,b):
return a + b
y asignemos algún valor por defecto a ambos parámetros, digamos por ejemplo que a = 0
y b = 0
:
def suma(a = 0,b = 0):
return a + b
# probemos la función sin asignar parámetros
suma()
0
donde al no asignar valores a los parámetros, por defecto, se ha efectuado la suma $0+0=0$. No obstante
# probemos la función asignando parámetros
suma(1,2)
3
si asignamos valores a los parámetros entonces no hay necesidad de recurrir a los valores por defecto. También puede presentarse el caso en que no asignamos un valor a algún parámetro
# probemos la función asignando sólo parámetros
suma(1)
1
donde se ha efectuado la suma $1+0=1$ pues al no asignar un valor para el parámetro correspondiente a b
se ha optado por utilizar el valor por defecto que le hemos asignado.
En muchos casos puede ocurrir que no sepamos el número exacto de parámetros que pasaremos a una función. Para ello podemos agregar un parámetro general que actúe sin importar exactamente el número de parámetros que sean ingresados en nuestra función. Para ello utilizaremos un *
seguido del nombre del parámetro general (o variable). Automáticamente Python considerará a ese parámetro variable como una tupla, por lo que podemos aplicar lo que hemos aprendido sobre ellas. Por ejemplo podemos crear una función que salude las personas de cierto club cuyos integrantes son 'Luis', 'Juan', 'Eduardo'
:
# creamos la función
def clubMiembros(*nombres):
for nombre in nombres:
print('Hola', nombre)
# llamamos a la función
clubMiembros('Luis', 'Juan', 'Eduardo')
Hola Luis Hola Juan Hola Eduardo
Si después de un tiempo un nuevo miembro ingresa a dicho club podemos volver a utilizar la función sin la necesidad de modificar algo
clubMiembros('Luis', 'Juan', 'Eduardo', 'Leslie')
Hola Luis Hola Juan Hola Eduardo Hola Leslie
Otro ejemplo que podemos trabajar es efectuar la suma de todos los números que sean ingresados en una función, notemos que en este caso el número de parámetros es variable por lo que debemos de utilizar *
:
# Alternativa 1
# Creamos la función
def sumaNumeros(*numeros):
return sum(numeros)
sumaNumeros(1,2)
3
Dado que los parámetros que ingresemos en la función serán asigandos a una tupla denominada numeros
, entonces nosotros podemos utilizar la función predefinida sum()
que realiza la suma de todos los elementos dentro de una tupla, consiguiendo así el resultado que buscabamos.
# Alternativa 2
# Creamos la función
def sumaNumeros(*numeros):
# inicializamos dos variables en cero
i = 0 # para recorrer los elementos de la tupla con el bucle while
x = 0 # para almacenar el valor de la suma
while i <= len(numeros)-1 and i >=0:
x = x + numeros[i]
i += 1
return x
sumaNumeros(1,2)
3
# ¿Qué podría modificarse del código anterior para obtener la multiplicación
# de todos los elementos dentro de la tupla creada por los parámetros?
Ahora bien, si en lugar de tener una tupla, que se crea con los parámetros de una función, deseamos ingresar un diccionario como parámetro, debemos de utilizar doble asterisco en ves de uno. Además, cuando ingresemos los parámetros las llaves deben ir sin comillas y en vez de usar :
utilizaremos =
. Por ejemplo
# Creamos la función
def element(**terminos):
# veremos todos los elementos de nuestro diccionario
for llave, valor in terminos.items():
print(f'{llave}: {valor}')
# llamamos a la función
element(Au = 'Oro', H = 'Hidrógeno', Mg = 'Magnecio', Ag = 'Plata')
Au: Oro H: Hidrógeno Mg: Magnecio Ag: Plata
y de hecho no tendremos problemas si no pasamos argumentos a la función:
print(element())
None
Es por ello que podemos trabajar, hasta ahora, con funciones que reciban tres tipos de parámetros (fijos, *variables,**diccionarios)
. También está la posibilidad de pasar una tupla o una lista de manera directa al parámetro de una función.