El módulo os, del cual hablaremos en la sección Ejercicio final de este capítulo, proporciona el soporte para interactuar con el sistema operativo.:
Los entornos de uso de la librería estándar no se detienen aquí. Existen módulos que proporcionan el soporte para acceder a internet y controlar el navegador web:
Otros módulos proporcionan una interfaz para los archivos comodines (wildcard):
entre muchos otros.
Esta ha sido una muy breve introducción a la librería estándar, de la cual hablaremos de nuevo en este libro. Si no podéis esperar, podéis echar un vistazo a la documentación online, que encontraréis en la página web http://docs.python.org/3/library/index.html.
Definir las funciones
Las funciones se definen mediante la instrucción def:
Si no se encuentra la instrucción return, la función devuelve implícitamente el objeto None:
Hablaremos de las funciones de forma detallada en el Capítulo 3.
Definir las clases
Los tipos de datos básicos son objetos increíblemente útiles que nos permiten ser inmediatamente productivos y escribir gran parte del código sin sentir la necesidad de disponer de objetos de otro tipo. Pero cada uno de nosotros tiene sus propias exigencias, y quizás desearía utilizar objetos que le faciliten al máximo el trabajo.
Supongamos, por ejemplo, que queremos escribir una aplicación que solicite al usuario completar una acción de registro insertando sus datos, como nombre y apellido. En este caso, estaría bien tener los objetos con las carácterísticas de una persona, que tengan, por ejemplo, como atributos precisamente un nombre, un apellido y un método que restituyera el tiempo pasado desde el momento del registro. Para hacerlo, el lenguaje dispone de la instrucción class. Esta permite crear un objeto llamado clase o tipo, mediante el cual podemos crear otros objetos denominados instancias de la clase. Si hacemos memoria, recordaremos que ya hemos presentado estos conceptos en la sección Tipos de datos básicos, dedicada precisamente a las instancias de los tipos de datos básicos.
Todas las instancias de una clase tienen los mismos atributos, por lo que, por ejemplo, podemos crear una clase que defina a una persona genérica y utilizar sus instancias para representar a los usuarios que se registran en nuestra aplicación:
Las instancias de una clase MyClass se denominan también objetos de tipo MyClass, por lo que diremos que las instancias p1 y p2 del tipo Person son objetos de tipo Person.
El método _ _init_ _() inicia y termina con dos guiones bajos, por lo que, como ya hemos dicho en la sección Tipos de datos básicos, es un método especial; de hecho, es llamado automáticamente por Python justo después de la creación de la instancia con el objetivo de inicializarla. El mecanismo es el siguiente: cuando Python encuentra la instrucción p1 = Person('Tim', 'Peters'), primero crea la instancia, después llama al método _ _init_ _() y le pasa automáticamente la instancia que acaba de crear como primer argumento y, por último, devuelve la instancia asignándola a p1. Por tanto, en realidad Python nos evita hacer manualmente la llamada Person._ _init_ _(p1, 'Tim', 'Peters'). El primer parámetro de _ _init_ _(), normalmente denominado self, está presente también en la definición del método Person.since(). De hecho, la llamada a este método mediante una instancia, como en el caso de p2.since(), equivale a la llamada Person.since(p2), por lo que también en este ejemplo la instancia se pasa automáticamente al método como primer argumento y se asigna a self.
La función integrada isinstance() nos dice si un objeto es una instancia de una clase:
Si no tenéis una base en programación orientada a objetos y no os queda claro todo cuanto hemos dicho acerca del concepto de clase y de su entorno de uso, no os preocupéis: el Capítulo 5 está dedicado por completo a estos argumentos.
Un primer vistazo a los archivos
Los archivos en Python se gestionan mayormente con la función integrada open(). Dicha función permite crear un objeto archivo (file object), es decir, un objeto mediante el cual podemos interactuar con el archivo que reside en el sistema de archivos, que llamaremos archivo subyacente. Los atributos del objeto archivo nos proporcionan información como el nombre del archivo y la codificación que se utiliza para leerlo:
Dichos atributos también nos permiten interactuar con el archivo subyacente, por ejemplo, para leer su contenido:
Podemos obtener el contenido del archivo también como una lista de líneas, mediante el método readline():
Como podemos observar, las líneas son cadenas que terminan con \n. Esta representación no corresponde a la secuencia de los dos caracteres \ y n, sino a un carácter único:
Esto forma parte de un conjunto de caracteres, denominados caracteres de control, los cuales no tienen asociado ningún símbolo gráfico. Hablaremos de ello en profundidad en el próximo capítulo. De momento solo nos interesa saber que \n se utiliza para representar un salto de línea, denominado en inglés newline. Por tanto, al leer el contenido de un archivo, cada salto de línea está representado por \n, y cada \n dentro de una cadena se ve como un salto de línea cuando esta se escribe en un archivo o se muestra en pantalla con print():
Podemos ejecutar operaciones en las líneas de un archivo de manera muy sencilla. De hecho, cuando en un bucle for se repite un archivo, se accede automáticamente a sus líneas, una a una:
Los archivos tienen un modo de apertura, como el de lectura o escritura. Para especificar dicho modo, se pasa a open() como segundo argumento una cadena. La cadena "w" indica escritura (writing mode), mientras que la cadena "r" indica lectura (reading mode). Si no se especifica ningún modo, por defecto el archivo se abre en modo lectura:
Damos por terminada nuestra introducción a los archivos. Hablaremos de nuevo de ellos con mayor profundidad en el Capítulo 3.