Números Primos
Una sencilla función que busca los número
primos que hay hasta un índice dado. Muy ineficiente, sólo
muestra la sintaxis de Python
Números de Fibonacci
La típica implementación de la sucesión
de fibonacci, tanto en su versión iterativa como en la recursiva
Frío y Caliente
Esta vez se trata de descubrir un número aleatorio
elegido por el ordenador. Si la distancia al número a adivinar
es menor que la distancia del intento anterior, entonces el programa muestra
"Caliente". Si es mayor, "Frío" y si es igual, "Templado"
Mayor y Menor
Ahora el ordenador nos dirá si el número
a adivinar es mayor o menor que el que nosotros porponemos. El objetivo
es adivinarlo en el menor número de intentos posibles.
Que adivine el ordenador
Nosotros proponemos un número y un rango. El
ordenador buscará ese número dentro del rango. No es más
que una búsqueda binari
Pares y nones
Con este programa podrás jugar a pares y nones
con tu ordenador. Se puede jugar un número variable de partidas,
al final de las cuales el ordenador muestra estadísticas y el porcentaje
de partidas que ha ganado el jugador.
Índice
de texto
Este programa toma como parámetro un fichero de
texto, y devuelve un índice de palabras junto con las veces que
aparece cada una dentro del fichero
NOTA: Muy ineficiente. No es un buen ejemplo para aprender Python
Suma de
naturales grandes
NOTA : Para enteros largos en versiones anteriores
de Python a la 2.XXX basta con añadir una 'L' al final del entero
en cuestión:
ejemplo : 84934598316431098649873156085687246543287654923876L
NOTA: Muy ineficiente. No es un buen ejemplo para aprender Python. Sólo
está programado por deporte (Python esto lo hace automáticamente)
Este programa permite sumar naturales arbitrariamente grandes. Para
ello, se toma un número y se mete cada cifra en una lista. Así
74532 será [7,4,5,3,2]. Teniendo un poco de cuidado con los acarreos,
la función que suma no resulta demasiado complicada. No hay límite
(al menos q conozca) en la longitud de los números (ha sido probada
con números que ocupan decenas de líneas)
Sugerencias de Chema Cortés:
Python usa números naturales
grandes sin necesidad de programación a parte. De todos modos,
resulta un buen ejercicio de programación; pero deberías
advertir que también se puede hacer por la vía simple de usar
números enteros "largos" (que además, a partir de python
2.2 ya es automático el uso de enteros largos cuando no cabe el
resultado en un entero normal).
A parte de decirte ésto,
hay algunas mejoras que se podrían hacer al código
- cad2lis: bastaría con
una conversión de tipos: list(cad)
Para conseguir el filtrado, se
puede emplear la elegancia de la
"programación funcional":
[int(x) for x in cad if x.isdigit()]
- lis2cad: sería
"".join(map(str,lis))
- maximo: emplea la función
'max'
- rellena: es mejor intentar algo
tal que así:
[0]*num + lis
Producto de naturales
grandes
NOTA : Para enteros largos en versiones anteriores de Python
a la 2.XXX basta con añadir una 'L' al final del entero en cuestión:
ejemplo : 84934598316431098649873156085687246543287654923876L
NOTA: Muy ineficiente. No es un buen ejemplo para aprender Python. Sólo
está programado por deporte (Python esto lo hace automáticamente)
En la línea del anterior. Esta vez, multiplicaremos números
arbitrariamente grandes. El algoritmo esta vez es un poco más
complejo, merece la pena echar un vistazo con detenimiento al código.
utiliza el módulo de suma anterior para la suma de productos parciales.
La prueba de que realiza correctamente las operaciones es:
Prueba de funcionamiento: (hemos incluido fines de línea)
58769856943265324865392876592834750983476729365432987569843256349865943865398
74545348950236502834765432063806432078650432876542036524308765420387654780236
52043653087456873056830475
*
43509832574203965083260746530874650874350283476203456430653874658073425630784
33265487356208374608743262084308732075326420873604286087365084375240387652084
3765283684650843564230876208355265035345
Salida de nuestro porgrama :
255706663601139270051761842188163135233076263655650422906957963802158867936475
696163216910800860901987127756694309916477773926279348962303939363857066034996
100582059263397422291832241344490953422427287115217582091956154333445751874841
322261401079356620726678166599541587105281178419753810180431838416343627887719
928208729970261059676087541936590503309572949536856894548138875
Salida de bc (an arbitrary precision calculator) de GNU/Linux
255706663601139270051761842188163135233076263655650422906957963802158867936475
696163216910800860901987127756694309916477773926279348962303939363857066034996
100582059263397422291832241344490953422427287115217582091956154333445751874841
322261401079356620726678166599541587105281178419753810180431838416343627887719
928208729970261059676087541936590503309572949536856894548138875
NOTA: Como ya me lo han comentado varias veces,
hay que aclarar que después de Python 2.XXX no es necesario ni este
módulo ni el de la suma de enteros largos. Este código fue
desa rrollado con Python 1.5.2 que es el que probablemente encuentres por
defecto en tu instalación de Linux si ésta no es muy reciente.
Dejando esto claro, considero que sirven como un buen ejemplo de sintaxis
de Python.
NOTA 2: Para enteros largos en versiones
anteriores de Python a la 2.XXX basta con añadir una 'L' al final
del entero en cuestión:
ejemplo : 84934598316431098649873156085687246543287654923876L
Gracias a Marcos Sánchez por la aclaración
Fibonacci para índices
grandes
NOTA: Muy ineficiente. No es un buen ejemplo para aprender Python. Sólo
está programado por deporte (Python esto lo hace automáticamente)
Si hemos implementado una función que suma números grandes...
¿por qué no usarla para calcular números de Fibonacci?
Como ejemplo basta decir que el término 5.000 es:
5000.- 3878968454388325633701916308325905312082127714646245106160597214895550139044037
0970108229164622106694792934528588829738134831020089549829403614301569114789383642165
6394410691021450563413370655865623825465670071252592990385493381392883637834751890876
2970712033337052923107693008518093849801803847813996748881765554653788291644268912980
3846137789690215022930824756663462249230718833248032803750391303529033045058427011476
3524227021093463769910400671417488329842289149127310405432875329804427367682297724498
7749874555691907703880637046832794811358973739993110106219308149018570815397854379195
3056175107610530756887837660336673554452588448862416192105534574936758978490279882343
5102359984466393485325641195222185956306047536464547076033090242080638258492915645287
6291575759142343809142302917491088984155209854432486594079793571316841692868039545309
5453886981146650820668628974206393234384884652409887423958738019769938203171742089322
6546887936400263079778005875912967138963421425257911687275560036031137054775472460463
9987588046985178408674382863125
Si quieres ver más pincha
aquí .
TAD Cola
Una sencilla implementación del tipo abstracto
de datos Cola en Python. Será utilizado en el programa de gestión.
La implementación es inmediata por los tipos de datos (en este
caso las listas) que aporta este lenguaje
Gestión
2002
Este programa es la solución (implementada en Python)
de la 2ª práctica de Estructuras de Datos y de la Información
(EDI) de la Facultad de Ingeniería Informática de León.
El programa gestiona el uso de un almacen. Están
contempladas solicitudes de productos de clientes así como entregas
de proveedores. La s especificaciones exigen una
Lista de colas
para gestionar los productos del almacén (las colas se utilizan
para almacenar peticiones no satisfechas de productos) y dos listas diferentes
para la gestión de ventas y la gestión de entregas de los
proveedores. Los elementos de estas estructuras de datos interaccionan
entre sí, de tal manera que si hay un pedido en espera y llega al
almacén el producto en cuestión, las actualizaciones en las
colas se realizan automáticamente.
Notas de diseño
- No es el objetivo
del programa ser especialmente estrictos en cuanto a la entrada de datos,
es decir, no realizamos demasiadas comprobaciones (no es nuestro objetivo)
para asegurarnos de que el tipo introducido es correcto (recordemos que
Python no es un lenguaje tipado).
- Los datos se
almacenan con el módulo pickle. En las especificaciones
no se pide que se guarden los datos. Sin embargo resulta absurdo (y
además dificulta enormemente la prueba) no disponer de datos
perpetuos.
- Este programa
no ha sido testado a fondo. Puede haber bugs. Si encuentras alguno, infórmame.
Puedes bajarte el código comprimido del programa principal,
el tad cola y un archivo de datos de ejemplo. Si lo prefieres también
puedes
ver estas capturas
de pantalla .
Código, datos y
cola en formato *.tar.gz (escribe tar -xvzf *.tar.gz para
desempaquetarlo)
Para ejecutar puedes escribir ./gestion.py datos si deseas aprovechar
este archivo o ./gestion.py
Por supuesto también puedes llamarlo desde el intérprete
Actualiza web
Este programa es uno de los pocos programa útiles
que he hecho. Lo utilizo para actualizar este sitio web. El funcionamiento
es sencillo (e ineficiente, pero tampoco se necesita mucho más).
Su funcionamiento es sencillo. Dado un directorio almacena parejas <nombre
de archivo - tamaño> y las guarda en un fichero externo. Cuando
se ejecuta el programa, construye una nueva lista de parejas, carga la
previa y las compara. Todos los archivos de la nueva lista que no coincidan
exactamente con la vieja son subidos al servidor.
Este programa 'pasa' de directorios por lo que se ha de ejecutar
para cada directorio del sitio web, lo que es una verdadera molestia.
Sin embargo para eso están los guiones de shell :). He aquí
el
guión principal
que utilizo, y aquí está el esquema de los guiones secundarios
que uso:
directorio local
ruta de los datos guardados
direccion del servidor
login
password
subcarpeta en el directorio web
Pese a su sencillez, este programa es realmente útil
(al menos para mí)
Sugerencias de Chema Cortés:
He visto que lo has hecho demasiado
dependiente de unix/linux. En python se
debe intentar, si puede ser,
que sirva para cualquier plataforma. Por
ejemplo, en lugar de tener
SEPARADOR='/' deberías emplear os.sep . Para
hacer el resto de código
más compatible entre linux, windows y mac utiliza
el módulo os.path .
Entrando en el código,
yo lo haría más "pythonic", utilizando los módulos
de
python en lugar de capturar
la salida del ls:
- captura_ls : emplearía
os.listdir(path)
- cambia_formato: tu rutina
la veo muy complicada, cambiando fines de línea
para luego ir caracter a caracter
analizando la salida del comando ls. En
python es todo más sencillo:
cadena.split('n')
- Es recomendable cerrar los
ficheros después de usarlos. (actualmente corregido)
Para el resto del código,
emplearía os.path.isdir para identificar
directorios, os.path.getsize
para obtener el tamaño de un fichero,
os.path.getmtime para saber
la fecha de modificación del fichero, etc.
También se podría
intentar incorporar la recursividad gracias a la función
os.path.walk.
Aparte de estas sugerencias, Chema Cortés me envió
una versión muy mejorada del programa, independiente de la plataforma
y mucho más sencilla y eficiente. Sin embargo, en mi caso, esta
versión no me sirve. La razón es que se utiliza la el método
os.path.isfile (ruta) que, (repito, en mi caso) no funciona correctamente:
>>>
import os
>>>
r = '/home/jav/web'
>>>
lista = os.listdir(r)
>>>
lista
['articulos',
'textos', 'index.html', 'archivos', 'python', 'imagenes', 'Art\xedculos_Antiguos_1.html',
'continente2.html', 'continente.html', 'txt']
>>>
for k in lista :
...
if os.path.isfile(k):
...
print k
...
index.html
continente2.html
continente.html
txt
>>>
Como se observa,
os.path.isfile (ruta) omite un archivo,
Art\xedculos_Antiguos_1.html . Las razones las desconozco. Una vez que
se solvente este problema, se colgará una versión más
eficiente de este programa.
Actualiza Web, versión
muy mejorada (Gracias a Chema Cortés)
Tras solventar los problemas arriba descritos
con
os.path.isfile (ruta), publico aquí la nueva
versión. El problema que existía (que para mí sigue
siendo inexplicable) fue solucionado modificando el modo de llamar a
os.path.isfile (ruta) , utilizando otra función del módulo
os.path, os.path.join :
if os.path.isfile(os.path.join(path,f))
:
ficheros.append((f,os.path.getmtime(os.path.join(path,f))))
Tras este cambio sólo queda un último
paso para alcanzar la verdadera eficiencia del programa. Si se observa
su modo de funcionamiento, se ve que sólo sirve para un directorio.
Si bien esto se solucion con scripts (llamando repetidamente al programa),
lo que es inaceptablemente lento, es realizar 4 conexiones al servidor
para subir un archivo en 4 directorios diferentes. El programa será
rediseñado para aceptar recursividad y permitir aprovechar una
única conexión para subir todos los archivos.
http://users.servicios.retecal.es/tjavier