Subsecciones


3. Introducci�n informal a Python

En los siguientes ejemplos, la entrada y la salida se distinguen por la presencia o ausencia de indicadores (">>> " y "... "). Para repetir el ejemplo debe teclear todo lo que sigue al indicador, cuando aparezca el indicador. Las l�neas que no empiezan por un indicador son la salida del int�rprete. Observa que un indicador secundario solo en una l�nea indica que debe teclear una l�nea en blanco. Esto se utiliza para finalizar una orden multi-l�nea.

Muchos de los ejemplos de este manual, incluidos los que se escriben interactivamente, incluyen comentarios. Los comentarios en Python empiezan por el car�cter almohadilla, "#", y se extienden hasta el final de la l�nea f�sica. Se puede iniciar un comentario al principio de una l�nea o tras espacio en blanco o c�digo, pero no dentro de una constante literal. Una almohadilla dentro de una cadena es, simplemente, una almohadilla.

Ejemplos:

# �ste es el primer comentario
fiambre = 1                 # y �ste
                            # ... �y un tercero!
cadena = "# Esto no es un comentario."


3.1 Python como calculadora

Vamos a probar algunas �rdenes simples de Python. Arranca el int�rprete y espera a que aparezca el indicador principal, ">>>" (no deber�a tardar mucho).


3.1.1 N�meros

El int�rprete funciona como una simple calculadora: T� tecleas una expresi�n y �l muestra el resultado. La sintaxis de las expresiones es bastante intuitiva: Los operadores +, -, * y / funcionan como en otros lenguajes (p. ej. Pascal o C). Se puede usar par�ntesis para agrupar operaciones. Por ejemplo:

>>> 2+2
4
>>> # Esto es un comentario
... 2+2
4
>>> 2+2  # un comentario junto al c�digo
4
>>> (50-5*6)/4
5
>>> # La divisi�n entera redondea hacia abajo:
... 7/3
2
>>> 7/-3
-3

Al igual que en C, se usa el signo de igualdad "=" para asignar un valor a una variable. El valor de una asignaci�n no se escribe:

>>> ancho = 20
>>> alto = 5*9
>>> ancho * alto
900
Se puede asignar un valor simult�neamente a varias variables:

>>> x = y = z = 0  # Poner a cero 'x', 'y' y 'z'
>>> x
0
>>> y
0
>>> z
0
La coma flotante funciona de la manera esperada. Los operadores con tipos mixtos convierten el operando entero a coma flotante:

>>> 4 * 2.5 / 3.3
3.0303030303
>>> 7.0 / 2
3.5
Tambi�n funcionan de la manera esperada los n�meros complejos: Los n�meros imaginarios se escriben con el sufijo "j" o "J". Los n�meros complejos con una parte real distinta de cero se escriben "(real+imagj)", y se pueden crear con la funci�n "complex(real, imag)".

>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
Los n�meros complejos siempre se representan como dos n�meros de coma flotante, la parte real y la imaginaria. Para extraer una de las partes de un n�mero complejo z, usa z.real y z.imag.

>>> a=1.5+0.5j
>>> a.real
1.5
>>> a.imag
0.5
Las funciones de conversi�n a coma flotante y a entero (float(), int() y long()) no funcionan con n�meros complejos, pues no hay un modo �nico y correcto de convertir un complejo a real. Usa abs(z) para sacar su m�dulo (como flotante) o z.real para sacar su parte real.

>>> a=1.5+0.5j
>>> float(a)
Traceback (innermost last):
  File "<stdin>", line 1, in ?
TypeError: can't convert complex to float; use e.g. abs(z)
>>> a.real
1.5
>>> abs(a)
1.58113883008
En modo interactivo, la �ltima expresi�n impresa se asigna a la variable _. Esto significa que, cuando se usa Python como calculadora, se facilita continuar los c�lculos, por ejemplo:

>>> iva = 17.5 / 100
>>> precio = 3.50
>>> precio * iva
0.61249999999999993
>>> precio + _
4.1124999999999998
>>> round(_, 2)
4.1100000000000003

S�lo debe leer esta variable. No le asignes un valor expl�citamente, ya que crear�as una variable local del mismo nombre y enmascarar�as la variable interna que proporciona la funcionalidad especial.


3.1.2 Cadenas

Adem�s de los n�meros, Python tambi�n sabe manipular cadenas, que se pueden expresar de diversas maneras. Se pueden encerrar entre comillas simples o dobles:

>>> 'fiambre huevos'
'fiambre huevos'
>>> 'L\'Hospitalet'
"L'Hospitalet"
>>> "L'Hospitalet"
"L'Hospitalet"
>>> '"S�," dijo.'
'"S�," dijo.'
>>> "\"S�,\" dijo."
'"S�," dijo.'
>>> '"En L\'Hospitalet," dijo.'
'"En L\'Hospitalet," dijo.'

