En esta ocasión vamos a escribir nuestras propias funciones. Python ya tiene una lista de funciones incorporadas como print() o input() pero también podemos crear nuevas.
Las funciones son pedazos de código que se pueden reutilizar simplemente haciendo referencia a ellas. Es posible pasar argumentos a una función para que el código se ejecute en base a los valores recibidos y regrese un resultado. Dentro de la función se utiliza la palabra return para regresar un valor, si no se coloca la función regresa None al terminar de ejecutar las instrucciones dentro de ella. Una función en Python se define con el uso de la palabra reservada def. La estructura es la siguiente:
def funcion(argumentos):
instrucciones
return resultado
La función puede recibir uno, varios o ningún argumento. Las instrucciones que pertenecen a la función deben estar indentadas y se ejecutan cada vez que se llama la función. Para llamar a la función basta con escribir su nombre y poner entre paréntesis los argumentos necesarios o dejarlo vacío si no necesita ninguno. Veamos un ejemplo con una función que no recibe argumentos, incluiremos un comentarios antes de la definición y antes de la llamada.
# Definicion de la funcion
def saludo():
print("Hola")
# Llamada de la funcion
saludo()
>>> # Definicion de la funcion
>>> def saludo():
… print(«Hola»)
…
>>> # Llamada de la funcion
>>> saludo()
Hola
En el código anterior primero definimos la función llamada saludo() que imprime «Hola» y después hacemos la llamada de la función. Es importante definir la función antes de llamarla sino Python no conocerá la función y regresara un error indicando que no se ha definido la función que estamos llamando. Probemos llamando a la función despedida().
despedida()
>>> despedida()
Traceback (most recent call last):
File «<stdin>», line 1, in <module>
NameError: name ‘despedida’ is not defined
>>>
Vamos a seguir con la función saludo(), modifiquemos el ejemplo para que reciba un argumento.
# Definicion de la funcion
def saludo(nombre):
print("Hola",nombre)
# Llamada de la funcion
saludo("Taiga")
>>> # Definicion de la funcion
>>> def saludo(nombre):
… print(«Hola»,nombre)
…
>>> # Llamada de la funcion
>>> saludo(«Taiga»)
Hola Taiga
Con las modificaciones que hicimos, la función recibe un argumento que se asigna a una variable (en este caso nombre) la cual se puede usar dentro de las instrucciones de la función (como argumento para la función print()). El argumento («Taiga») se coloca en la llamada de la función.
En algunas ocasiones es posible que la función este esperando recibir un parámetro que no necesariamente se coloque cuando sea llamada. En estos casos podemos usar valores por omisión. Hagamos unos cambios a la función saludo() para que en caso de que no le pasemos el argumento al momento de llamarla utilice la cadena Python.
# Definicion de la funcion
def saludo(nombre = "Python"):
print("Hola",nombre)
# Llamada de la funcion
saludo("Taiga")
saludo()
>>> # Definicion de la funcion
>>> def saludo(nombre = «Python»):
… print(«Hola»,nombre)
…
>>> # Llamada de la funcion
>>> saludo(«Taiga»)
Hola Taiga
>>> saludo()
Hola Python
La diferencia entre una función con parámetros que cuentan con valores por omisión y una que no tiene es que e la función que no tiene asignado valores por omisión los argumentos son obligatorios y si no los colocamos recibimos un error sobre el argumento que falta. Vamos a ejemplificarlo con la función saludo() y saludo2(), una con valores por omisión y otra no.
# Definicion de las funciones
def saludo(nombre):
print("Hola",nombre)
def saludo2(nombre = "Python"):
print("Hola",nombre)
# Llamada de las funciones
saludo2()
saludo()
>>> # Definicion de las funciones
>>> def saludo(nombre):
… print(«Hola»,nombre)
…
>>> def saludo2(nombre = «Python»):
… print(«Hola»,nombre)
…
>>> # Llamada de las funciones
>>> saludo2()
Hola Python
>>> saludo()
Traceback (most recent call last):
File «<stdin>», line 1, in <module>
TypeError: saludo() missing 1 required positional argument: ‘nombre’
Podemos combinar ambos tipos en una sola función. Primero debemos colocar los argumentos obligatorios y después los que cuentan con valores por omisión. Hagamos modificaciones.
# Definicion de la funcion
def saludo(nombre, texto = "Como estas?"):
print("Hola",nombre)
print(texto)
# Llamada de la funcion
saludo("Taiga")
>>> # Definicion de la funcion
>>> def saludo(nombre, texto = «Como estas?»):
… print(«Hola»,nombre)
… print(texto)
…
>>> # Llamada de la funcion
>>> saludo(«Taiga»)
Hola Taiga
Como estas?
Si ambos argumentos contaran con valores por omisión y solo quisiéramos cambiar uno de ellos podemos especificar el argumento que queremos cambiar mediante su nombre al momento de hacer la llamada. También es posible cambiar el orden de los argumentos cuando se hace la llamada mientras usemos el nombre.
# Definicion de la funcion
def saludo(nombre = "Python", texto = "Como estas?"):
print("Hola",nombre)
print(texto)
# Llamada de la funcion
saludo(texto = "Animo!", nombre = "Taiga")
>>> # Definicion de la funcion
>>> def saludo(nombre = «Python», texto = «Como estas?»):
… print(«Hola»,nombre)
… print(texto)
…
>>> # Llamada de la funcion
>>> saludo(texto = «Animo!», nombre = «Taiga»)
Hola Taiga
Animo!
Con las funciones que hemos utilizado hasta ahorita solo se pueden pasar los argumentos que se consideran en la definición, no se pueden pasar mas. Hay una opción que permite definir una función que reciba cualquier cantidad de argumentos.
# Definicion de la funcion
def saludo(*nombre):
for i in nombre:
print("Hola",i)
# Llamada de la funcion
saludo("Taiga","Python")
saludo("Marcos","Antonio","Flor")
>>> # Definicion de la funcion
>>> def saludo(*nombre):
… for i in nombre:
… print(«Hola»,i)
…
>>> # Llamada de la funcion
>>> saludo(«Taiga»,»Python»)
Hola Taiga
Hola Python
>>> saludo(«Marcos»,»Antonio»,»Flor»)
Hola Marcos
Hola Antonio
Hola Flor
Hasta el momento no hemos especificado un valor de regreso para nuestras funciones. Vamos a incluirlo.
# Definicion de la funcion
def saludo(*nombre):
for i in nombre:
print("Hola",i)
return "Listo"
# Llamada de la funcion
llamada1 = saludo("Taiga","Python")
print("Llamada 1:", llamada1)
print("Llamada 2:", saludo("Marcos","Antonio","Flor"))
>>> # Definicion de la funcion
>>> def saludo(*nombre):
… for i in nombre:
… print(«Hola»,i)
… return «Listo»
…
>>> #Llamada de la funcion
>>> llamada1 = saludo(«Taiga»,»Python»)
Hola Taiga
Hola Python
>>> print(«Llamada 1:», llamada1)
Llamada 1: Listo
>>> print(«Llamada 2:», saludo(«Marcos»,»Antonio»,»Flor»))
Hola Marcos
Hola Antonio
Hola Flor
Llamada 2: Listo
Por cierto, habrás notado que usamos el mismo nombre de función con diferentes ejercicios. El interprete toma la ultima definición de la función que ingresemos. Por ello cada vez que colocamos la definición de la función saludo() con instrucciones distintas podíamos ver los cambios que incluíamos.
Ya estas listo para escribir tus propias funciones. En la siguiente entrada hablaremos de los módulos. Cuéntame que te ha parecido y cómo te va escribiendo tus programas con Python.