Kitabı oku: «El gran libro de Python», sayfa 2

Yazı tipi:

La comunidad italiana de Python

Italia desempeña un papel relevante en cuanto al desarrollo de Python se refiere. Desde 2011 y hasta 2013, la Conferencia Europea de Python (EuroPython, www.europython.eu) se ha celebrado en Florencia y ha sido organizada de forma impecable por la Associazione di Promozione Sociale Python Italia.

La comunidad italiana es extensa e, igual que la internacional, siempre está dispuesta a compartir sus propias experiencias, a ayudar a los demás y a organizar de forma conjunta eventos y encuentros.

Formar parte de esta comunidad es muy sencillo: basta con inscribirse en la mailing list, siguiendo las instrucciones de la página http://www.python.it/comunita/mailing-list/.

Implementaciones de Python

Debemos realizar una importante precisión con respecto al término Python. De hecho, este término se utiliza para indicar dos cosas estrechamente vinculadas, aunque distintas: el lenguaje Python y el intérprete Python.

El lenguaje Python, como se puede intuir, es el equivalente a una lengua, como puede ser el italiano o el inglés, compuesto por tanto de un conjunto de palabras, reglas de sintaxis y semántica. El código resultante de la combinación de estos elementos se dice que está escrito en lenguaje Python. Este código, por sí mismo, no tiene ninguna utilidad. Solo resulta útil en el momento en que se tiene una herramienta que lo analiza, lo entiende y lo ejecuta. Y esta herramienta es el intérprete Python.

Por lo tanto, cuando instalamos Python o utilizamos el comando python, estamos instalando o utilizando el intérprete, es decir, la herramienta que nos permite ejecutar el código escrito en el lenguaje de programación Python. El intérprete Python está escrito también en un lenguaje de programación. En realidad, existe más de un intérprete Python, cada uno de los cuales se implementa de forma distinta respecto a los otros:

• CPython: el intérprete clásico, implementado en C (www.python.org);

• PyPy: intérprete en RPython (Restricted Python) y compilador Just-in-Time (www.pypy.org);

• IronPython: implementado sobre la plataforma .NET (www.ironpython.net);

• Jython: implementado sobre la plataforma Java (www.jython.org);

• Stackless Python: rama de CPython que soporta microthreads (www.stackless.com).

La implementación clásica, aquella que encontramos ya instalada en las distribuciones Linux y en los ordenadores Mac, y presente en el sitio web oficial, es la CPython. Esta es la implementación de referencia y se denomina habitualmente Python. Por este motivo, de ahora en adelante en este libro, si no se indica de otra forma, cuando hablemos del intérprete Python, de su instalación y de su funcionamiento, así como cuando nos refiramos a su implementación, estaremos hablando de CPython.

Modos de ejecución del código Python

Como ya hemos dicho, la teoría que estudiaremos en este libro está actualizada para Python 3.4, por lo que se aconseja probar los ejemplos del libro utilizando esta versión.

En cualquier caso, debemos tener en cuenta que el código que funciona con la versión 3.x funciona también con cualquier versión 3.y, siendo y mayor que x.

El intérprete Python en los sistemas Unix-like se encuentra habitualmente en /usr/bin/ python o /usr/local/bin/python:


mientras que en las máquinas Windows normalmente se encuentra en C:\Python.

NOTA

En todo este libro utilizaremos muchas veces comandos Unix y los acompañaremos de notas para explicar su significado. Además, todo el Apéndice A está dedicado a los comandos Unix utilizados en el libro. Acabamos de ver el comando which. Este toma como argumento el nombre de un archivo ejecutable que se encuentra en la ruta de búsqueda y devuelve la ruta completa. En otras palabras, nos dice dónde se encuentra el programa:


Podemos arrancar el intérprete mediante el comando python del terminal:


El intérprete puede arrancar con distintas opciones, que podemos consultar ejecutando Python con la opción -h:


Como podremos ver, el intérprete se comporta igual que una shell Unix: cuando es llamado con la entrada estándar conectado a un terminal, lee y ejecuta los comandos de manera interactiva, y cuando es llamado pasando el nombre de un archivo como argumento, o se redirecciona la entrada estándar de un archivo, lee y ejecuta los comandos incluidos en el archivo. Además, cuando se utiliza la opción -c, ejecuta las instrucciones que se le han pasado en forma de cadena. Veamos en detalle estos tres modos de ejecución.

