Ejemplos sencillos de
Python
<< 1 2 >>

Números Primos
Números de Fibonacci
Adivina (Frío y Caliente)
Adivina (mayor y menor)
Adivina ( Que adivine el ordenador)
Pares y nones
Índice de palabras de un texto
Suma de naturales grandes
Producto de naturales grandes
Fibonacci para índices grandes
TAD Cola
Gestión 2002
Actualiza web
Actualiza Web Versión MUY mejorada


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 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