Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Apunte Python PDF
Apunte Python PDF
Gonzalo Soriano
gsoriano@f i.uba.ar
30 de junio de 2009
1. Lenguaje interpretado
1.1. Diferencias entre un lenguaje interpretado y uno com-
pilado
Las computadoras entienden un solo lenguaje; binario (también llamado
lenguaje de máquina) por lo que al compilar un programa lo que hacemos es
traducir ese código que nosotros escribimos en un lenguaje de alto nivel a algo
que ella pueda interpretar.
Las principales ventajas de usar un lenguaje compilado son que:
Independencia del lenguaje: Una vez que compilamos el código fuente y
generamos el archivo binario, dejamos de depender del lenguaje en que se
implemento el programa. Si copiamos ese ejecutable a una computadora
que tenga una arquitectura igual a la máquina donde se lo compiló, éste
puede correr sin necesidad del compilador.
Velocidad de ejecución: Al traducir el código fuente al lenguaje nativo
de la computadora logramos que ella lo entienda directamente y pueda
ejecutarlo con mayor velocidad.
1
Una alternativa a usar un lenguaje compilado, es usar un lenguaje interpre-
tado. Las computadoras siguen entendiendo un único lenguaje, pero ahora lo
que se hace es usar un lenguaje compilado para crear un interprete (también
conocido como máquina virtual ), el cual estará entre nuestro código fuente y
la computadora cumpliendo la función de todo interprete: traducir solo lo que
necesita de un lenguaje a otro. Acá surge la primer diferencia con un lenguaje
compilado; solo traduce lo que necesita en ese momento. Por este motivo es que
puede ser que una porción del código nunca sea traducida al lenguaje máquina.
Como contra, al traducir en el momento y no guardar esas traducciones, puede
suceder que una porción del código lo traduzca varias veces.
Las ventajas de un lenguaje interpretado son:
Independencia de la plataforma: Si queremos correr nuestro programa en
otra computadora, no tenemos que preocuparnos de que la plataforma
sea igual a la nuestra. Solo tenemos que asegurarnos que tenga instal-
ado un interprete para esa plataforma. Y si en un futuro se crea una
nueva plataforma totalmente revolucionaria que tenga un interprete de
ese lenguaje nuestro programa no deberı́a modificarse en una sola lı́nea y
seguir funcionando perfectamente.
Agilidad en el desarrollo: Como no tenemos que compilar el programa
para hacer pruebas (solo tenemos que correrlo sobre el intérprete) es más
rápido para hacer pruebas y continuar con el desarrollo o buscar el error.
Este tipo de lenguajes tampoco es perfecto y, por supuesto, también tiene
desventajas:
Dependencia del lenguaje: Como en los lenguajes compilados la indepen-
dencia del lenguaje creaba una dependencia de la plataforma; en este caso
pasa lo contrario. La independencia de la plataforma la tenemos porque
todo corre sobre la maquina virtual, por lo que sin interprete, no se puede
correr el programa.
Lentitud en la ejecución: Como toda instrucción tiene que pasar por el
interpreté, para que éste la traduzca y luego se ejecute es, un poco, más
lento que los programas compilados.
2
Agilidad en el desarrollo II: rápido para programar la simplicidad del
lenguaje y por las herramientas que contamos.
La traducción serı́a 1 :
1 http://es.wikipedia.org/wiki/Python
3
1. Bello es mejor que feo.
2. Explı́cito es mejor que implı́cito.
14. Aunque esa manera puede no ser obvia al principio a menos que usted sea
Holandés
15. Ahora es mejor que nunca.
16. Aunque nunca es a menudo mejor que ya.
4
1.3. Estructura de un programa en Python
La estructura de un programa en Python no es tan estricta como puede serlo
en Pascal o en C/C++, ya que no debe comenzar con ninguna palabra reserva-
da, ni con un procedimiento o función en particular. Simplemente con escribir
un par de lı́neas de código ya podrı́amos decir que tenemos un programa en
Python.
Lo que es importante destacar es la forma de identificar los distintos bloques de
código. En Pascal se definı́a un bloque de código usando las palabras reservadas
Begin y End; en C/C++ se define mediante el uso de las llaves ({ y }). Sin em-
bargo, en Python, se utiliza la indentación; es decir, la cantidad de espacios/tabs
que hay entre el comienzo de la lı́nea y el primer carácter distinto a ellos.
5
Y ahora vamos a multiplicar todos los elementos de la lista por 2.
$ python
Python 2.5.2 (r252:60911, Jan 4 2009, 17:40:26)
Type "help", "copyright", "credits" or "license" for more information.
>>> lista = [1, 2, "12", "34", [5, 6]]
>>> print lista
[1, 2, ’12’, ’34’, [5, 6]]
>>> for elemento in lista:
... print elemento*2
Ahora tenemos que dejar una lı́nea en blanco para que el interprete ejecute
nuestro código.
$ python
Python 2.5.2 (r252:60911, Jan 4 2009, 17:40:26)
Type "help", "copyright", "credits" or "license" for more information.
>>> lista = [1, 2, "12", "34", [5, 6]]
>>> print lista
[1, 2, ’12’, ’34’, [5, 6]]
>>> for elemento in lista:
... print elemento*2
...
2
4
1212
3434
[5, 6, 5, 6]
>>>
Vemos que al multiplicar un número por 2, nos devuelve el doble del valor
original. Lo mismo hace con el resto de los datos, si multiplicamos una cadena
de caracteres nos repite la misma secuencia de caracteres y los concatena. Para
una lista, crea una lista igual y también la concatena a la primera.
Para salir del interprete solo hay que escribir exit(), o en linux apretar Control+
D. Si ahora queremos hacer un programa que haga exactamente lo mismo, po-
drı́amos crear un archivo llamado ejemplo.py y que su contenido sea:
$python ejemplo.py
Y la salida serı́a:
6
$python ejemplo.py
[1, 2, ’12’, ’34’, [5, 6]]
2
4
1212
3434
[5, 6, 5, 6]
Para leer valores ingresados desde el teclado podemos usar la función raw_input,
la cual puede recibir una cadena de caracteres a imprimir, lee el valor ingresado
y lo retorna como un string.
1.4.1. Comentarios
Hay dos reglas que no se deben olvidar nunca:
7
# A todo elemento de la lista lo multiplico por 2 y lo imprimo.
for elemento in lista:
print elemento*2 # Esto también es un comentario
# Y esto.
8
>>> boolean = True
>>> boolean = False
>>> print True and False
False
>>> print True or False
True
>>> print not True
False
>>> print not False
True
>>> type(boolean)
<type ’bool’>
Funciones disponibles:
>>> dir(True)
[’__abs__’, ’__add__’, ’__and__’, ’__class__’, ’__cmp__’, ’__coerce__’,
’__delattr__’, ’__div__’, ’__divmod__’, ’__doc__’, ’__float__’, ’__floordiv__’,
’__getattribute__’, ’__getnewargs__’, ’__hash__’, ’__hex__’, ’__index__’,
’__init__’, ’__int__’, ’__invert__’, ’__long__’, ’__lshift__’, ’__mod__’,
’__mul__’, ’__neg__’, ’__new__’, ’__nonzero__’, ’__oct__’, ’__or__’, ’__pos__’,
’__pow__’, ’__radd__’, ’__rand__’, ’__rdiv__’, ’__rdivmod__’, ’__reduce__’,
’__reduce_ex__’, ’__repr__’, ’__rfloordiv__’, ’__rlshift__’, ’__rmod__’,
’__rmul__’, ’__ror__’, ’__rpow__’, ’__rrshift__’, ’__rshift__’, ’__rsub__’,
’__rtruediv__’, ’__rxor__’, ’__setattr__’, ’__str__’, ’__sub__’, ’__truediv__’,
’__xor__’]
Funciones disponibles:
>>> dir(5)
[’__abs__’, ’__add__’, ’__and__’, ’__class__’, ’__cmp__’, ’__coerce__’,
’__delattr__’, ’__div__’, ’__divmod__’, ’__doc__’, ’__float__’, ’__floordiv__’,
’__getattribute__’, ’__getnewargs__’, ’__hash__’, ’__hex__’, ’__index__’,
’__init__’, ’__int__’, ’__invert__’, ’__long__’, ’__lshift__’, ’__mod__’,
’__mul__’, ’__neg__’, ’__new__’, ’__nonzero__’, ’__oct__’, ’__or__’, ’__pos__’,
’__pow__’, ’__radd__’, ’__rand__’, ’__rdiv__’, ’__rdivmod__’, ’__reduce__’,
’__reduce_ex__’, ’__repr__’, ’__rfloordiv__’, ’__rlshift__’, ’__rmod__’,
’__rmul__’, ’__ror__’, ’__rpow__’, ’__rrshift__’, ’__rshift__’, ’__rsub__’,
’__rtruediv__’, ’__rxor__’, ’__setattr__’, ’__str__’, ’__sub__’, ’__truediv__’,
’__xor__’]
Tipo: Entero largo (long). Se le agrega una L al final para diferenciarlo de
los enteros cortos.
Ejemplo:
9
>>> entero = 5L
>>> type(entero)
<type ’long’>
Funciones disponibles:
>>> dir(5L)
[’__abs__’, ’__add__’, ’__and__’, ’__class__’, ’__cmp__’, ’__coerce__’,
’__delattr__’, ’__div__’, ’__divmod__’, ’__doc__’, ’__float__’, ’__floordiv__’,
’__getattribute__’, ’__getnewargs__’, ’__hash__’, ’__hex__’, ’__index__’,
’__init__’, ’__int__’, ’__invert__’, ’__long__’, ’__lshift__’, ’__mod__’,
’__mul__’, ’__neg__’, ’__new__’, ’__nonzero__’, ’__oct__’, ’__or__’, ’__pos__’,
’__pow__’, ’__radd__’, ’__rand__’, ’__rdiv__’, ’__rdivmod__’, ’__reduce__’,
’__reduce_ex__’, ’__repr__’, ’__rfloordiv__’, ’__rlshift__’, ’__rmod__’,
’__rmul__’, ’__ror__’, ’__rpow__’, ’__rrshift__’, ’__rshift__’, ’__rsub__’,
’__rtruediv__’, ’__rxor__’, ’__setattr__’, ’__str__’, ’__sub__’, ’__truediv__’,
’__xor__’]
Tipo: Complejo (complex)
Ejemplo:
>>> complejo = 3 + 5j
>>> complejo += 1 - 2j
>>> print complejo
(4+3j)
>>> complejo *= 1 - 2j
>>> print complejo
(10-5j)
>>> type(complejo)
<type ’complex’>
Funciones disponibles:
>>> dir(5+3j)
[’__abs__’, ’__add__’, ’__class__’, ’__coerce__’, ’__delattr__’, ’__div__’,
’__divmod__’, ’__doc__’, ’__eq__’, ’__float__’, ’__floordiv__’, ’__ge__’,
’__getattribute__’, ’__getnewargs__’, ’__gt__’, ’__hash__’, ’__init__’,
’__int__’, ’__le__’, ’__long__’, ’__lt__’, ’__mod__’, ’__mul__’, ’__ne__’,
’__neg__’, ’__new__’, ’__nonzero__’, ’__pos__’, ’__pow__’, ’__radd__’,
’__rdiv__’, ’__rdivmod__’, ’__reduce__’, ’__reduce_ex__’, ’__repr__’,
’__rfloordiv__’, ’__rmod__’, ’__rmul__’, ’__rpow__’, ’__rsub__’, ’__rtruediv__’,
’__setattr__’, ’__str__’, ’__sub__’, ’__truediv__’, ’conjugate’, ’imag’, ’real’]
Tipo: Real o flotante (f loat)
Ejemplo:
10
>>> dir(3.5)
[’__abs__’, ’__add__’, ’__class__’, ’__coerce__’, ’__delattr__’, ’__div__’,
’__divmod__’, ’__doc__’, ’__eq__’, ’__float__’, ’__floordiv__’, ’__ge__’,
’__getattribute__’, ’__getformat__’, ’__getnewargs__’, ’__gt__’, ’__hash__’,
’__init__’, ’__int__’, ’__le__’, ’__long__’, ’__lt__’, ’__mod__’, ’__mul__’,
’__ne__’, ’__neg__’, ’__new__’, ’__nonzero__’, ’__pos__’, ’__pow__’, ’__radd__’,
’__rdiv__’, ’__rdivmod__’, ’__reduce__’, ’__reduce_ex__’, ’__repr__’,
’__rfloordiv__’, ’__rmod__’, ’__rmul__’, ’__rpow__’, ’__rsub__’, ’__rtruediv__’,
’__setattr__’, ’__setformat__’, ’__str__’, ’__sub__’, ’__truediv__’]
Tipo: Cadena de caracteres o String (string)
Ejemplo:
>>> cadena = "esta es una cadena de caracteres"
>>> type(cadena)
<type ’str’>
Funciones disponibles:
>>> dir("cadena")
[’__add__’, ’__class__’, ’__contains__’, ’__delattr__’, ’__doc__’, ’__eq__’,
’__ge__’, ’__getattribute__’, ’__getitem__’, ’__getnewargs__’, ’__getslice__’,
’__gt__’, ’__hash__’, ’__init__’, ’__le__’, ’__len__’, ’__lt__’, ’__mod__’,
’__mul__’, ’__ne__’, ’__new__’, ’__reduce__’, ’__reduce_ex__’, ’__repr__’,
’__rmod__’, ’__rmul__’, ’__setattr__’, ’__str__’, ’capitalize’, ’center’,
’count’, ’decode’, ’encode’, ’endswith’, ’expandtabs’, ’find’, ’index’,
’isalnum’, ’isalpha’, ’isdigit’, ’islower’, ’isspace’, ’istitle’, ’isupper’,
’join’, ’ljust’, ’lower’, ’lstrip’, ’partition’, ’replace’, ’rfind’, ’rindex’,
’rjust’, ’rpartition’, ’rsplit’, ’rstrip’, ’split’, ’splitlines’, ’startswith’,
’strip’, ’swapcase’, ’title’, ’translate’, ’upper’, ’zfill’]
Tipo: Unicode (unicode)
Ejemplo:
>>> cadena = u"esta cadena es de tipo Unicode"
>>> type(cadena)
<type ’unicode’>
Funciones disponibles:
>>> dir(u"cadena unicode")
[’__add__’, ’__class__’, ’__contains__’, ’__delattr__’, ’__doc__’, ’__eq__’,
’__ge__’, ’__getattribute__’, ’__getitem__’, ’__getnewargs__’, ’__getslice__’,
’__gt__’, ’__hash__’, ’__init__’, ’__le__’, ’__len__’, ’__lt__’, ’__mod__’,
’__mul__’, ’__ne__’, ’__new__’, ’__reduce__’, ’__reduce_ex__’, ’__repr__’,
’__rmod__’, ’__rmul__’, ’__setattr__’, ’__str__’, ’capitalize’, ’center’,
’count’, ’decode’, ’encode’, ’endswith’, ’expandtabs’, ’find’, ’index’, ’isalnum’,
’isalpha’, ’isdecimal’, ’isdigit’, ’islower’, ’isnumeric’, ’isspace’, ’istitle’,
’isupper’, ’join’, ’ljust’, ’lower’, ’lstrip’, ’partition’, ’replace’, ’rfind’,
’rindex’, ’rjust’, ’rpartition’, ’rsplit’, ’rstrip’, ’split’, ’splitlines’,
’startswith’, ’strip’, ’swapcase’, ’title’, ’translate’, ’upper’, ’zfill’]
Tipo: Listas (list). Una lista es un vector de elementos que no necesaria-
mente tienen que ser todos del mismo tipo.
Ejemplo:
11
>>> lista = ["Elemento1", "Elemento2", 3, 4, 3.5, u"Unicode String", type(5),
5L, [1, 2, 3]]
>>> type(lista)
<type ’list’>
Funciones disponibles:
>>> dir([])
[’__add__’, ’__class__’, ’__contains__’, ’__delattr__’, ’__delitem__’,
’__delslice__’, ’__doc__’, ’__eq__’, ’__ge__’, ’__getattribute__’, ’__getitem__’,
’__getslice__’, ’__gt__’, ’__hash__’, ’__iadd__’, ’__imul__’, ’__init__’,
’__iter__’, ’__le__’, ’__len__’, ’__lt__’, ’__mul__’, ’__ne__’, ’__new__’,
’__reduce__’, ’__reduce_ex__’, ’__repr__’, ’__reversed__’, ’__rmul__’,
’__setattr__’, ’__setitem__’, ’__setslice__’, ’__str__’, ’append’, ’count’,
’extend’, ’index’, ’insert’, ’pop’, ’remove’, ’reverse’, ’sort’]
Tipo: Tuplas (tuple). Las tuplas son listas inmutables. Es decir, listas que
una vez que se crean, no se pueden modificar.
Ejemplo:
>>> tupla = ("Elemento1", "Elemento2", 3, 4, 3.5, u"Unicode String", type(5),
5L, [1, 2, 3])
>>> type(tupla)
<type ’tuple’>
Funciones disponibles:
>>> dir(())
[’__add__’, ’__class__’, ’__contains__’, ’__delattr__’, ’__doc__’, ’__eq__’,
’__ge__’, ’__getattribute__’, ’__getitem__’, ’__getnewargs__’, ’__getslice__’,
’__gt__’, ’__hash__’, ’__init__’, ’__iter__’, ’__le__’, ’__len__’, ’__lt__’,
’__mul__’, ’__ne__’, ’__new__’, ’__reduce__’, ’__reduce_ex__’, ’__repr__’,
’__rmul__’, ’__setattr__’, ’__str__’]
Funciones disponibles:
12
>>> dir({})
[’__class__’, ’__cmp__’, ’__contains__’, ’__delattr__’, ’__delitem__’, ’__doc__’,
’__eq__’, ’__ge__’, ’__getattribute__’, ’__getitem__’, ’__gt__’, ’__hash__’,
’__init__’, ’__iter__’, ’__le__’, ’__len__’, ’__lt__’, ’__ne__’, ’__new__’,
’__reduce__’, ’__reduce_ex__’, ’__repr__’, ’__setattr__’, ’__setitem__’,
’__str__’, ’clear’, ’copy’, ’fromkeys’, ’get’, ’has_key’, ’items’, ’iteritems’,
’iterkeys’, ’itervalues’, ’keys’, ’pop’, ’popitem’, ’setdefault’, ’update’,
’values’]
>>> float("12")
12.0
>>> float("12.5723")
12.5723
>>> float("12.7")
12.699999999999999
13
>>> float("1e")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): 1e
>>>
También se le puede pasar un número entero y lo convierte a flotante:
>>> float(12)
12.0
Para convertir cualquier variable a string podemos usar la función str() que
recibe cualquier cosa y hace su mejor intento para convertirla. A diferencia del
resto, esta función nunca va a fallar por no saber cómo convertir algo. Puede
pasar que con algún tipo en particular no nos devuelva el resultado que quere-
mos, pero seguro que nos va a devolver una representación de lo que le pasamos
en string.
>>> str(5)
’5’
>>> str(5.4)
’5.4’
>>> str(5L)
’5’
>>> str(True)
’True’
>>> str()
’’
>>> str([1, 2, 3, "uno"])
"[1, 2, 3, ’uno’]"
>>> str([1, 2, 3, "uno", 5.7])
"[1, 2, 3, ’uno’, 5.7000000000000002]"
>>> str((1, 2, 3, "uno", 5.7))
"(1, 2, 3, ’uno’, 5.7000000000000002)"
>>> str({1:"uno", 2:"dos", 3:"tres"})
"{1: ’uno’, 2: ’dos’, 3: ’tres’}"
Una alternativa para insertar valores en un string es, al que en C, indican-
do en la cadena donde queremos que vaya con un % y después pasar todos los
parámetros juntos. Al igual que en C, cuando marcamos la posición donde quer-
emos que se ingrese algún valor, también vamos a tener que indicar el tipo de
ese parámetro; y ellos pueden ser:
14
Indicador Tipo:
%c Solo un carácter.
%s Cadena de caracteres.
%d o %i o %u 0 %ld 0 %lu Entero con signo.
%nd Entero con signo ocupando n3 espacios.
%.nd Entero con signo ocupando n lugares, completando con 0.
%f Float o real.
%.nf Float o real con solo n decimales.
%e Float o double, con notación cientı́fica.
%.ne Float o double, con notación cientı́fica, con solo n decimales.
%g Coma flotante, usando la notación que requiera menor espacio.
%x Hexadecimal.
Algunos ejemplos:
>>> print "%c" % ’s’
s
>>> print "%c" % ’ss’
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: %c requires int or char
>>> print "%s" % ’ss’
ss
>>> "%d" % 5
’5’
>>> "%d" % -5
’-5’
>>> "%0.2d" % 5
’05’
>>> "%5d" % 5
’ 5’
>>> ’ 5 5 5 5 5 0005 0005’
’ 5 5 5 5 5 0005 0005’
>>> " %d %i %s %ld %lu %0.4d %4d" % (5, 5, 5, 5, 5, 5, 5)
’ 5 5 5 5 5 0005 5’
>>> " %d %i %s %ld %lu %0.4d %4d" % (-5, -5, -5, -5, -5, -5, -5)
’ -5 -5 -5 -5 -5 -0005 -5’
>>> " %d %i %s %ld %lu %0.4d %4d" % (5L, 5L, 5L, 5L, 5L, 5L, 5L)
’ 5 5 5 5 5 0005 5’
>>> "%f" % -5
’-5.000000’
>>> "%.2f" % -5.345
’-5.34’
>>> "%x" % 123
’7b’
>>> "%x" % -123
’-7b’
>>>
Además se pueden mezclar con los siguientes caracteres:
15
Carácter Descripción
\n Carácter fin de lı́nea.
\r Carácter retorno del carro.
\t Carácter tabulador horizontal.
\v Carácter tabulador vertical.
\a Timbre.
\\ Barra invertida.
\" Comillas.
\’ Apóstrofe.
Algunos ejemplos:
Si lo que queremos es juntar todas las palabras de una lista o tupla podemos
usar la función join() de la siguiente forma:
16
[’Hola’, ’mundo’, ’’]
>>> "Hola,mundo".split(",")
[’Hola’, ’mundo’]
>>> "Hola mundo ".split()
[’Hola’, ’mundo’]
También se puede obtener partes de un string indicando su posición respecto
del inicio o el rango que se desea obtener. Para indicar un rango se pone primero
la posición del comienzo, después un separador que será el : y por último la
posición del final. Si no se le pasa la posición donde comienza el rango, asume
que ese valor es 0; y si la posición que no se le pasa es la del final, asume que es
hasta el final del string.
>>> "Hola mundo"[2]
’l’
>>> "Hola mundo"[2:4]
’la’
>>> "Hola mundo"[2:3]
’l’
>>> "Hola mundo"[0:4]
’Hola’
>>> "Hola mundo"[:4]
’Hola’
>>> "Hola mundo"[5:]
’mundo’
Ası́ como podemos saber la posición desde el inicio de la cadena de carac-
teres, también podemos indicar la posición respecto del último carácter:
Cadena de caracteres: H o l a m u n d o
Posición desde el inicio: 0 1 2 3 4 5 6 7 8 9
Posición desde el final: -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
Al igual que con los strings, también se le pueden especificar rangos y posi-
ciones para las listas y tuplas.
17
15
>>> [3, 5, 1, 7, 15, 11][1:3]
[5, 1]
>>> [3, 5, 1, 7, 15, 11][1:5]
[5, 1, 7, 15]
>>> [3, 5, 1, 7, 15, 11][1:-1]
[5, 1, 7, 15]
>>> (3, 5, 1, 7, 15, 11)[4]
15
>>> (3, 5, 1, 7, 15, 11)[-2]
15
>>> (3, 5, 1, 7, 15, 11)[1:3]
(5, 1)
>>> (3, 5, 1, 7, 15, 11)[1:5]
(5, 1, 7, 15)
Una forma muy sencilla de crear una lista con valores consecutivos es usando
la función range([piso], techo); que puede recibir uno o dos parámetros. Si se
le pasa un solo parámetro la función devuelve una lista que tendrá todos los
números que sean iguales o mayores a 0 y menores a ese número.
>>> range(3)
[0, 1, 2]
>>> range(-1)
[]
>>> range(3,7)
[3, 4, 5, 6]
>>> range(-7,-1)
[-7, -6, -5, -4, -3, -2]
Otras funciones útiles son las que convierten a listas (list()) o tuplas (tuple()),
y pueden hacerlo desde una lista, una tupla, un string o un diccionario (en este
caso solo obtendremos sus claves).
18
[1, 2, 3]
>>> list([1,2,3,4])
[1, 2, 3, 4]
>>> list("Hola mundo.")
[’H’, ’o’, ’l’, ’a’, ’ ’, ’m’, ’u’, ’n’, ’d’, ’o’, ’.’]
>>> list({1:"uno", 2:"dos", 3:"tres"})
[1, 2, 3]
Otra forma de obtener una lista con todas las claves de un diccionario es a través
de la función keys().
>>> {1:"uno", 2:"dos", 3:"tres"}.keys()
[1, 2, 3]
Y si podemos obtener sus claves, también podemos obtener los valores asociados
a esas claves. Para esto tendremos que hacer uso de la función values()
>>> {1:"uno", 2:"dos", 3:"tres"}.values()
[’uno’, ’dos’, ’tres’]
19
Return the lowest index in S where substring sub is found,
such that sub is contained within s[start:end]. Optional
arguments start and end are interpreted as in slice notation.
Return -1 on failure.
Y por último, nos queda la función help() que al invocarla nos muestra las
funciones para manipular esa variable con una descripción similar a la que nos
da __doc__
>>> help("string")
NAME
string - A collection of string operations (most are no longer used).
FILE
/usr/lib/python2.5/string.py
MODULE DOCS
http://www.python.org/doc/current/lib/module-string.html
DESCRIPTION
Warning: most of the code you see here isn’t normally used nowadays.
Beginning with Python 1.6, many of these functions are implemented as
methods on the standard string object. They used to be implemented by
a built-in module called strop, but strop is now obsolete itself.
...
CLASSES
__builtin__.object
Template
class Template(__builtin__.object)
| A string class for supporting $-substitutions.
|
| Methods defined here:
|
| __init__(self, template)
|
| safe_substitute(self, *args, **kws)
|
| substitute(self, *args, **kws)
|
| ...
20
FUNCTIONS
atof(s)
atof(s) -> float
atoi(s, base=10)
atoi(s [,base]) -> int
atol(s, base=10)
atol(s [,base]) -> long
...
find(s, *args)
find(s, sub [,start [,end]]) -> in
Return -1 on failure.
...
3. Estructuras de control
3.1. Equivalencias de estructuras de control entre Python,
Pascal y C
Al igual que los lenguajes vistos, en Python también existen estructuras para
controlar el flujo del código que se va a ejecutar.
3.1.1. if
La estructura selectiva if es similar a las vistas, pero a diferencia de Pascal o
C, ya no se marca el bloque de ejecución con un Begin ... end o unas { ... }
sino que se utiliza la indentación.
Pascal
if (condición) then
acción;
o
21
if (condición) then
begin
acción1;
acción2;
...
acciónN;
end;
C
if (condición)
acción;
o
if (condición)
{
acción1;
acción2;
...
acciónN;
}
Python
if (condición):
acción1;
acción2;
...
acciónN;
A diferencia de Pascal y C, en Python no hay diferencia entre poner una sola
acción o varias. Además, es obligatorio que las acciones estén todas equidistantes
del comienzo de la lı́nea y a su vez, que esa distancia sea mayor que la distancia
del inicio al if .
>>> if 3<4:
... print 1
... print 2
File "<stdin>", line 3
print 2
^
IndentationError: unindent does not match any outer indentation level
>>> if 3<4:
... print 0
File "<stdin>", line 2
print 0
^
IndentationError: expected an indented block
Otra diferencia es que para comparar si un valor se encuentra dentro de un
rango se puede hacer de una forma más sencilla:
Pascal
22
if 3 > 2 and 2 > 1 then
writeln(’2 esta entre 3 y 1.’);
C
if ((3 > 2) && (2 > 1))
printf("2 esta entre 3 y 1.");
Python
if a > b:
print "a es mayor que b"
else:
print "b es mayor que a"
Para que esto quede mas compacto y, tal vez, más comprensible, Python nos
da la posibilidad de expresar los else − if poniendo simplemente elif :
23
Y como si todo esto fuera poco, también se puede puede preguntar si un
valor esta en una lista. Con los lenguajes que vimos hasta el momento, para
saber si un elemento pertenece a una lista tenı́amos que recorrerla toda (o por
lo menos hasta encontrarlo) y fijarnos uno por uno si es lo que buscábamos. En
Python es tan sencillo como preguntar si un elemento esta en una lista:
>>> l = range(-7,-1)
>>> if -2 in l:
... print "OK"
... else:
... print "No OK"
...
OK
>>> if 2 in l:
... print "OK"
... else:
... print "No OK"
...
No OK
Otra forma de usar el if es como se usa el operador ’?’ en C.
>>> num = 5
>>> espar = True if (num % 2 == 0) else False
>>> print espar
False
>>> num = 6
>>> espar = True if (num % 2 == 0) else False
>>> print espar
True
3.1.2. case
En Python no existe una estructura como serı́an el case en Pascal o el switch
en C y es porque no se lo usa tanto. Además, podemos usar los if anidados para
obtener una estructura aún más potente que un simple discriminador de valores
de una única variable.
3.1.3. for
Aquı́ se encuentra la estructura con mayor diferencia entre los 3 lenguajes
vistos en el curso. Por un lado, en Pascal tenemos una estructura que es muy
simple de entender, casi como uno lo dirı́a, pero muy limitada:
24
accion1;
acción2;
...
accionN;
end;
Por otro lado, en C esta misma estructura es mucho más potente, pero a
costa de sacrificar un poco de legibilidad:
Por lo que Python adoptó una tercer forma tratando capturar lo mejor de
cada una de ellas; siempre priorizando la claridad del código.
Por lo que ahora, recorrer todos los elementos de una lista y trabajar con
ellos (por ejemplo imprimir el doble de cada uno) es más fácil.
for i in range(50):
print i
Para imprimir los números que van del 20 al 30:
25
for i in range(20, 31):
print i
Recordemos que cuando invocamos la función range nos devuelve una lista
que tiene todos los valores comprendidos entre el piso (0 si no se lo pasamos) y
el techo (sin incluir este último).
List comprehensions:
Si ahora queremos combinar todas las letras de una lista con las letra de una
segunda lista también podrı́amos usar list comprehensions:
>>> l1 = ["a", "b", "c"]
>>> l2 = ["d", "e"]
>>> l = [ e1+e2 for e1 in l1 for e2 in l2]
>>> print l
[’ad’, ’ae’, ’bd’, ’be’, ’cd’, ’ce’]
Y por último, vamos a ver como podrı́amos sumar el cuadrado de todos los
elementos pares de una lista con todos los impares de la misma lista.
>>> l = range(5)
>>> [e1**2 + e2**2 for e1 in l if (e1 % 2 == 0) for e2 in l if (e2 % 2 == 1)]
[1, 9, 5, 13, 17, 25]
Y podemos ver que
(1, 9, 5, 13, 17, 25) = (02 + 12 , 02 + 32 , 22 + 12 , 22 + 12 , 22 + 32 , 42 + 12 , 42 + 32 )
El uso de list comprehensions puede ser muy útil (no en los ejemplos que
vimos), pero tengan en cuenta que no siempre el código queda más legible y
entendible para el próximo que lo tenga que leer.
26
3.1.4. while
La estructura que conserva más similitudes a las vistas en Pascal o C es el
while.
while <condición>:
accion1
accion2
...
accionN
Por ejemplo:
27
Ingrese un número: 9
Ingrese un número: 2
Ingrese un número: 15
>>>
3.1.5. repeat
Ası́ como no existe un equivalente para el case, tampoco existe otro para el
repeat de Pascal o el do while de C, y, supongo, que los motivos son similares.
4. Programación modular
4.1. Procedimientos y funciones
Una de las premisas de Python era que ”La legibilidad cuenta”, y el uso de
procedimientos y funciones ayudan mucho en que un código sea legible.
En Python no existen los procedimientos: son todas funciones. Incluso, aunque
nosotros no devolvamos ningún valor, Python lo hará por nosotros.
La forma de devolver valores es, al igual que en C, usando la palabra reservada
return y el valor a retornar. Y de igual forma, una vez que se ejecuta esa sen-
tencia, no se ejecuta ninguna sentencia más de esa función; sin importar si esta
dentro de un ciclo o todavı́a no hayamos hecho nada.
La definición de una función comienza usando la palabra reservada def, y con-
tinua dejando un espacio, poniendo el nombre de la función4 , los parámetros
entre paréntesis5 y un dos puntos para terminar la lı́nea. En las lı́neas que le
siguen va el código de la función, que, al igual que para las estructuras de con-
trol, la forma en que se indica el bloque de código que se tiene que ejecutar es
haciendo uso de la indentación.
28
# Calculo el factorial de 5 y guardo el resultado en la varaible fac_5.
fac_5 = factorial(5)
# Calculo el factorial de 10 sin guardarlo en ninguna variable.
factorial(10)
def factorial_rec(n):
if n == 0:
return 1
else:
return n*factorial_rec(n-1)
Si ahora quisieramos hacer una función que haga la búsqueda binaria sobre
una lista de enteros podrı́amos hacer:
¿Y que pasará si ahora queremos hacer una búsqueda binaria sobre una lista
de strings?.
29
Otra ventaja de Python respecto a Pascal es que, al igual que en C, se pueden
definir valores por defecto para los parámetros de una función. Es decir, si no se
le pasa un valor, ese parámetro toma el valor que definió el programador en el
momento que escribió el código. La forma de hacerlo es igual que en C, simple-
mente hay que ponerle el signo igual seguido del valor por defecto y, en caso de
que la función reciba algún otro parámetro después de él también debe tener un
valor por defecto. Es decir, los parámetros que tienen valores por defecto solo
pueden ocupar las últimas posiciones.
30
>>> resultado = imprimir_parametros(1,2,3,4,5)
1 2 3 4 5
>>> print resultado
None
>>>
31
Error!!!!, Las opciones válidas son: [1, 2, 3]
1
>>>
Una cosa que puede ser muy útil es asignarle una función a una variable,
ya que también existe el tipo de dato función. La forma de hacerlo es similar
a como asignamos el valor de otra variable, a la izquierda ponemos la variable,
luego el signo igual y por último el nombre de la función.
Ahora supongamos que queremos hacer una búsqueda sobre una lista que
esta ordenada en forma descendente, entonces ya no nos servirı́a nada de lo que
tenemos y tendrı́amos que copiar el mismo código cambiando solamente el signo
32
mayor por un menor y tendrı́amos dos funciones casi iguales que solo diferirı́an
en un solo carácter.
Si vamos a tener que usar las dos búsquedas, serı́a conveniente que busquemos
una alternativa que encapsule lo que puede cambiar y mantenga el resto sin
modificaciones. Para lograr esto podrı́amos pasarle a la búsqueda una función
que compare el valor central y la clave e indique si el valor que buscamos se
encuentra a la derecha o izquierda.
33
7
Vemos en el ejemplo anterior que nos da bien la posición ya que nos retorna
la posición número 7; pero que pasará si en lugar de pasarle la función mayor
le pasamos la de menor?.
34
que ser verdadera cuando el primer valor es mayor que la segundo; y falso en
caso contrario.
Si la lista esta ordenada en forma descendente la función que se le pasa tiene
que ser verdadera cuando el primer valor es menor que la segundo; y falso en
caso contrario.
>>> help(binaria)
Help on function binaria in module __main__:
import datetime
Para usarlo simplemente tenemos que poner el nombre del módulo, un punto
y la función que queramos usar. En este caso, dentro del módulo datetime vamos
a usar la función que se encuentra en date y se llama today().
35
>>> from datetime import date, time
>>> print date.today()
2009-06-24
>>> print time(1, 23, 32)
01:23:32
>>>
def imprimir(param):
print param
Como dijimos, también podemos importar solo una función de ese módulo
y usarla como si estuviera en el nuestro.
5. Persistencia de datos
Pero todo lo que vimos por el momento se guarda en memoria dinámica, por
lo que al apagar la computadora, o simplemente con cerrar el programa y volver
a abrirlo perdimos todos los datos que nos tenı́amos. La alternativa para esto
siguen siendo los archivos.
36
5.1.1. Apertura de archivos
Al igual que en C, en Python en el mismo momento que abrimos el archivo, se
lo asignamos a uno fı́sico y elegimos el modo de apertura, que si no le indicamos
nada, tomará por defecto el de lectura.
El modo de apertura puede ser cualquier combinación de:
Modo Descripción
’r’ Lectura: el archivo debe existir. Similar al
reset de Pascal.
’w’ Escritura: no es necesario que el archivo ex-
ista, pero si existe lo sobre escribe. Similar al
rewrite de Pascal.
’a’ Append: Solo agrega al final y no es necesario
que el archivo exista. Similar al append de Pas-
cal.
’b’ Binario.
’+’ Permite lectura y escrituras simultaneas.
La primitiva del lenguaje para abrir y asignar un archivo es open, la cual
puede recibir uno o dos parámetros. El primero es obligatorio, y corresponde
a la ubicación relativa o absoluta del archivo fı́sico. El segundo parámemetro
indica el modo de apertura y es opcional. Si no se lo pasamos asumirá que lo
queremos abrir en modo Lectura.
Supongamos que estamos en un escenario en el que solo tenemos un archivo que
se llama f2.txt y queremos trabajar con los archivos f1.txt, f.txt y f3.txt.
>>> file = open("f1.txt")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: ’f1.txt’
>>> file = open("f1.txt", "w")
>>> file2 = open("f2.txt")
>>> file3 = open("f3.txt", "r+w")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: ’f3.txt’
>>> file3 = open("f3.txt", "w+r")
>>>
Podemos ver que cuando intentamos abrir en modo lectura el archivo f1.txt
falló la aplicación que dice "IOError: No existe el archivo o directorio: f1.txt".
A continuación lo intentamos abrir en modo escritura, que, como dijimos antes,
si no existe lo crea; y eso fue lo que pasó. El archivo no existı́a, pero igual
no tuvimos problemas para abrirlo. Aunque recuerden que si el archivo existe
estarı́amos borrándolo completamente.
Una vez que abrimos el archivo f1.txt, vamos a abrir el archivo f2.txt (el
único que existı́a) de igual forma a como habı́amos abierto el primero para ver
que el problema estaba en la inexistencia de aquel y no en la forma de abrirlo.
Ahora, intentemos abrir en modo lecto-escritura combinando r y w. Si el
archivo no existe, e intentamos primero abrirlo para lectura y después para
escritura nos va a tirar un error similar al que habı́amos tenido al abrir f1.txt,
37
por lo que en este caso es conveniente abrirlo primero para escritura y después
para lectura.
>>> type(file2)
<type ’file’>
>>> file2.close()
>>> file2.close()
>>> file2.close()
>>>
In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team. In October of the same
year, the PythonLabs team moved to Digital Creations (now Zope
Corporation, see http://www.zope.com). In 2001, the Python Software
Foundation (PSF, see http://www.python.org/psf/) was formed, a
non-profit organization created specifically to own Python-related
Intellectual Property. Zope Corporation is a sponsoring member of
the PSF.
38
>>> # Imprimo los primeros 15 caracteres del archivo.
... print cadena
Python was crea
>>> # Leo otros 7 caracteres y dejo el cursor del archivo en la siguiente posición.
... cadena = arch.read(7)
>>> print cadena
ted in
>>> # Ahora leo el resto del archivo.
... cadena = arch.read()
>>> print cadena
the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC. Guido remains Python’s
principal author, although it includes many contributions from others.
In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team. In October of the same
year, the PythonLabs team moved to Digital Creations (now Zope
Corporation, see http://www.zope.com). In 2001, the Python Software
Foundation (PSF, see http://www.python.org/psf/) was formed, a
non-profit organization created specifically to own Python-related
Intellectual Property. Zope Corporation is a sponsoring member of
the PSF.
>>>
La única condición que tenemos para usar este método es que el archivo lo
hayamos abierto en modo lectura.
39
a leer. Si no se le pasa ningún parámetro, lee toda la lı́nea.
Pero no es necesario que leamos de a una sola lı́nea, sino que también pode-
mos leer todas las lı́neas del archivo y guardarlas en una lista haciendo uso de
la primitiva readlines().
40
70
40
>>>
Como se puede ver, en el archivo hay lı́neas que aparentemente no tienen
ningún carácter, y sin embargo, si vemos los números encontramos lı́neas con
0 caracteres. Eso se debe a que en todas las lı́neas podemos encontrar siempre
el carácter de fin de lı́nea que se representa por el \n, pero al momento de
imprimirlo no lo vemos.
41
.Y estas dos lı́neas también con un \n al final
de cada una.
>>>
>>> arch.seek(30)
>>> arch.tell()
30L
>>> arch.seek(-5,1)
>>> arch.tell()
25L
>>> arch.seek(-12,2)
>>> arch.tell()
1132L
>>> print arch.read(10)
42
compatible
>>> arch.tell()
1142L
>>>
>>> arch.name
’ejemplo.txt’
>>> arch.mode
’r’
>>> arch.closed
False
6. Anexo I
6.1. Licencia: GPL
Python posee una licencia de código abierto, denominada Python Software
Foundation License, que es compatible con la licencia GPL a partir de la versión
2.1.1, e incompatible en ciertas versiones anteriores. Esta licencia no obliga a
liberar el código fuente al distribuir los archivos binarios8 .
Para más información pueden tipear license() en el interprete Python.
43
Finished PEPs (done, implemented in code repository)
Deferred, Abandoned, Withdrawn, and Rejected PEPs
6.4. Referencias
http://www.python.org/dev/peps/
http://es.wikipedia.org/wiki/Python
http://www.python.org/
http://diveintopython.org/index.html
http://mundogeek.net/
44
Índice
1. Lenguaje interpretado 1
1.1. Diferencias entre un lenguaje interpretado y uno compilado . . . 1
1.2. Caracterı́sticas de Python . . . . . . . . . . . . . . . . . . . . . . 2
1.2.1. The Zeb of Python . . . . . . . . . . . . . . . . . . . . . . 3
1.3. Estructura de un programa en Python . . . . . . . . . . . . . . . 5
1.4. Interprete Python . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4.1. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . 7
3. Estructuras de control 21
3.1. Equivalencias de estructuras de control entre Python, Pascal y C 21
3.1.1. if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.1.2. case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.1.3. for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.1.4. while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.1.5. repeat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4. Programación modular 28
4.1. Procedimientos y funciones . . . . . . . . . . . . . . . . . . . . . 28
4.2. Uso de módulos externos . . . . . . . . . . . . . . . . . . . . . . . 35
5. Persistencia de datos 36
5.1. Uso de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.1.1. Apertura de archivos . . . . . . . . . . . . . . . . . . . . . 37
5.1.2. Cierre de archivos . . . . . . . . . . . . . . . . . . . . . . 38
5.1.3. Lectura de archivos . . . . . . . . . . . . . . . . . . . . . . 38
5.1.4. Escritura de archivos . . . . . . . . . . . . . . . . . . . . . 41
5.1.5. Moverse en un archivo . . . . . . . . . . . . . . . . . . . . 42
5.1.6. Interrogando un archivo . . . . . . . . . . . . . . . . . . . 43
6. Anexo I 43
6.1. Licencia: GPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.2. Peps (Python Enhancement Proposal o Propuestas de Mejora de
Python) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.3. Donde bajarlo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.4. Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
45