Modo interactivo

Cuando los comandos se leen desde un terminal, se dice que el intérprete se ejecuta en modo interactivo. Para utilizar este modo se ejecuta python desde la línea de comandos sin argumentos:


El intérprete muestra un mensaje de bienvenida, que empieza con el número de la versión de Python que se está ejecutando, seguido del prompt principal, normalmente marcado con tres signos mayor que. Cuando una instrucción o un bloque de instrucciones ocupa más de una línea, se muestra el prompt secundario, marcado con tres puntos:


Desde el prompt principal y desde el secundario, es posible cancelar la entrada y volver al prompt principal tecleando el carácter de interrupción, normalmente Control-C o DEL:


Podemos salir del modo interactivo (con el estado de salida 0) mediante el comando quit() en el prompt principal, o bien tecleando un carácter de EOF (Control-D en los sistemas Unix-like, Control-Z en Windows).

Como el modo interactivo es muy útil tanto para probar el código rápidamente como para efectuar introspecciones de objetos, es preferible utilizar un entorno más cómodo que el simple modo interactivo integrado. Existen distintas opciones, entre las cuales destacan IPython, bpython, DreamPie o el entorno de desarrollo IDLE (Integrated Development Environment), incluido en las distribuciones Python estándar. Estas soportan funciones avanzadas, como la implementación del tabulador con introspección de objetos, la coloración de la sintaxis, la ejecución de los comandos de shell y el historial de comandos.

NOTA

En los sistemas Unix-like, la librería GNU readline permite tener el historial y la implementación del tabulador también en el modo interactivo integrado.

Para la implementación del tabulador, debemos importar los módulos rlcompleter y readline y llamar a readline.parse_and_bind('tab: complete'):


Aquí (con un doble TAB) tenemos la implementación del tabulador:


Indudablemente, ejecutar estas tres instrucciones cada vez que se trabaja con el modo interactivo es un fastidio. Por ello, es conveniente automatizar el procedimiento creando un archivo con las tres instrucciones y asignándolo a la variable de entorno PYTHONSTARTUP. De esta manera, siempre que trabajemos con el modo interactivo, Python ejecutará en primer lugar las instrucciones contenidas en el archivo. Veamos cómo realizar lo que acabamos de describir en un sistema Unix-like con shell bash. Creamos en nuestra home un archivo de inicio, llamado, por ejemplo, .pyrc, con las tres instrucciones Python:


Añadimos la siguiente línea en el archivo .bashrc de la home (si este archivo no existe, lo creamos):


Hecho. Ahora solo tenemos que abrir un terminal (o escribir el comando source ~/.pyrc en el terminal que ya está abierto) y arrancar el intérprete interactivo.

Los archivos que contienen código Python se denominan módulos Python. Hablaremos de los módulos en la sección Los módulos como contenedores de instrucciones de este capítulo, y de forma más profunda en una sección del Capítulo 4. Como veremos, los módulos realizan distintas tareas. Por ejemplo, un módulo puede ser utilizado como contenedor lógico en el cual se definen clases y funciones, o bien como script, para ser ejecutado con el fin de obtener un resultado o de realizar ciertas acciones.

Un programa Python está compuesto por uno o más módulos, y por tanto su arquitectura puede ubicar desde un simple script hasta un complejo programa estructurado en cientos de módulos. Los módulos Python tienen normalmente el sufijo .py, y tanto en Windows como en los sistemas Unix-like pueden ejecutarse con el prompt de los comandos, pasando el nombre del archivo como argumento. Por ejemplo, el archivo myfile.py:


puede ser ejecutado desde un terminal Unix, como se muestra a continuación:


NOTA

El comando cat de los sistemas Unix muestra el contenido de uno o más archivos de texto (o de la entrada estándar) sobre un terminal textual y produce sobre la salida estándar la concatenación de su contenido.

