Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Gonzalo Soriano
gsoriano@f i.uba.ar
30 de junio de 2009
1.
1.1.
Lenguaje interpretado
Diferencias entre un lenguaje interpretado y uno compilado
Una alternativa a usar un lenguaje compilado, es usar un lenguaje interpretado. Las computadoras siguen entendiendo un u
nico lenguaje, pero ahora lo
que se hace es usar un lenguaje compilado para crear un interprete (tambien
conocido como m
aquina virtual ), el cual estara entre nuestro codigo fuente y
la computadora cumpliendo la funcion de todo interprete: traducir solo lo que
necesita de un lenguaje a otro. Aca 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
on del codigo nunca sea traducida al lenguaje maquina.
Como contra, al traducir en el momento y no guardar esas traducciones, puede
suceder que una porci
on del c
odigo 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 instalado 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 debera modificarse en una sola lnea y
seguir funcionando perfectamente.
Agilidad en el desarrollo: Como no tenemos que compilar el programa
para hacer pruebas (solo tenemos que correrlo sobre el interprete) es mas
r
apido para hacer pruebas y continuar con el desarrollo o buscar el error.
Este tipo de lenguajes tampoco es perfecto y, por supuesto, tambien tiene
desventajas:
Dependencia del lenguaje: Como en los lenguajes compilados la independencia 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
on: Como toda instruccion tiene que pasar por el
interprete, para que este la traduzca y luego se ejecute es, un poco, mas
lento que los programas compilados.
Algunos ejemplos de lenguajes compilados e interpretados:
Lenguajes compilados
Pascal
C/C++
Fortran
1.2.
Lenguajes interpretados
Python
Java
C#
Caractersticas de Python
Desde la versi
on 2.1.2 de Python, si tratamos de importar el modulo thisnos
muestra las 19 premisas de Python escritas por Tim Peters.
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases arent special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless youre Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, its a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- lets do more of those!
La traducci
on sera 1 :
1 http://es.wikipedia.org/wiki/Python
7. La legibilidad cuenta.
8. Los casos especiales no son tan especiales como para quebrantar las reglas.
9. Aunque lo pr
actico gana a la pureza.
10. Los errores nunca deberan dejarse pasar silenciosamente.
11. A menos que hayan sido silenciados explcitamente.
12. Frente a la ambig
uedad, rechaza la tentacion de adivinar.
13. Debera haber una -y preferiblemente solo una- manera obvia de hacerlo.
14. Aunque esa manera puede no ser obvia al principio a menos que usted sea
Holandes
15. Ahora es mejor que nunca.
16. Aunque nunca es a menudo mejor que ya.
17. Si la implementaci
on es difcil de explicar, es una mala idea.
18. Si la implementaci
on es facil de explicar, puede que sea una buena idea.
19. Los espacios de nombres (namespaces) son una gran idea Hagamos mas
de esas cosas!
Si bien todas son buenas practicas de programacion, quiero destacar algunas:
Bello es mejor que feo.
Simple es mejor que complejo.
Complejo es mejor que complicado.
La legibilidad cuenta.
Los casos especiales no son tan especiales como para quebrantar las reglas.
Si la implementaci
on es difcil de explicar, es una mala idea.
2 Me
gusta m
as: Disperso es mejor que denso.
1.3.
1.4.
Interprete Python
$python ejemplo.py
Y la salida sera:
$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 funcion raw_input,
la cual puede recibir una cadena de caracteres a imprimir, lee el valor ingresado
y lo retorna como un string.
>>> variable = raw_input("Ingrese algo: ")
Ingrese algo: 7540
>>> print variable
7540
>>> variable = raw_input()
40
>>> variable = raw_input()
Esta cadena la guardo en variable
>>> print variable
Esta cadena la guardo en variable
>>>
1.4.1.
Comentarios
2.
2.1.
Python es un lenguaje fuertemente tipado, pero a la vez tiene la caracterstica de tipado din
amico. Es de fuertemente tipado ya que no se permite
usar una variable de un tipo determinado como si fuera de otro, por ejemplo,
no se le puede sumar un string a un entero o flotante. Y es tipado dinamico ya
que una misma variable, a lo largo de su existencia, puede ser de distintos tipos.
Por ejemplo, podemos tener una variable del tipo string, y en la lnea siguiente,
a esa variable asignarle un n
umero.
Si bien se le puede asignar a una variable valores de distinto tipo, es conveniente
respetar el tipo que se le asigna en una primer instancia y usar siempre ese.
Algunos de los tipos soportados son:
Tipo: Booleano (bool). Solo puede tomar los valores T rue y F alse.
Ejemplo:
>>> 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:
>>> real = 3.5
>>> type(real)
<type float>
Funciones disponibles:
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 necesariamente tienen que ser todos del mismo tipo.
Ejemplo:
11
>>> 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]
2.1.1.
Conversi
on entre tipos
Para convertir a un n
umero entero se puede usar la funcion int(n), a la
cual se le puede pasar un string o un float, pero no un string que sea un float.
>>> int("12")
12
>>> int(12.3)
12
>>> int(12.7)
12
>>> int("12.3")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 12.3
A esta funci
on tambien se le puede pasar un n
umero como string y una base
(int(n, base)) y convierte ese valor n que se encuentra en la base base a
decimal.
>>> int("10", 2)
2
>>> int("10", 16)
16
>>> int("a", 16)
10
>>> int("af65b", 16)
718427
>>> int("1101", 2)
13
As como pudimos pasar a enteros, tambien podemos pasar a n
umeros
flotantes, pero no tenemos tantas alternativas como antes. Para eso podemos
usar la funci
on f loat(string) que recibe una cadena de caracteres y retorna un
float.
>>> 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
>>>
Tambien se le puede pasar un n
umero entero y lo convierte a flotante:
>>> float(12)
12.0
Para convertir cualquier variable a string podemos usar la funcion str() que
recibe cualquier cosa y hace su mejor intento para convertirla. A diferencia del
resto, esta funci
on nunca va a fallar por no saber como convertir algo. Puede
pasar que con alg
un tipo en particular no nos devuelva el resultado que queremos, pero seguro que nos va a devolver una representacion de lo que le pasamos
en string.
>>> str(5)
5
>>> str(5.4)
5.4
>>> str(5L)
5
>>> str(True)
True
>>> str()
14
Indicador
%c
%s
%d o %i o %u 0 %ld 0 %lu
%nd
%.nd
%f
%.nf
%e
%.ne
%g
%x
Tipo:
Solo un caracter.
Cadena de caracteres.
Entero con signo.
Entero con signo ocupando n3 espacios.
Entero con signo ocupando n lugares, completando con 0.
Float o real.
Float o real con solo n decimales.
Float o double, con notacion cientfica.
Float o double, con notacion cientfica, con solo n decimales.
Coma flotante, usando la notacion que requiera menor espacio.
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
as se pueden mezclar con los siguientes caracteres:
15
Car
acter
\n
\r
\t
\v
\a
\\
\"
\
Descripci
on
Caracter fin de lnea.
Caracter retorno del carro.
Caracter tabulador horizontal.
Caracter tabulador vertical.
Timbre.
Barra invertida.
Comillas.
Apostrofe.
Algunos ejemplos:
>>> print "Algoritmos \r mundo"
mundotmos
>>> print "\a"
>>> print "Hola\tmundo"
Hola mundo
>>> print "Hola\vmundo"
Hola
mundo
>>> print "\\"
\
>>> print "\"
[Hola, mundo, ]
>>> "Hola,mundo".split(",")
[Hola, mundo]
>>> "Hola mundo
".split()
[Hola, mundo]
Tambien se puede obtener partes de un string indicando su posicion respecto
del inicio o el rango que se desea obtener. Para indicar un rango se pone primero
la posici
on del comienzo, despues un separador que sera el : y por u
ltimo la
posici
on del final. Si no se le pasa la posicion donde comienza el rango, asume
que ese valor es 0; y si la posicion que no se le pasa es la del final, asume que es
hasta el final del string.
>>> "Hola
l
>>> "Hola
la
>>> "Hola
l
>>> "Hola
Hola
>>> "Hola
Hola
>>> "Hola
mundo
mundo"[2]
mundo"[2:4]
mundo"[2:3]
mundo"[0:4]
mundo"[:4]
mundo"[5:]
As como podemos saber la posicion desde el inicio de la cadena de caracteres, tambien podemos indicar la posicion respecto del u
ltimo caracter:
Cadena de caracteres:
Posici
on desde el inicio:
Posici
on desde el final:
H
0
-10
o
1
-9
l
2
-8
a
3
-7
4
-6
m
5
-5
u
6
-4
n
7
-3
d
8
-2
o
9
-1
15
>>>
[5,
>>>
[5,
>>>
[5,
>>>
15
>>>
15
>>>
(5,
>>>
(5,
[3, 5, 1,
1]
[3, 5, 1,
1, 7, 15]
[3, 5, 1,
1, 7, 15]
(3, 5, 1,
7, 15, 11][1:3]
7, 15, 11][1:5]
7, 15, 11][1:-1]
7, 15, 11)[4]
Una forma muy sencilla de crear una lista con valores consecutivos es usando
la funci
on range([piso], techo); que puede recibir uno o dos parametros. Si se
le pasa un solo par
ametro la funcion devuelve una lista que tendra todos los
n
umeros que sean iguales o mayores a 0 y menores a ese n
umero.
>>> range(3)
[0, 1, 2]
>>> range(-1)
[]
En cambio, si se le pasan dos parametros nos va a devolver una lista que
tendr
a todos los n
umeros que sean iguales o mayores al primero y menores al
segundo.
>>> range(3,7)
[3, 4, 5, 6]
>>> range(-7,-1)
[-7, -6, -5, -4, -3, -2]
Otras funciones u
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).
>>> tuple((1, 2, 3))
(1, 2, 3)
>>> tuple([1,2,3,4])
(1, 2, 3, 4)
>>> tuple("")
()
>>> tuple("Hola mundo.")
(H, o, l, a, , m, u, n, d, o, .)
>>> tuple({1:"uno", 2:"dos", 3:"tres"})
(1, 2, 3)
>>> list((1, 2, 3))
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 traves
de la funci
on keys().
>>> {1:"uno", 2:"dos", 3:"tres"}.keys()
[1, 2, 3]
Y si podemos obtener sus claves, tambien podemos obtener los valores asociados
a esas claves. Para esto tendremos que hacer uso de la funcion values()
>>> {1:"uno", 2:"dos", 3:"tres"}.values()
[uno, dos, tres]
2.1.2.
Algunas funciones u
tiles para conocer un poco m
as lo que
usamos.
19
20
FUNCTIONS
atof(s)
atof(s) -> float
Return the floating point number represented by the string s.
atoi(s, base=10)
atoi(s [,base]) -> int
Return the integer represented by the string s in the given
base, which defaults to 10. The string s must consist of one
or more digits, possibly preceded by a sign. If base is 0, it
is chosen from the leading characters of s, 0 for octal, 0x or
0X for hexadecimal. If base is 16, a preceding 0x or 0X is
accepted.
atol(s, base=10)
atol(s [,base]) -> long
...
find(s, *args)
find(s, sub [,start [,end]]) -> in
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.
...
3.
Estructuras de control
3.1.
Al igual que los lenguajes vistos, en Python tambien existen estructuras para
controlar el flujo del c
odigo que se va a ejecutar.
3.1.1.
if
if (condici
on) then
begin
acci
on1;
acci
on2;
...
acci
onN;
end;
C
if (condici
on)
acci
on;
o
if (condici
on)
{
acci
on1;
acci
on2;
...
acci
onN;
}
Python
if (condici
on):
acci
on1;
acci
on2;
...
acci
onN;
A diferencia de Pascal y C, en Python no hay diferencia entre poner una sola
acci
on o varias. Adem
as, es obligatorio que las acciones esten todas equidistantes
del comienzo de la lnea 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>",
print 2
^
IndentationError:
>>> if 3<4:
... print 0
File "<stdin>",
print 0
^
IndentationError:
line 3
line 2
23
5
= True if (num % 2 == 0) else False
espar
6
= True if (num % 2 == 0) else False
espar
case
for
accion1;
acci
on2;
...
accionN;
end;
Por otro lado, en C esta misma estructura es mucho mas potente, pero a
costa de sacrificar un poco de legibilidad:
for (condici
on inicial; condici
on de corte; modificaci
on de la variable)
{
accion1;
accion2;
...
accionN;
}
Por lo que Python adopt
o una tercer forma tratando capturar lo mejor de
cada una de ellas; siempre priorizando la claridad del codigo.
for elemento in lista:
accion1
acci
on2
...
accionN
Por lo que ahora, recorrer todos los elementos de una lista y trabajar con
ellos (por ejemplo imprimir el doble de cada uno) es mas facil.
>>> 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]
>>>
Y que pasa si quiero hacer un f or para que simplemente muestre los
primeros 50 enteros no negativos, o los n
umeros del 20 al 30?. La respuesta
esta unas cuantas hojas antes: range().
Para imprimir los primeros 50 n
umeros enteros no negativos:
for i in range(50):
print i
Para imprimir los n
umeros que van del 20 al 30:
25
26
3.1.4.
while
lista = [3, 2, 5, 7, 1, 9]
while 7 in lista:
# Saco el
ultimo elemento de la lista
lista = lista[:-1]
print lista
2, 5]
Ingrese un n
umero: 9
Ingrese un n
umero: 2
Ingrese un n
umero: 15
>>>
3.1.5.
repeat
4.
4.1.
Programaci
on modular
Procedimientos y funciones
que cumplir las mismas reglas para las variables, puede empezar con cualquier letra
y despu
es le puede seguir cualquier car
acter alfanum
erico m
as el .
5 Los par
entesis son obligatorios por m
as que no se pasen par
ametros
y el
28
30
mayor por un menor y tendramos dos funciones casi iguales que solo diferiran
en un solo car
acter.
Si vamos a tener que usar las dos b
usquedas, sera conveniente que busquemos
una alternativa que encapsule lo que puede cambiar y mantenga el resto sin
modificaciones. Para lograr esto podramos pasarle a la b
usqueda una funcion
que compare el valor central y la clave e indique si el valor que buscamos se
encuentra a la derecha o izquierda.
def mayor(n1, n2):
if n1 > n2:
return True
else:
return False
def menor(n1, n2):
if n1 < n2:
return True
else:
return False
def binaria(cmp, lista, clave):
"""Binaria es una funci
on que busca en una lista la clave pasada. Es un requisito
de la b
usqueda binaria que la lista se encuentre ordenada, pero no si el orden
es ascendente o descendente. Por este motivo es que tambi
en recibe una funci
on
que le indique en que sentido ir.
Si la lista esta ordenada en forma ascendente la funci
on que se le pasa tiene
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
on que se le pasa tiene
que ser verdadera cuando el primer valor es menor que la segundo; y falso en
caso contrario."""
min = 0
max = len(lista) - 1
centro = (min + max) / 2
while (lista[centro] != clave) and (min < max):
if cmp(lista[centro], clave):
max = centro -1
else:
min = centro + 1
centro = (min + max) / 2
if lista[centro] == clave:
return centro
else:
return -1
Entonces, si ahora queremos buscar el n
umero 8 en una lista ordenada ascendentemente, vamos a tener que pasarle el nombre de la funcion que tiene que
usar para comparar, la lista y la clave.
>>> binaria(mayor, [1,2,3,4,5,6,7,8,9], 8)
33
7
Vemos en el ejemplo anterior que nos da bien la posicion ya que nos retorna
la posici
on n
umero 7; pero que pasara si en lugar de pasarle la funcion mayor
le pasamos la de menor?.
>>> binaria(menor, [1,2,3,4,5,6,7,8,9], 8)
-1
Como piensa que la lista esta ordenada en forma descendente y 5 va a ser
menor que 8, en la primer iteracion va a descartar la segunda parte de la lista
y se quedar
a solo con la primera. Por ese motivo es que nunca va a encontrar el
8 en la lista.
Y si ahora buscamos el 123 con la funcion que corresponde?.
>>> binaria(mayor, [1,2,3,4,5,6,7,8,9], 123)
-1
Como deba pasar, si el n
umero no se encuentra en la lista, retorna -1.
Y si ahora buscamos algunos valores en una lista ordenada descendentemente,
pas
andole la funci
on menor?.
>>> binaria(menor, [9,8,7,6,5,4,3,2,1], 8)
1
>>> binaria(menor, [9,8,7,6,5,4,3,2,1], 2)
7
>>> binaria(menor, [9,8,7,6,5,4,3,2,1], 123)
-1
Si los valores est
an en la lista nos informa la posicion en que se encuentran,
pero si no existen nos devuelve un -1.
>>> binaria(mayor, [9,8,7,6,5,4,3,2,1], 2)
-1
Al igual que cuando le pas
abamos una lista ordenada en forma ascendente y
la funci
on menor, si ahora le pasamos una lista ordenada en forma descendente
y la mayor, la b
usqueda no va a poder encontrar la clave por mas que exista.
Ahora que probamos la funci
on vemos que efectivamente hace lo que debera
hacer, pero, que es ese texto que esta entre """ y para que sirve?. Eso es un
comentario de m
as de una lnea llamado docstring y sirve para documentar
las funciones, entre otras cosas.
Pero no es la primera vez que nos topamos con este tipo de documentacion, ya
que antes lo usamos sin saber como estaba hecho o como se llamaba. La forma
de usarlo es a traves de __doc__ y help():
>>> print binaria.__doc__
Binaria es una funci
on que busca en una lista la clave pasada. Es un requisito
de la b
usqueda binaria que la lista se encuentre ordenada, pero no si el orden
es ascendente o descendente. Por este motivo es que tambi
en recibe una funci
on
que le indique en que sentido ir.
Si la lista esta ordenada en forma ascendente la funci
on que se le pasa tiene
34
__main__:
4.2.
Uso de m
odulos externos
m
odulo datetime sirve para el manejo de fechas y horas.
ahora, no presten demasiada atenci
on al hecho de que sean clases, no vamos a cambiar
al paradigma de Programaci
on Orientada a Objetos (POO).
7 Por
35
5.
Persistencia de datos
Pero todo lo que vimos por el momento se guarda en memoria dinamica, por
lo que al apagar la computadora, o simplemente con cerrar el programa y volver
a abrirlo perdimos todos los datos que nos tenamos. La alternativa para esto
siguen siendo los archivos.
5.1.
Uso de archivos
Para poder usar un archivo vamos a tener que hacer los mismos pasos que
siempre, pero de una forma distinta a la de Pascal e igual a la de C. Vamos a
necesitar una variable de tipo archivo, a la cual le vamos a asignar un archivo
fsico y lo vamos a abrir de una forma particular. Una vez que hayamos hecho
todos estos pasos, y si no hubo problema en ninguno de ellos, vamos a poder
leer y, dependiendo del modo en que lo abrimos, escribir en el.
36
5.1.1.
Apertura de archivos
b
+
Descripci
on
Lectura: el archivo debe existir. Similar al
reset de Pascal.
Escritura: no es necesario que el archivo exista, pero si existe lo sobre escribe. Similar al
rewrite de Pascal.
Append: Solo agrega al final y no es necesario
que el archivo exista. Similar al append de Pascal.
Binario.
Permite lectura y escrituras simultaneas.
por lo que en este caso es conveniente abrirlo primero para escritura y despues
para lectura.
5.1.2.
Cierre de archivos
Lectura de archivos
70
40
>>>
Como se puede ver, en el archivo hay lneas que aparentemente no tienen
ning
un car
acter, y sin embargo, si vemos los n
umeros encontramos lneas con
0 caracteres. Eso se debe a que en todas las lneas podemos encontrar siempre
el car
acter de fin de lnea que se representa por el \n, pero al momento de
imprimirlo no lo vemos.
5.1.4.
Escritura de archivos
.Y estas dos l
neas tambi
en con un \n al final
de cada una.
>>>
Otra forma de asegurarse que se escriba lo que hay en el disco es cerrandolo.
5.1.5.
Moverse en un archivo
Significado
La posicion es desde el inicio del archivo y
debe ser mayor o igual a 0
La posicion es relativa a la posicion actual;
puede ser positiva o negativa.
La posicion es desde el final del archivo, por
lo que debe ser negativa.
>>> 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
>>>
5.1.6.
Interrogando un archivo
>>> arch.name
ejemplo.txt
>>> arch.mode
r
>>> arch.closed
False
6.
6.1.
Anexo I
Licencia: GPL
6.2.
Las P eps son propuestas para mejorar Python, pero no solo a nivel de nuevas
implementaciones sino tambien de como usarlo.
Por ejemplo, la n
umero 8: http://www.python.org/dev/peps/pep-0008/ propone un estilo de c
odigo a seguir para los que programen en Python, el cual se
puede respetar o no, pero es una convencion para que sea mas legible el codigo
y cometer menos errores.
La n
umero 20 comenta el Zen de Python que vimos antes y la 257 comenta
como hacer buena documentacion para las funciones (docstring).
Por lo que se puede ver en http://www.python.org/dev/peps/, las mismas
est
an divididas en las siguientes categoras:
Meta-PEPs (PEPs about PEPs or Processes)
Other Informational PEPs
Accepted PEPs (accepted; may not be implemented yet)
Open PEPs (under consideration)
8 http://www.python.org/psf/license/
43
6.3.
Donde bajarlo
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
Indice
1. Lenguaje interpretado
1.1. Diferencias entre un lenguaje interpretado y
1.2. Caractersticas de Python . . . . . . . . . .
1.2.1. The Zeb of Python . . . . . . . . . .
1.3. Estructura de un programa en Python . . .
1.4. Interprete Python . . . . . . . . . . . . . .
1.4.1. Comentarios . . . . . . . . . . . . .
uno compilado
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
3
5
5
7
19
3. Estructuras de control
3.1. Equivalencias de estructuras
3.1.1. if . . . . . . . . . . .
3.1.2. case . . . . . . . . .
3.1.3. for . . . . . . . . . .
3.1.4. while . . . . . . . . .
3.1.5. repeat . . . . . . . .
21
21
21
24
24
27
28
de control
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
8
8
13
4. Programaci
on modular
28
4.1. Procedimientos y funciones . . . . . . . . . . . . . . . . . . . . . 28
4.2. Uso de m
odulos externos . . . . . . . . . . . . . . . . . . . . . . . 35
5. Persistencia de datos
5.1. Uso de archivos . . . . . . . . .
5.1.1. Apertura de archivos . .
5.1.2. Cierre de archivos . . .
5.1.3. Lectura de archivos . . .
5.1.4. Escritura de archivos . .
5.1.5. Moverse en un archivo .
5.1.6. Interrogando un archivo
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
36
36
37
38
38
41
42
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