Las cadenas pueden ocupar varias l�neas de diferentes maneras. Se puede impedir que el final de l�nea f�sica se interprete como final de l�nea l�gica mediante usando una barra invertida, por ejemplo:

hola = "Esto es un texto bastante largo que contiene\n\
varias l�neas de texto, como si fuera C.\n\
    Observa que el espacio en blanco al principio de la l�nea es\
 significativo.\n"
print hola

mostrar�a lo siguiente:

Esto es un texto bastante largo que contiene
varias l�neas de texto, como si fuera C.
    Observa que el espacio en blanco al principio de la l�nea es significativo.

O se pueden encerrar las cadenas entre comillas triples emparejadas: """ o '''. No es necesario poner barra invertida en los avances de l�nea cuando se utilizan comillas triples; ser�n incluidos en la cadena.

print """
Uso: cosilla [OPCIONES] 
     -h                        Mostrar este mensaje de uso
     -H NombreServidor         Nombre del servidor al que conectarse
"""

presenta:

Uso: cosilla [OPCIONES] 
     -h                        Mostrar este mensaje de uso
     -H NombreServidor         Nombre del servidor al que conectarse

El int�rprete muestra los resultados de las operaciones con cadenas como se escriben a la entrada: Entre comillas y con las comillas y otros caracteres raros escapados por barras invertidas, para mostrar el valor exacto. La cadena se encierra entre comillas dobles si contiene una comilla simple y no contiene comillas dobles, si no, se encierra entre comillas simples (se puede utilizar print para escribir cadenas sin comillas ni secuencias de escape).

Se puede concatenar cadenas (pegarlas) con el operador + y repetirlas con *:

>>> palabra = 'Ayuda' + 'Z'
>>> palabra
'AyudaZ'
>>> '<' + palabra*5 + '>'
'<AyudaZAyudaZAyudaZAyudaZAyudaZ>'

Dos literales juntos se concatenan autom�ticamente. La primera l�nea de arriba se podr�a haber escrito "palabra = 'Ayuda' 'Z'". Esto s�lo funciona con literales, no con expresiones de cadena arbitrarias.

>>> import string 
>>> 'cad' 'ena'                   #  <-  Esto vale
'cadena'
>>> string.strip('cad') + 'ena'   #  <-  Esto vale
'cadena'
>>> string.strip('cad') 'ena'     #  <-  Esto no vale
  File "<stdin>", line 1
    string.strip('cad') 'ena'
                            ^
SyntaxError: invalid syntax

Se puede indexar una cadena. Como en C, el primer car�cter de una cadena tiene el �ndice 0. No hay un tipo car�cter diferente; un car�cter es una cadena de longitud uno. Como en Icon, las subcadenas se especifican mediante la notaci�n de corte: dos �ndices separados por dos puntos.

>>> palabra[4]
'a'
>>> palabra[0:2]
'Ay'
>>> palabra[2:4]
'ud'

A diferencia de las cadenas en C, las cadenas de Python no se pueden cambiar. Si se intenta asignar a una posicion indexada dentro de la cadena se produce un error:

>>> palabra[0] = 'x'
Traceback (innermost last):
  File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment
>>> palabra[:-1] = 'Choof'
Traceback (innermost last):
  File "<stdin>", line 1, in ?
TypeError: object doesn't support slice assignment

Sin embargo crear una nueva cadena con el contenido combinado es f�cil y eficaz:

>>> 'x' + palabra[1:]
'xyudaZ'
>>> 'Choof' + word[-1:]
'ChoofZ'

Los �ndices de corte tienen valores por omisi�n muy pr�cticos; si se omite el primer �ndice se supone cero y si se omite el segundo se supone el tama�o de la cadena sometida al corte.

>>> palabra[:2]    # Los primeros dos caracteres
'Ay'
>>> palabra[2:]    # Todos menos los primeros dos caracteres
'daZ'

He aqu� un comportamiento �til en las operaciones de corte: s[:i] + s[i:] equivale a s.

>>> palabra[:2] + palabra[2:]
'AyudaZ'
>>> palabra[:3] + palabra[3:]
'AyudaZ'

Los �ndices degenerados se tratan con elegancia: un �ndice demasiado grande se reemplaza por el tama�o de la cadena, un �ndice superior menor que el inferior devuelve una cadena vac�a.

>>> palabra[1:100]
'yudaZ'
>>> palabra[10:]
''
>>> palabra[2:1]
''

Los �ndices pueden ser negativos, para hacer que la cuenta comience por el final. Por ejemplo:

>>> palabra[-1]     # El �ltimo car�cter
'Z'
>>> palabra[-2]     # El pen�ltimo car�cter
'a'
>>> palabra[-2:]    # Los dos �ltimos caracteres
'aZ'
>>> palabra[:-2]    # Todos menos los dos �ltimos
'Ayud'

Pero date cuenta de que -0 es 0, as� que �no cuenta desde el final!

>>> palabra[-0]     # (porque -0 es igual a 0)
'A'

Los �ndices de corte negativos fuera de rango se truncan, pero no ocurre as� con los �ndices simples (los que no son de corte):

>>> palabra[-100:]
'AyudaZ'
>>> palabra[-10]    # error
Traceback (innermost last):
  File "<stdin>", line 1
IndexError: string index out of range

El mejor modo de recordar c�mo funcionan los �ndices es pensar que apuntan al espacio entre los caracteres, estando el borde izquierdo del primer car�cter numerado 0. El borde derecho del �ltimo car�cter de una cadena de n caracteres tiene el �ndice n, por ejemplo:

 +---+---+---+---+---+---+
 | A | y | u | d | a | Z |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1

La primera fila de n�meros da la posici�n de los �ndices 0..5 de la cadena; la segunda da los �ndices negativos correspondientes. El corte desde i hasta j consta de todos los caracteres entre los bordes etiquetados i y j, respectivamente.

Para los �ndices no negativos, la longitud del corte es la diferencia entre los �ndices, si los dos est�n entre l�mites. Por ejemplo, la longitud de palabra[1:3] es 2.

La funci�n interna len() devuelve la longitud de una cadena:

>>> s = 'supercalifragilisticoexpialidoso'
>>> len(s)
32


3.1.3 Cadenas Unicode

A partir de Python 2.0, el programador dispone de un nuevo tipo de datos para almacenar datos de texto: el objeto Unicode. Se puede usar para almacenar y manipular datos Unicode (consulte http://www.unicode.org) y se integra bien con los objetos de cadena existentes, proporcionando conversiones autom�ticas si se da el caso.

La codificaci�n Unicode tiene la ventaja de proporcionar un ordinal para cada sistema de escritura utilizado en textos antiguos y modernos. Anteriormente, hab�a s�lo 256 ordinales para los caracteres escritos y se sol�a asociar los textos a una p�gina de c�digos, que hac�a corresponder los ordinales con los caracteres escritos. Esto llevaba a una gran confusi�n, especialmente en lo relativo a la internacionalizaci�n (com�nmente escrito "i18n" -- "i" + 18 characters + "n") del software. Unicode resuelve estos problemas definiendo una p�gina de c�digos �nica para todos los sistemas de escritura.

Crear cadenas Unicode en Python es tan simple como crear cadenas normales:

>>> u'Muy buenas'
u'Muy buenas'

La "u" min�scula frente a la comilla indica que se ha de crear una cadena Unicode. Si deseas incluir caracteres especiales dentro de la cadena, lo puedes hacer mediante la codificaci�n Unicode-Escape de Python. El siguiente ejemplo muestra c�mo:

>>> u'Muy\\u0020buenas'
u'Muy buenas'

La secuencia de escape
u0020
indica que se ha de insertar el car�cter Unicode con ordinal hexadecimal 0x0020 (el espacio) en la posici�n indicada.

El resto de los caracteres se interpretan utilizando sus ordinales respectivos directamente como ordinales Unicode. Como ocurre que los primeros 256 ordinales de Unicode coinciden con la codificaci�n est�ndar Latin-1 utilizada en muchos pa�ses occidentales3.1, el proceso de introducir Unicode se ve muy simplificado.

Para los expertos, existe tambi�n un modo en bruto, como para las cadenas normales. Se debe preceder la cadena con una "r" min�scula para que Python utilice la codificaci�n En bruto-Unicode-Escape. S�lo aplicar� la conversi�n citada
uXXXX
si hay un n�mero impar de barras invertidas frente a la "u".

>>> ur'Muy\u0020buenas'
u'Muy buenas'
>>> ur'Muy\\u0020buenas'
u'Muy\\\\u0020buenas'

El modo en bruto es �til cuando hay que meter gran cantidad de barras invertidas, como en las expresiones regulares.

Adem�s de estas codificaciones est�ndar, Python proporciona un conjunto completo de modos de crear cadenas Unicode bas�ndose en una codificaci�n conocida.

La funci�n interna unicode() proporciona acceso a todos los codecs (codificadores/descodificadores) Unicode registrados. Algunas de las codificaciones m�s conocidas a las que pueden convertir estos codecs son Latin-1, ASCII, UTF-8 y UTF-16. Los �ltimos dos son codificaciones de longitud variable que permiten almacenar caracteres Unicode de 8 o 16 bits. Python usa UTF-8 como codificaci�n por defecto. �sto se hace patente cuando se presentan cadenas Unicode o se escriben en ficheros.

>>> u"���"
u'\344\366\374'
>>> str(u"���")
'\303\244\303\266\303\274'

Si tienes datos en una codificaci�n espec�fica y quieres obtener la correspondiente cadena Unicode a partir de ellos, puedes usar la funci�n interna unicode() con el nombre de la codificaci�n como segunod argumento.

>>> unicode('\303\244\303\266\303\274','UTF-8')
u'\344\366\374'

Para reconvertir la cadena Unicode a una cadena con la codificaci�n original, los objetos proporcionan un m�todo encode().

>>> u"���".encode('UTF-8')
'\303\244\303\266\303\274'


3.1.4 Listas

Python utiliza varios tipos de datos compuestos, que se utilizan para agrupar otros valores. El m�s vers�til es la lista, que se puede escribir como una lista de valores (elementos) separada por comas entre corchetes. Los elementos de una lista no tienen que ser todos del mismo tipo.

>>> a = ['fiambre', 'huevos', 100, 1234]
>>> a
['fiambre', 'huevos', 100, 1234]

Como los �ndices de las cadenas, los �ndices de una lista empiezan en cero. Las listas tambi�n se pueden cortar, concatenar, etc.:

>>> a[0]
'fiambre'
>>> a[3]
1234
>>> a[-2]
100
>>> a[1:-1]
['huevos', 100]
>>> a[:2] + ['bacon', 2*2]
['fiambre', 'huevos', 'bacon', 4]
>>> 3*a[:3] + ['�Hey!']
['fiambre', 'huevos', 100, 'fiambre', 'huevos', 100, 'fiambre', 'huevos', 100, '�Hey!']

A diferencia de las cadenas, que son inmutables, es posible cambiar los elementos de una lista:

>>> a
['fiambre', 'huevos', 100, 1234]
>>> a[2] = a[2] + 23
>>> a
['fiambre', 'huevos', 123, 1234]

Se puede asignar a un corte, lo que puede hasta cambiar el tama�o de la lista:

>>> # Reemplazar elementos:
... a[0:2] = [1, 12]
>>> a
[1, 12, 123, 1234]
>>> # Quitar elementos:
... a[0:2] = []
>>> a
[123, 1234]
>>> # Insertar cosas:
... a[1:1] = ['puaj', 'xyzzy']
>>> a
[123, 'puaj', 'xyzzy', 1234]
>>> a[:0] = a     # Insertarse (una copia) al principio de ella misma
>>> a
[123, 'puaj', 'xyzzy', 1234, 123, 'puaj', 'xyzzy', 1234]

La funci�n interna len() se aplica tambi�n a las listas:

>>> len(a)
8

Es posible anidar listas (crear listas que contienen otras listas), por ejemplo:

>>> q = [2, 3]
>>> p = [1, q, 4]
>>> len(p)
3
>>> p[1]
[2, 3]
>>> p[1][0]
2
>>> p[1].append('xtra')     # Consulte la secci�n 5.1
>>> p
[1, [2, 3, 'xtra'], 4]
>>> q
[2, 3, 'xtra']

Observa que, en el �ltimo ejemplo, �p[1] y q se refieren en realidad al mismo objeto! Volveremos al tema de la sem�ntica de objetos m�s tarde.


3.2 Primeros pasos programando

Por supuesto, se puede usar Python para tareas m�s complejas que sumar dos y dos. Por ejemplo, podemos escribir una secuencia parcial de la serie de Fibonacci3.2 de este modo:

>>> # Serie de Fibonacci:
... # La suma de dos elementos nos da el siguiente
... a, b = 0, 1
>>> while b < 10:
...       print b
...       a, b = b, a+b
... 
1
1
2
3
5
8

Este ejemplo introduce varias caracter�sticas nuevas.



Notas al pie

... occidentales3.1
En Espa�a, Windows utiliza WinANSI, que es muy parecido a Latin-1. MS-DOS y Windows en consola utilizan una codificaci�n propia, denominada OEM a veces, en la que no coinciden algunos caracteres, en concreto las letras acentuadas). Supongo que esto coincide con otros pa�ses en los que se habla castellano. Las distribuciones de Linux actuales (2000) utilizan Latin-1 siempre.
...Fibonacci3.2
La serie de Fibonacci (matem�tico italiano del siglo XIII) se caracteriza porque cada elemento es la suma de los dos anteriores, excepto los dos primeros, que son 0 y 1

Ver Sobre este documento... para obtener informaci�n sobre sugerencias.