Puesto que en Windows los archivos .py se asocian directamente al ejecutable python.exe, es posible ejecutarlos simplemente mediante un doble clic sobre ellos. En cambio, en los sistemas Unix-like, como en los script de shell, los módulos pueden ser directamente ejecutados escribiendo el shebang en la primera línea del archivo:


y convirtiéndolos después en ejecutables:


NOTA

El comando chmod de los sistemas Unix modifica los permisos de archivos y directorios. Por ejemplo, si queremos que el propietario del archivo tenga los permisos de ejecución, pasamos +x como argumento de chmod:


En este punto, el archivo puede ser ejecutado directamente desde la línea de comandos. Dado que como primera línea del archivo se encuentra el shebang #! /usr/bin/env python, el archivo se ejecutará con Python:


Para más información acerca del comando chmod y sobre la escritura ./ utilizada en el ejemplo anterior, podemos consultar el Apéndice A.

Por defecto, en Python 3 el intérprete utiliza la codificación UTF-8 para descodificar el contenido de los módulos. Pero, si queremos escribir el código utilizando una codificación diferente, también podemos hacerlo, siempre y cuando el intérprete sea informado de ello. Podemos especificar la codificación utilizada insertando en el módulo un comentario especial debajo del shebang, que contenga coding:nome o coding=nome:


NOTA

Normalmente, este comentario especial que acabamos de mostrar en el ejemplo contiene los tres caracteres -*- antes o después de la indicación del código. Esta sintaxis se inspira en la escritura que se utiliza con Emacs para definir las variables locales en un archivo. Pero para Python estos símbolos no significan nada, puesto que el programa comprobará que en el comentario aparece la indicación coding:nome o coding=nome, sin prestar atención al resto.

Ejecución de cadenas pasadas desde la línea de comandos

Cuando el intérprete es llamado mediante la opción -c, este acepta como argumento una cadena que contiene instrucciones Python y las ejecuta:


Utilizaremos a menudo esta modalidad de ejecución durante todo el libro.

Introducción al lenguaje

En esta sección hablaremos de aspectos carácterísticos de Python, de los principales tipos integrados, de la definición de funciones y clases, de los archivos, de la librería estándar y de los módulos. Esta pretende ser solo una breve introducción al lenguaje, puesto que hablaremos con más profundidad de estos aspectos en el resto del libro.

Indentación del código

En Python un bloque de código anidado no está delimitado por palabras clave o por llaves sino por el signo de dos puntos y la indentación (sangría) misma del código:



NOTA

Por bloque de código anidado entendemos el código interno a una clase, a una función, a una instrucción o sentencia if, a un bucle for, a un bucle while y demás. Solo los bloques de código anidados van precedidos por una instrucción que termina con el signo de los dos puntos. Más adelante veremos que los bloques anidados son la suite de las instrucciones compuestas o de las relativas cláusulas.

La indentación debe ser la misma para todo el bloque, por lo que el número de espacios en blanco (espacios o tabulaciones) es importante:


En la PEP-0008 se aconseja utilizar cuatro espacios para cada nivel de indentación y no mezclar nunca espacios y tabulaciones.

NOTA

Si utilizamos Vim como editor y queremos que los bloques de código se indenten automáticamente con cuatro espacios, podemos escribir en el archivo de configuración .vimrc las siguientes líneas:


A menudo tendremos que editar archivos escritos por otras personas, los cuales contengan indentaciones con tabulaciones. En estos casos, con Vim, una vez efectuada la configuración indicada, podemos convertir todas las tabulaciones del archivo en espacios mediante el comando retab.

Utilizar a la vez espacios y tabulaciones para indentar instrucciones en el mismo bloque es un error:


NOTA

En Python 3, a diferencia de Python 2, también es un error pasar de espacios a tabulaciones (o viceversa) al cambiar de nivel de indentación, como se muestra en la sección titulada Uso inconsistente de espacios y tabulaciones del Apéndice B.

Por tanto, la indentación es un requisito del lenguaje y no una cuestión de estilo, y esto supone que todos los programas Python tengan el mismo aspecto. Pero quizás un día las cosas cambien, y podremos utilizar también llaves para delimitar los bloques de código:


No, esta posibilidad no existe, por lo que las discusiones acerca de cómo indentar y posicionar los delimitadores de los bloques no tienen razón de ser (consulte la PEP-0666), y todo esto está perfectamente en línea con el Zen de Python, según el cual, como veremos dentro de poco, "debería haber un modo obvio, y preferiblemente uno solo, de hacer las cosas". Este único modo obvio de hacer las cosas se denomina pythonic way. Finalmente, como ya sabemos, no es necesario terminar las instrucciones con un punto y coma, sino que basta con saltar a una nueva línea. En cambio, el punto y coma es necesario para insertar más instrucciones en la misma línea:


Insertar varias instrucciones en la misma línea es de un estilo de programación pésimo, y de hecho está desaconsejado por la PEP-0008. En el resto del libro utilizaremos el punto y coma solo para ejecutar cadenas desde la línea de comandos:


NOTA

Existen distintas herramientas que permiten comprobar si nuestro código respeta la PEP-0008. Podemos realizar un rápido chequeo online con http://pep8online.com/, o bien, como alternativa, podemos utilizar pep8 (https:// pypi.python.org/pypi/pep8) o pyflakes. También están disponibles otros plugins que permiten efectuar la comprobación con Vim.

Los objetos integrados

Cuando un programa es ejecutado, Python, a partir del código, genera estructuras de datos, denominados objetos, sobre las cuales basa después todo el proceso de elaboración. Los objetos se almacenan en la memoria del ordenador, para que puedan ser llamados cuando el programa se refiere a ellos. En el momento en que ya no sirven, un mecanismo singular, denominado garbage collector, libera la memoria que ocupaban. Esta primera descripción de un objeto puede ser demasiado abstracta para que entendamos de qué se trata realmente. No nos preocupemos, puesto que es suficiente para la finalidad de esta sección y veremos otras más formales y concretas en su momento. Los objetos que constituyen el corazón de Python, denominados objetos integrados, se dividen habitualmente en las siguientes categorías: tipos de datos básicos, funciones integradas, clases y tipos de excepciones integradas. Aquí realizaremos solo una breve aproximación a los objetos integrados, puesto que les dedicaremos todo el Capítulo 2.

Tipos de datos básicos

Aquello a lo que llamamos tipos de datos básicos no es más que el conjunto de los principales tipos integrados. Estos pueden ser agrupados en cuatro categorías:

• números: enteros (tipo int), booleanos (bool), complejos (complex), de punto flotante (float);

• conjuntos: representados por el tipo set;

• secuencias: cadenas (str y byte), listas (list) y tuplas (tuple);

• diccionarios: representados por el tipo dict.

Los tipos de datos básicos pertenecen a una categoría de objetos llamados clases, o también tipos. La carácterística de los tipos, como su nombre indica, es la de representar un tipo de dato genérico, a partir del cual podamos crear objetos específicos de dicho tipo, llamados instancias. Por ejemplo, a partir del tipo str podemos crear las instancias "python", "Guido" y"abc"; a partir del tipo int las instancias 22 y 77; a partir del tipo list las instancias [1, 2, 3] y ['a', 'b', 'c', 'd'], y así para el resto de tipos. Por lo tanto, diremos que una cadena de texto es un objeto de tipo str, o, lo que es lo mismo, que es una instancia del tipo str. Del mismo modo, diremos que un entero es un objeto del tipo int, o, lo que es lo mismo, una instancia del tipo int, y así para los números de punto flotante, las listas, etc.

Algunos objetos son fáciles de imaginar debido a que tienen muy en cuenta tanto el concepto de valor como el de tipo, como en el caso de las instancias de los tipos numéricos:


Su tipo, como el de cualquier otro objeto, puede obtenerse a partir de la clase integrada type:


Los objetos están siempre carácterizados por un tipo, mientras que solo a alguno de ellos podemos asociarle de manera intuitiva un valor. Además del tipo, otros elementos carácterísticos de los objetos son la identidad y los atributos.

La identidad está representada por un número que los identifica de manera única, y es devuelta por la función integrada id():


Los atributos son identificadores accesibles mediante el delimitador punto:


En este ejemplo bit_length, as_integer_ratio e imag son atributos, respectivamente, de a, b y c. Los atributos están estrechamente vinculados al tipo de un objeto. Por ejemplo, todos los objetos de tipo str tienen el atributo str.upper(), el cual devuelve una versión de la cadena en mayúsculas:


y todos los objetos de tipo list tienen el atributo list.sort() que reordena los elementos de la lista:


Cuando a un identificador le siguen unos paréntesis (), se dice que el objeto al cual hace referencia es llamable (callable). Al aplicar los paréntesis al identificador, decimos que estamos llamando al objeto. Consideremos, por ejemplo, un número complejo:


Todos los números complejos tienen el siguiente atributo:


y este es llamable. Cuando lo llamamos, nos devuelve el complejo conjugado del número:


Podemos descubrir si un objeto es llamable gracias a la función integrada callable():


Si intentamos llamar a un objeto que no es llamable, obtenemos un error:


Los objetos llamables se distinguen de los que no lo son por el hecho de que permiten ejecutar una serie de operaciones, o bien un bloque de instrucciones. Las funciones, por ejemplo, son objetos llamables. Para aclarar mejor este concepto, consideremos la función integrada sum:


esta es un objeto llamable:


y si la llamamos, ejecuta la suma de los elementos del objeto que pasamos como argumento:


Si en una llamada no debemos pasar ningún argumento, igualmente utilizaremos los paréntesis:


Los parentesis, de hecho, indican que queremos ejecutar las operaciones que pertenecen al objeto llamable.

Los atributos llamables se denominan métodos. Según cuanto hemos dicho hasta ahora, la diferencia entre los métodos y los otros atributos es que los primeros pueden ser llamados para ejecutar operaciones, mientras que los segundos no. Consideremos de nuevo el número complejo c = 1 + 2j:


Sus atributos c.real y c.imag no son métodos y, por tanto, no pueden ser llamados. En cambio, el atributo c.conjugate es un método y al ser llamado ejecuta la operación c.real - c.imag y devuelve el resultado:


NOTA

En este libro, cuando en el texto escribamos el identificador de un método o de una función, utilizaremos los paréntesis. Por ejemplo, escribiremos c.conjugate() e id() y no c.conjugate e id para indicar el método coniugate() de los números complejos y la función integrada id(). En cambio, cuando hablemos de las clases, aunque son objetos llamables, no utilizaremos los paréntesis, por lo que escribiremos, por ejemplo, type y no type(). En el Capítulo 6, cuando hablemos del modelo a objetos de Python y de las meta-clases, entenderemos por qué tiene sentido la distinción entre objetos que son clases y objetos que no lo son.

Sustancialmente, los métodos son funciones y, de hecho, son definidos como tales, como veremos en la sección Definir las clases.

Si estos conceptos os parecen demasiado abstractos, no os preocupéis, puesto que los retomaremos más de una vez en este libro y los afrontaremos de manera exhaustiva en el Capítulo 5, cuando presentemos la programación orientada a objetos y veamos en detalle los distintos tipos de método.

La función integrada dir() devuelve una lista de los nombres de los atributos más significativos de un objeto:


Todos los atributos que empiezan y terminan con un doble guion bajo se denominan atributos especiales o también atributos mágicos. Veremos el significado de alguno de ellos en este capítulo y en los dos siguientes, mientras que del resto hablaremos de forma más profunda en el Capítulo 6.

La función integrada hasattr() nos dice si un objeto tiene cierto atributo:


Veamos ahora los tipos de datos básicos. Como ya hemos dicho, esta será solo una breve introducción, puesto que los trataremos con detalle en el Capítulo 2.

₺548,57

Türler ve etiketler

Yaş sınırı:
0+
Hacim:
1892 s. 2471 illüstrasyon
ISBN:
9788426729057
Yayıncı:
Telif hakkı:
Bookwire
İndirme biçimi:
Metin
Ortalama puan 0, 0 oylamaya göre
Ses
Ortalama puan 0, 0 oylamaya göre
Metin
Ortalama puan 0, 0 oylamaya göre
Metin
Ortalama puan 4,8, 5 oylamaya göre
Metin
Ortalama puan 0, 0 oylamaya göre
Metin
Ortalama puan 0, 0 oylamaya göre
Metin
Ortalama puan 0, 0 oylamaya göre