Tutorial de funciones de Python
Las funciones son una parte esencial del lenguaje de programación Python: es posible que ya hayas encontrado y utilizado algunas de las muchas y fantásticas funciones integradas en el lenguaje Python o que vienen con su ecosistema de bibliotecas. Sin embargo, como científico de datos, tendrás que escribir constantemente tus propias funciones para resolver los problemas que te planteen tus datos.
Practica la escritura de funciones Python con este ejercicio práctico o prueba el curso Herramientas de Python para la ciencia de datos (parte 1) de DataCamp
Ejecute y edite el código de este tutorial en línea
Ejecutar códigoFunciones en Python
Las funciones se utilizan en programación para agrupar un conjunto de instrucciones que quieres utilizar repetidamente o que, debido a su complejidad, es mejor que estén contenidas en un subprograma y que se invoquen cuando sea necesario. Eso significa que una función es un fragmento de código escrito para realizar una tarea determinada. Para llevar a cabo esa tarea específica, la función puede necesitar o no varias entradas. Cuando se realiza la tarea, la función puede o no devolver uno o más valores.
En Python hay tres tipos de funciones:
- Funciones integradas, como
help()
para pedir ayuda,min()
para obtener el valor mínimo,print()
para imprimir un objeto en el terminal... Tienes un resumen con más funciones de este tipo aquí. - Funciones definidas por el usuario (UDF), que son funciones que los usuarios crean para que les sirvan de ayuda.
- Funciones anónimas, que también se llaman funciones lambda, porque no se declaran con la palabra clave estándar
def
.
Funciones frente a métodos
Un método es una función que forma parte de una clase. Accedes a él con una instancia u objeto de la clase. Una función no tiene esta restricción: solo hace referencia a una función independiente. Esto significa que todos los métodos son funciones, pero no todas las funciones son métodos.
Te ponemos un ejemplo en el que primero defines una función plus()
y luego una clase Summation
con un método sum()
:
Si ahora quieres invocar el método sum()
, que forma parte de la clase Summation
, primero tienes que definir una instancia u objeto de esa clase. Así pues, definamos dicho objeto:
Recuerda que esta instanciación no es necesaria cuando quieras invocar la función plus()
. Podrías ejecutar plus(1,2)
en el fragmento de código de DataCamp Light sin ningún problema.
Parámetros frente a argumentos
Los parámetros son los nombres utilizados para definir una función o un método, y a los que se asignarán los argumentos. Es decir: los argumentos son las cosas que se suministran a cualquier llamada a una función o método, mientras que el código de la función o método hace referencia a los argumentos por sus nombres de parámetro.
Observa el siguiente ejemplo y vuelve a mirar el fragmento anterior de DataCamp Light: pasas dos argumentos al método sum()
de la clase Summation
, aunque previamente hayas definido tres parámetros, que son self
, a
y b
.
¿Qué ha pasado con self
?
El primer argumento de todo método de clase es siempre una referencia a la instancia actual de la clase, que en este caso es Summation
. Por convención, este argumento se llama self
.
Todo esto significa que en este caso no pasas la referencia a self
porque self
es el nombre de parámetro de un argumento pasado implícitamente que hace referencia a la instancia con la que se invoca un método. Se inserta implícitamente en la lista de argumentos.
Cómo definir una función: Funciones definidas por el usuario (UDF)
Los cuatro pasos para definir una función en Python son los siguientes:
- Utiliza la palabra clave
def
para declarar la función y escribe a continuación el nombre de la función. - Añade parámetros a la función: deben estar dentro del paréntesis de la función. Termina la línea con dos puntos.
- Añade sentencias que deban ejecutar las funciones.
- Termina tu función con una sentencia de devolución si la función debe producir algún resultado. Sin la sentencia de devolución, tu función devolverá un objeto
None
.
Por supuesto, tus funciones se harán más complejas a medida que avances: puedes añadirle bucles for, control de flujo y más cosas para hacerlas más precisas.
def hello():
name = str(input("Enter your name: "))
if name:
print ("Hello " + str(name))
else:
print("Hello World")
return
hello()
En la función anterior, pides al usuario que dé un nombre. Si no se da ningún nombre, la función imprimirá "Hello World". De lo contrario, el usuario obtendrá una respuesta personalizada de "Hello".
Recuerda que también que puedes definir uno o más parámetros de función para tu UDF. Aprenderás más sobre esto cuando abordes la sección Argumentos de las funciones. Además, puedes o no devolver uno o varios valores como resultado de tu función.
Empieza a aprender Python gratis
Writing Functions in Python
La return
sentencia
Ten en cuenta que, como estás imprimiendo algo en tu UDF hello()
, en realidad no necesitas devolverlo. No habrá ninguna diferencia entre la función anterior y esta:
Sin embargo, si quieres seguir trabajando con el resultado de tu función y probar algunas operaciones en él, tendrás que utilizar la sentencia return
para devolver realmente un valor, como una cadena, un entero.... Observa el siguiente caso, en el que hello()
devuelve una cadena "hello"
, mientras que la función hello_noreturn()
devuelve None
:
La segunda función te da un error porque no puedes realizar ninguna operación con None
. Obtendrás TypeError
, que dice que no puedes hacer la operación de multiplicación para NoneType
(None
que es el resultado de hello_noreturn()
) y int
(2
).
Consejo Las funciones salen inmediatamente cuando se encuentran con una sentencia return
, aunque eso signifique que no devolverán ningún valor:
Otra cosa que merece la pena mencionar cuando trabajas con la sentencia return
es el hecho de que puedes utilizarla para devolver varios valores. Para ello, utiliza tuplas.
Recuerda que esta estructura de datos es muy similar a una lista: puede contener varios valores. Sin embargo, las tuplas son inmutables, lo que significa que no puedes modificar ninguna cantidad almacenada en ellas. Las construyes con ayuda de dobles paréntesis ()
. Puedes descomponer tuplas en varias variables con la ayuda de la coma y el operador de asignación.
Echa un vistazo al siguiente ejemplo para entender cómo puede devolver tu función varios valores:
Observa que la sentencia return
return sum, a
tendría el mismo resultado que return (sum, a)
: la primera en realidad incluye sum
y a
en una tupla.
Cómo invocar una función
En las secciones anteriores ya has visto muchos ejemplos de cómo puedes invocar una función. Invocar una función significa ejecutar la función que has definido, ya sea directamente desde el prompt de Python o a través de otra función (como verás en la sección "Funciones anidadas").
Invoca tu función recién definida hello()
simplemente ejecutando hello()
, igual que en el fragmento de DataCamp Light que aparece a continuación:
Cómo añadir Docstrings a una función de Python
Otro aspecto esencial de la escritura de funciones en Python: las docstrings. Las Docstrings describen lo que hace tu función, como los cálculos que realiza o los valores que devuelve. Estas descripciones sirven como documentación de tu función para que cualquiera que lea la docstring de tu función entienda lo que hace tu función, sin tener que ver todo el código de la definición de la función.
Las docstrings de las funciones se colocan en la línea inmediatamente posterior a la cabecera de la función y entre comillas triples. Una Docstring apropiada para tu función hello()
es ‘Prints “Hello World”’.
def hello():
"""Prints "Hello World".
Returns:
None
"""
print("Hello World")
return
Ten en cuenta que las docstrings pueden ser más extensas que la que se da aquí como ejemplo. Si quieres estudiar las docstrings con más detalle, lo mejor es que consultes algunos repositorios de Github de bibliotecas de Python como scikit-learn o pandas, donde encontrarás un montón de ejemplos.
Argumentos de función en Python
Antes has aprendido la diferencia entre parámetros y argumentos. En resumen, los argumentos son las cosas que se suministran a cualquier llamada a una función o método, mientras que el código de la función o método hace referencia a los argumentos por sus nombres de parámetro. Hay cuatro tipos de argumentos que pueden usar las UDF de Python:
- Argumentos por defecto
- Argumentos obligatorios
- Argumentos de palabra clave
- Número variable de argumentos
Argumentos por defecto
Los argumentos por defecto son aquellos que adoptan un valor por defecto si no se pasa ningún valor de argumento durante la llamada a la función. Puedes asignar este valor por defecto mediante el operador de asignación =
, como en el siguiente ejemplo:
Argumentos obligatorios
Como su nombre indica, los argumentos obligatorios de una UDF son los que tienen que estar ahí. Estos argumentos deben pasarse durante la llamada a la función y precisamente en el orden correcto, como en el ejemplo siguiente:
Necesitas argumentos asignados a los parámetros a
y b
para invocar la función sin que se produzca ningún error. Si cambias a
y b
, el resultado no será diferente, pero podría serlo si cambias plus()
por lo siguiente:
Argumentos de palabra clave
Si quieres asegurarte de que invocas todos los parámetros en el orden correcto, puedes utilizar argumentos de palabra clave en la llamada a la función. Se utilizan para identificar los argumentos por su nombre de parámetro. Tomemos el ejemplo anterior para que esto quede un poco más claro:
Ten en cuenta que, al utilizar argumentos de palabra clave, también puedes cambiar el orden de los parámetros y seguir obteniendo el mismo resultado al ejecutar tu función:
Número variable de argumentos
En los casos en que no sepas el número exacto de argumentos que quieres pasar a una función, puedes utilizar la siguiente sintaxis con *args
:
El asterisco (*
) se coloca delante del nombre de la variable que contiene los valores de todos los argumentos de las variables que no son palabras clave. Ten en cuenta que también podrías haber pasado *varint
, *var_int_args
o cualquier otro nombre a la función plus()
.
Consejo: prueba a sustituir *args
por otro nombre que incluya el asterisco. Verás que el código anterior sigue funcionando.
La función anterior utiliza la función integrada de Python sum()
para sumar todos los argumentos que se pasan a plus()
. Si quieres evitar esto y construir la función tú solo, puedes utilizar esta alternativa:
Variables globales frente a variables locales
En general, las variables definidas dentro del cuerpo de una función tienen alcance local, y las que se definen fuera, alcace global. Eso significa que las variables locales se definen dentro de un bloque de función y solo se puede acceder a ellas dentro de esa función, mientras que las variables globales las pueden obtener todas las funciones que pueda haber en tu script:
Verás que obtienes NameError
, que dice que name 'total' is not defined
cuando intentas imprimir la variable local total
definida dentro del cuerpo de la función. En cambio, la variable init
se puede imprimir sin problemas.
Funciones anónimas en Python
Las funciones anónimas también se llaman funciones lambda en Python porque, en lugar de declararlas con la palabra clave estándar def
, utilizas la palabra clave lambda
.
En el fragmento de DataCamp Light anterior, lambda x: x*2
es la función anónima o lambda. x
es el argumento, y x*2
es la expresión o instrucción que se evalúa y devuelve. Lo especial de esta función es que no tiene nombre, como los ejemplos que has visto en la primera parte de este tutorial de funciones. Si tuvieras que escribir la función anterior en una UDF, el resultado sería el siguiente:
def double(x):
return x*2
Veamos otro ejemplo de función lambda en el que se trabaja con dos argumentos:
Utilizas funciones anónimas cuando necesitas una función sin nombre durante un breve periodo de tiempo, y se crea en tiempo de ejecución. El contexto específico en el que esto sería relevante es cuando trabajas con filter()
, map()
y reduce()
:
La función filter()
filtra, como su nombre indica, la lista de entradas original my_list
en función de un criterio >10
. Con map()
, en cambio, aplicas una función a todos los elementos de la lista my_list
. En este caso, multiplicas todos los elementos por 2
.
Ten en cuenta que la función reduce()
forma parte de la biblioteca functools
. Utiliza esta función acumulativamente a los elementos de la lista my_list
, de izquierda a derecha, y reduce la secuencia a un único valor, 55
, en este caso.
Utilizar main()
como función
Si tienes alguna experiencia con otros lenguajes de programación, como Java, sabrás que la función main
es necesaria para ejecutar funciones. Como has visto en los ejemplos anteriores, esto no es necesario para Python. Sin embargo, incluir una función main()
en tu programa Python puede ser útil para estructurar tu código de forma lógica: los componentes más importantes están contenidos en esta función main()
.
Puedes definir fácilmente una función main()
e invocarla igual que has hecho con todas las demás funciones anteriores:
Sin embargo, tal y como está ahora, se invocará el código de tu función main()
cuando se importe como módulo. Para asegurarte de que esto no ocurra, invoca la función main()
cuando __name__ == '__main__'
.
Eso significa que el código del fragmento de código anterior se convierte en:
Ten en cuenta que, además de la función __main__
, tienes una función __init__
que inicializa una instancia de una clase o de un objeto. En pocas palabras, actúa como constructor o inicializador y se invoca automáticamente cuando creas una nueva instancia de una clase. Con esa función, el objeto recién creado se asigna al parámetro self, que has visto antes en este tutorial. Mira el siguiente ejemplo:
class Dog:
"""
Requires:
legs - Legs so that the dog can walk.
color - A color of the fur.
"""
def __init__(self, legs, color):
self.legs = legs
self.color = color
def bark(self):
bark = "bark" * 2
return bark
if __name__ == "__main__":
dog = Dog(4, "brown")
bark = dog.bark()
print(bark)
¿Quieres seguir practicando?
¡Enhorabuena! Has terminado este breve tutorial sobre funciones en Python. Si quieres repasar otro material básico de programación en Python, no te pierdas Tipos de datos para la ciencia de datos, un curso en el que consolidarás y practicarás tus conocimientos sobre listas, diccionarios, tuplas, conjuntos y fechas.
Más información sobre Python
curso
Writing Functions in Python
curso
Writing Efficient Python Code
curso
Introduction to Python
tutorial
Tutorial de visualización de datos con Python y Tableau
tutorial
Tutorial y Ejemplos de Funciones y Métodos de Listas en Python
tutorial
Función del guión bajo(_) en el tutorial de Python
tutorial
Tutorial de list index() de Python
tutorial
Tutorial de Python sobre conjuntos y teoría de conjuntos
DataCamp Team
13 min
tutorial