Funciones en Python
Para definir funciones en Python disponemos de la instrucción def
Después de esta palabra reservada va el nombre de la función junto con una lista de argumentos delimitados por paréntesis y separados por comas, finalizando con el símbolo :
La definición de una función no ejecuta el cuerpo de la función
Solamente será ejecutada cuando la función sea llamada
Su ejecución enlaza el nombre de la función con el namespace local actual a un objecto función (un envoltorio alrededor del código ejecutable para la función)
Este objeto función contiene una referencia al namespace local global como el namespace global para ser usado cuando la función sea llamada
De forma opcional puede añadirse una expresión que será devuelta por la función
La expresión puede será un tipo válido de Python precedida por la sentencia return
El DOCSTRING es un texto descriptivo de la función encerrado entre tres comillas dobles de apertura y cierre, antes de la primera instrucción
Es opcional, así que si no queremos añadir una descripción, podemos omitirlo
Pero se recomienda su uso para que cuando revisemos después de un tiempo nuestro código, recordemos qué hacía nuestra función
Argumentos
El paso de argumentos es opcional y en algunos casos puede haber funciones que carezcan de ellos
Tipo de los argumentos
Admite los tipos str, int, float, complex,bool, list, tuple, dic y class
Argumentos con valor por posición
Cuando enviamos argumentos a una función, estos se reciben por orden en los parámetros definidos
Argumentos con valor por nombre
Es posible evadir el orden de los parámetros si indicamos durante la llamada el valor que tiene cada parámetro a partir de su nombre
Sin Argumentos
Al momento de llamar una función la cual tiene definidos unos parámetros, si no pasa los argumentos correctamente provocará una excepción TypeError
Argumentos con valor por defecto
En ocasiones necesitamos que un argumento tenga un valor, para evitar un error (que provocaría el lanzamiento de la excepción TypeError), aunque el usuario de la función no lo introduzca
Hay que tener en cuenta, que los argumentos con valor por defecto pasan a ser opcionales y que todos los argumentos a la izquierda del primer valor por defecto, son obligatorios
En el ejemplo se ha utilizado el valor nulo (None) para expresar que no se habían pasado argumentos
Pero podríamos utilizar cualquier tipo que precisemos como valor por defecto
Argumentos indeterminados
En algunas ocasiones no sabremos previamente cuantos elementos necesitamos enviar a una función
Para estos casos podemos utilizar los parámetros indeterminados por posición o por nombre
Argumentos por posición
Como argumento usaremos un tipo tuple precediendolo con el símbolo *
De esta forma todos los argumentos serán recibidos por posición, pudiendo recorrerlos cómodamente con un bucle for
Argumentos por nombre
Como argumento usaremos un tipo dict precediendolo con los símbolos **
De esta forma todos los argumentos serán recibidos por el nombre de la clave del diccionario, pudiendo recorrerlos cómodamente con un bucle for
Argumentos por posición y nombre
En alguna ocasión puede necesitar utilizar ambos tipos de parámetros simultáneamente en una función, entonces debe crear ambas colecciones dinámicas
Primero los argumentos indeterminados por valor y luego por nombre
En todos los ejemplos se han utilizado los nombres args y kwargs pero no son obligatorios
Muchos frameworks y librerías los utilizan por lo que es una buena practica llamarlos así, por convención
La sentencia pass
Es una operación nula, cuando la ejecutamos, parece que nada sucede
Es útil como un contenedor cuando una sentencia es requerida sintácticamente, pero no es necesario ejecutar código
La sentencia return
La sentencia return es la que permite devolver el resultado de una función
Admite los tipos str, int, float, complex,bool, list, tuple, dic y class
La setencia return es opcional, pero si se omite, por defecto devolverá el valor nulo (None)
Retorno múltiple
Una característica interesante de las funciones en Python, es la posibilidad de devolver valores múltiples separados por comas
Funciones predefinidas por el lenguaje
Las funciones predefinidas por el lenguaje están ordenadas por módulos
Un módulo es un conjunto de clases y funciones almacenadas en un archivo que pueden ser utilizadas posteriormente
Podemos crear nuestros propios módulos e importarlos a los nuevos programas que hagamos
Sin embargo, es aconsejable reutilizar los módulos ya existentes
Para importar un módulo utilizaremos la sentencia import
De esta forma estaremos manejando un namespace, de forma similar a como lo hace C++ (using namespaces) o Java
Que tiene la siguiente sintaxis
Para llamar a una función concreta del módulo utilizaremos nombre.funcion() o alias.funcion en caso de que le hayamos dado un alias al módulo
En caso de no querer utilizar todas la funciones del módulo pero si una concreta, utilizaremos la sentencia from
Que tiene la siguiente sintaxis
Módulo sys
Este módulo es el encargado de proveer variables y funcionalidades relacionadas con el intérprete
Las variables del módulo sys son:
- sys.executable
Retorna el directorio absoluto del archivo binario ejecutable del intérprete de Python
- sys.platform
Retorna la plataforma sobre la cual se está ejecutando el intérprete
- sys.version
Retorna el número de versión de Python con información adicional
Los métodos más destacados del módulo sys son los siguientes:
- sys.exit()
Forzar la salida del intérprete
- sys.getdefaultencoding()
Retorna la codificación de caracteres por defecto
- sys.getfilesystemencoding()
Retorna la codificación de caracteres que se utiliza para convertir los nombres de archivos unicode en nombres de archivos del sistema
- sys.getsizeof()
Retorna el tamaño del objeto pasado como parámetro
Módulo os
Este módulo nos permite acceder a funcionalidades dependientes del SO
Sobre todo, aquellas que nos dan información sobre el entorno del mismo y nos permiten manipular la estructura de directorios
Algunos de los métodos más utilizados son:
- os.getcwd()
Nos informa de cuál es el directorio actual
- os.chdir(ruta)
Cambia el directorio de trabajo a la ruta pasada como argumento
- os.chroot()
Cambia al directorio raiz
- os.mkdir(directorio)
Crea el directorio pasado como argumento
- os.rmdir(directorio)
Elimina el directorio pasado como argumento
- os.remove(fichero)
Eliminar el archivo pasado como argumento
- os.rename(actual, nuevo)
Renombra el archivo actual por el nombre del archivo nuevo, pasados como argumentos
Módulo math
Este módulo nos provee de funciones y constantes matemáticas
Podemos encontrar todas las funciones y atributos en su documentación
Algunas de los variables más utilizadas son:
- math.pi
Representa el valor de la variable \pi (número Pi)
- math.e
Representa el valor de la variable e (número de Euler o constante de Napier)
- math.tau
Representa el valor de la variable \tau = 2\cdot\pi (constante Tau, propuesta por Bob Palais, Peter Harremoes, Hermann Laurent, Fred Hoyle, Michael Hartl, Nicolás Atanes, entre otros)
Algunos de los métodos más utilizados son:
- math.ceil(x)
Devuelve el entero menor que sea mayor o igual que x
- math.floor(x)
Devuelve el entero mayor menor o igual a x
- math.exp(x)
Devuelve el número e elevado a la potencia x
- math.log2(x)
Devuelve el logaritmo en base 2 de x
- math.sin(x)
Devuelve el seno de x radianes
- math.cos(x)
Devuelve el coseno de x radianes
- math.tan(x)
Devuelve la tangente de x radianes
- math.degrees(x)
Convierte el ángulo x de radianes a grados
Módulo random
El módulo random se utiliza para todo lo relacionado con números aleatorios
Algunos de los métodos más utilizados son:
- shuffle(col)
Reordena aleatoriamente los elementos de una colección
- sample(col, k)
Toma n elementos sin reemplazo de una coleccion
- random()
Genera un número aleatorio en el intervalo [0, 1)
- uniform(a, b)
Genera un número aleatorio en el intervalo [a, b]
- randint(a, b)
Genera un número aleatorio entero en el intervalo [a, b]
- gauss(media, sigma)
Genera un número aleatorio siguiendo una distribución gaussiana con media y sigma dadas
Módulo NumPy
Numpy nos proporciona una gran cantidad de funciones matemáticas y el tipo de variable NumPy array
Por lo general el paquete NumPy suele importarse con el alias np
Este módulo nos permite trabajar con estructuras matemáticas de una forma muy cómoda (producto de matrices, números aleatorios, operaciones sobre matrices…)
Es un módulo que no viene instalado por defecto
Para ello abre un terminal y ejecuta:
Podemos encontrar todas las funciones y atributos en su documentación
Algunos de los métodos más utilizados son:
- random.rand()
Nos devuelve valores aleatorios con la forma deseada
- empty()
Crea un array vacío con la forma indicada
- zeros()
Crea un array de ceros con la forma indicada
- dot()
Calcula el producto matricial entre dos arrays
- sum()
Calcula la suma de los elementos de un array
Módulo Pandas
El paquete pandas es muy utilizado en el Data Scientists
Es uno de los paquetes sobre el que deberíamos centrarnos para aprender sobre análisis de datos
A través de pandas podemos familiarizarnos con nuestro set de datos limpiándolo, transformándolo y analizándolo
Por ejemplo, con pandas podemos leer un fichero CSV de nuestro ordenador, pasarlo a un DataFrame (una tabla, en esencia) y hacer cosas como:
- Calcular estadísticas y responder preguntas sobre los datos como sacar el máximo, minimo y media de cada columna, saber cómo de correlacionadas están las columnas A y B o conocer la distribución estadística de la columna C
- Limpiar los datos haciendo cosas como eliminar los valores faltantes o filtrando filas y columnas de acuerdo a algún criterio
- Visualizar los datos con la ayuda de matplotlib
- Guardar los datos ya limpiados de vuelta en un CSV o una base de datos
- Tomar una o más funciones como entrada
- Devolver una función como salida
Pandas se basa en NumPy, por lo que debemos tener ese módulo instalado previamente
Jupyter Notebooks es una aplicación que se complementa muy bien con Pandas, ya que podemos ejecutar el código por celdas en vez que de forma completa, lo cual es útil si trabajamos con grandes datasets
Los componentes primarios de Pandas son series y DataFrame, siendo el primer tipo una columna y el segundo una table
Por lo general el paquete pandas suele importarse con el alias np
Es un módulo que no viene instalado por defecto
Para ello abre un terminal y ejecuta:
Podemos encontrar todas las funciones y atributos en su documentación
Ahora vamos a crear un ejemplo sencillo para mostrar el uso de pandas usando una serie que contendrá a los integrantes de la selección Española de fútbol que ganó el mundial del año 2010
Para crear la serie utilizamos el método pd.Series que recibirá una lista con los nombres de los jugadores y una lista con el número de dorsal de los jugadores
Después lo mostraremos por pantalla
Ahora no le vamos a indicar los índices de forma explícita, entonces generará los índices de forma automática empezando desde el valor cero
Ahora vamos a introducir en la serie un diccionario en vez de una lista y le vamos a añadir un jugador más
Ahora vamos a crear un ejemplo sencillo para mostrar el uso de pandas usando un DataFrame que contendrá a los integrantes de la selección Española de fútbol que ganó el mundial del año 2010
Para crear el DataFrame utilizamos el método pd.DataFrame que recibirá un diccionario con los datos de los jugadores, una lista con el nombre de la columna y una lista con el número de dorsal de los jugadores
Añadiremos un jugador más utilizando el método loc del objeto DataFrame
Después lo mostraremos por pantalla
Funciones de visualización
La función print sirve para enviar la salida de sus argumentos al navegador con un formato
Operador %
El operador % también se puede utilizar para el formato de la cadena
Interpreta el argumento izquierdo de manera muy parecida a una cadena de formato de estilo de la función printf de C++, que se aplica al argumento derecho
En Python, no hay una función printf pero se le ha dotado de su funcionalidad a print
Para este propósito, el operador % está sobrecargado para cadenas para mostrar el formato de la cadena
A menudo se le llama operador de módulo de cadena (o, a veces, incluso, módulo)
Tiene el formato:
Para formatear un texto deberemos introducir los siguientes caracteres de formato precedidos por el símbolo %:
Caracteres de formato para texto | |
Caracter | Descripción |
c |
El argumento es tratado como un valor de tipo string y recoge un único carácter |
d |
El argumento es tratado como un valor de tipo int y presentado como un número entero |
e |
El argumento es tratado con notación científica (por ejemplo 1.2e+2) |
E |
Como %e pero utiliza la letra mayúscula (por ejemplo 1.2E+2) |
f |
El argumento es tratado como un valor de tipo float y presentado como un número de punto flotante (considerando la configuración regional) |
F |
El argumento es tratado como un valor de tipo float y presentado como un número de punto flotante (sin considerar la configuración regional) |
g |
Igual que %e y %f |
G |
Igual que %E y %f |
o |
El argumento es tratado como un valor de tipo integer y presentado como un número octal |
s |
El argumento es tratado como un valor de tipo string y recoge una cadena de caracteres |
u |
El argumento es tratado como un valor de tipo int y presentado como un número decimal sin signo |
x |
El argumento es tratado como un valor de tipo integer y presentado como un número hexadecimal |
X |
El argumento es tratado como un valor de tipo integer y presentado como un número hexadecimal en mayúsculas |
Método format
El método format se añadió a los tipos string en Python 2.6
Permite el uso de los caracteres {} para marcar dónde se sustituirá una variable y utiliza directivas de formato detalladas usadas para formatear
Este método nos permite concatenar elementos dentro de una salida a través del formato posicional
Los corchetes y los caracteres dentro de ellos (llamados campos de formato) se reemplazan con los objetos pasados al método format
Se puede usar un número entre paréntesis para referirse a la posición del argumento pasado al método format
Hay que tener en cuenta que el primer argumento empieza en cero
También se puede usar un identificador clave cuando el argumento sea pasado por nombre
Esta opción nos será útil cuando trabajemos con diccionarios o cuando queramos reducir algo el código
Opcionalmente se puede poner el símbolo : después del número o nombre, y explicitar el tipo del objeto:
Caracteres de formato para texto | |
Caracter | Descripción |
s |
El argumento es tratado como un valor de tipo string y recoge una cadena de caracteres |
d |
El argumento es tratado como un valor de tipo int y presentado como un número decimal (con signo) |
f |
El argumento es tratado como un valor de tipo float y presentado como un número de punto flotante (considerando la configuración regional) |
Funciones de orden superior
En matemáticas y ciencias de la computación, las funciones de orden superior son funciones que cumplen al menos una de las siguientes condiciones:
Funciones lambda
Las funciones lambda son funciones anónimas, es decir, funciones sin nombre
Sólo se utilizan en el lugar en el que se han creado (aunque se les puede asignar un nombre y usarlas más adelante)
Se utilizan por lo general junto a las funciones map, filter y reduce
Por lo general se utilizan para crear funciones que son pasadas como argumentos a otras funciones
En Python la sintaxis de una función lamdba es:
Donde la expresión puede ser cualquier operación que haríamos al realizar una asignación
Funcion map
Nos permite aplicar una función sobre cada uno de los elementos de un iterable
Nos devuelve un map object, que podemos transformar fácilmente en una lista
Funcion filter
Nos permite filtrar los elementos de una colección (por ejemplo una lista)
Es una función muy utilizada en el tratamiento de colecciones
Función reduce
Toma una función y una colección reduciéndola a un solo valor
Sería equivalente a una función de agregación
Pertenece al módulo functools, por lo que deberá ser importado antes de poder usar reduce
La función que pasemos debe tomar al menos dos parámetros y uno opcional
El primero es el parámetro del agregado que se va acumulado en cada iteración sobre los elementos de la colección
El segundo el elemento corresponde al paso de la iteración
El tercero es en caso que se necesite un valor inicial