Cómo se utiliza Python y Django en Mejorando.docx

March 30, 2018 | Author: Mijael Colquehuanca | Category: Python (Programming Language), Object (Computer Science), Programming Language, Html, Computer Program


Comments



Description

Cómo se utiliza Python y Django en Mejorando.la Seguramente conoces Mejorando.la, es el proyecto web de Maestros y Cristalab. Comenzó como programa online una vez por semana y ahora se ha expandido con cursos presenciales alrededor de latinoamérica y tres conferencias con alcance mundial. Leonidas Esteban, Renzo Avalos y Adan Sanchez son quienes hace unos meses estuvieron trabajando para lograr el sitio que hoy se puede disfrutar al ingresar a Mejorando.la. Para lograrlo hubo todo un proceso de rediseño y reprogramación que fue posible gracias a varias herramientas y servicios que con la ayuda de Adan Sanchez te contaré a continuación. Python y Django: Lenguaje y framework de la magia “Al momento de planear el rediseño y reprogramacion de un sitio es importante identificar bien sus elementos y componentes principales para crear los modelos necesarios y una buena estructura” es lo primero que resaltó Adán Sanchez. Y hablando especificamente de Mejorando.la hay que destacar que el componente principal son los videos. Desde ahí parten todas las funciones que se van agregando al sitio. Python es el lenguaje y Django es el framework detrás del sitio de Mejorando.la. Nos cuenta Adán que gracias a la flexibilidad que ofrece, se pudo realizar la reprogramación y rediseño del sitio en pocos días: “Digamos que Django se ha vuelto prácticamente un estándar como framework para desarrollo ágil.” Es especialmente recomendado para un proyecto grande desarrollado por un equipo pequeño o cuando se trata de un sitio para entregar en pocos días. Al consultar por qué la elección de Django y no otro, nos explicó que “Django era la solución principal, puesto que si bien wordpress es muy flexible, en Django hay aun mas flexibilidad.” Un framework con baterías incluídas Django trae lo que en Python se conoce como “baterías incluidas”. Desde clases para tareas sencillas como paginación, geolocalización, autentificación y caché hasta componentes bastante completos como el módulo de comentarios, notificaciones, administrador, internacionalización y feeds. Adán explica que un sitio en Django es más limpio puesto que python tiene una estructura modular, agrega que “en otros lenguajes hay que descargarse muchos archivos y el tener tantos archivos en el directorio puede hacer mas dificil manejar el sitio”. Para “graficar” la facilidad con la que se activan estos módulos desde el archivo de configuración, nos mostró el código correspondiente: INSTALLED_APPS = ( 'django.contrib.auth', # funciones de autentificacion 'django.contrib.comments', # funciones para agregar comentarios a los modelos 'django.contrib.admin', # administrador autogenerado ) Además afirma que es muy fácil encontrar un módulo en los repositorios para aquellas funcionalidades que no vienen incluidas en Django, un ejemplo de ello es el modulo Gravatar que se utiliza en Mejorando.la para los avatares de los comentarios. Modelo-Vista-Controlador “Un punto más a favor de Django es el patrón Modelo-Vista-Controlador que maneja, esto quiere decir que separas tu aplicación en tres componentes”, explicó Adán. El modelo principal en este caso seria Video, en donde un “video” tiene titulo, imagen, descripcion, comentarios. Para entender mejor puedes ver el tercer capitulo de la guia Django y luego ver estos ejemplos: Modelo: son los datos, en el sitio se tiene un modelo para los Videos. Ejemplo de modelo class Video(models.Model): titulo = models.CharField() slug = models.CharField() imagen = models.ImageField() fecha = models.DateField() descripcion = models.TextField() Vista: sería la presentación de este modelo, en Django entra en los templates, que reciben los datos del controlador. Hay una plantilla para cada vista: home.html, videos.html, video.html, heredando de base.html gracias al poderoso sistema de plantillas de Django. Controlador: se encarga de elegir los datos que se van a mostrar y hacer el procesamiento que haga falta en estos, validacion y condicionamientos. En Mejorando.la hay un controlador para cada página: home, archivo de videos y página de video. Ejemplo de controlador def video(solicitud_http, video_slug): video = get_object_or_404(Video, slug=video_slug) return render_to_response('website/video.html', { 'video': video }) Unidad, código limpio y filtros. La unidad que existe en toda la plataforma es una de las caracteristicas que más le gustó a Adán: “cualquier método que defina en un modelo estará presente tanto en el controlador como en las plantillas.” “Los modelos de Django permiten abstraer lo que tradicionalmente se haría con SQL en clases y funciones. Esto permite tener un código más limpio.” Por ejemplo: SQL SELECT titulo, descripcion, imagen FROM videos ORDER BY fecha LIMIT 10 Django Video.objects.all().order_by(‘-fecha’)[:10] Nos comentó también que en las plantillas de Django se hace uso de la rica cantidad de filtros que pone a disposición, desde convertir a mayúsculas, eliminar etiquetas html y agregar saltos de línea. Gracias a estos filtros es más fácil tener una clara separación entre datos, lógica y presentación. Sólo un comienzo Cómo te imaginarás el proceso de rediseño y reprogramación de un sitio como Mejorando.la no se puede comentar y explicar en detalle en tan sólo un artículo, sin embargo en una proxima publicación con Adán te contaremos más funcionalidades y caracteristicas que hacen de python un lenguaje fácil de aprender y de Django el framework ideal para perfeccionistas.  Primeros pasos con Python Python es un lenguaje interpretado Cuando compilamos un programa escrito en C o en Fortran generamos un ejecutable. Para hacer funcionar ese ejecutable nos basta con muy poca cosa; en el caso de un “hola, mundo” basta con simplemente ejecutarlo. El sistema operativo lo considera ejecutable y simplemente cumple sus ordenes. Esto no sucede así en los lenguajes interpretados. El código en Python nunca llega a traducirse a algo que el sistema operativo pueda entender. En Python el programa termina convertido en un ensamblador propio que una máquina virtual es capaz de entender y ejecutar. La consecuencia principal de este método es que es imprescindible contar con un intérprete de Python instalado en el ordenador para poder ejecutar código en Python. Esta no es hoy en día una condición demasiado severa. El único sistema operativo mayoritario que no cuenta con un intérprete de Python instalado por omisión es En el caso especial de Windows bastará con descargarse un instalador. En Windows bastará con abrir el programa correspondiente que seguro que se llamará Python shell o algo parecido. de modo que podemos probar a hacer una suma sin problemas. En este respecto se trata de un lenguaje de programación parecido a Matlab. darle doble clic y decir que sí a todo. una gran parte de las funciones matemáticas básicas están en el módulo math. Linux. Cuando ejecutamos código en Python lo lanzamos a un intérprete que es capaz de entender este lenguaje.Windows. . Python es un lenguaje interactivo Python dispone de una consola interactiva con la que jugaremos un poco antes de escribir algún que otro programa. Solaris y AIX entre otros cuentan con uno. En los UNIX y derivados bastará con abrir una consola de sistema y teclear en ella python. A diferencia de los lenguajes estáticos como C o Fortran en el que un compilador convierte el código de programa en un ejecutable que el sistema operativo es capaz de entender. pero ya llegaremos a ello. aunque algunas veces compensa instalar una versión más actualizada que la que encontraremos en la distribución del sistema operativo. Una vez estemos delante del intérprete de Python podemos empezar a jugar. Mac OSX. Consola de Python en la ventana de IDLE en Linux La manera de acceder a esta consola difiere en función del sistema operativo. >>> 2+2 4 Como seguramente intentaréis hacer algo más complicado con números. Esto es sencillo en el caso de Python porque es un lenguaje interpretado: la mayoría de las asignaciones resuelven el tipo en tiempo de ejecución. line 1.Python es un lenguaje dinámico En Python no hay que declarar ninguna variable. Cada variable toma el tipo que tenga en cada caso lo que esté en el lado derecho del operador asignación =. Si volvemos al intérprete: >>> a = 2.4 >>> a = 'hola' >>> print type(a) <type 'str'> >>> print a*b Traceback (most recent call last): File "<stdin>". >>> print a+a holahola Python está lleno de detalles de estos así que algunas veces es bueno dejarse llevar por la intuición. Entonces.2 >>> print a*b 7.. Esto es cierto tanto la primera vez que se utiliza una variable como cuando se le asigna un valor a una variable ya existente. Aunque Python está lleno de sorpresas... cuando intentamos multiplicar una secuencia de caracteres por un número en coma flotante obtenemos un error claramente identificado como error de tipo. si tomamos la definición de multiplicación como una secuencia de sumas. in <module> TypeError: can't multiply sequence by non-int of type 'float' Creo que no hace falta dedicarle un capítulo a lo que hace la sentencia print. Qizás parte del éxito de Python se debe a que la gente que lo ha estado creando durante las dos últimas décadas es gente particularmente lista. no en tiempo de compilación del mismo modo que sucede en Matlab o Octave. Por ejemplo.3 >>> b = 3.. Si vuestra intución os dice que una operación puede ser posible a lo mejor está implementada. . Obviamete. ¿Qué sucede si multiplicamos una palabra por 2? >>> a = 'hola' >>> print 2*a holahola Pues que tenemos dos veces 'hola'.36 >>> a = 2 >>> print type(a) <type 'int'> >>> print a*b 6. . Matlab era también otro lenguaje que históricamente había ignorado la orientación a objetos pero por soportarlo también. Sin embargo las metodologías de programación es una temática larga y miserablemente olvidada dentro de los planes de estudios de las carreras de Ingeniería así que no nos queda más remedio que dejar un enorme hueco en este curso. j que es la unidad imaginaria. De este modo veremos una clase como una manera de agrupar variables. A la segunda consiguieron un resultado razonable gracias a casi copiar el planteamiento de Python. Es imposible hablar de Python y no hablar sobre la orientación a objetos porque en Python prácticamente todo es un objeto.imag 3. los métodos. Como en Matlab y Octave es recomendable utilizarlo como sufijo de un número tal como se hace en el ejemplo.0 >>> print c*(1j)+3 2j Python dispone de una constante especial. imag]) -> complex number | | Create a complex number from a real part and an optional imaginary part.0 >>> c. su parte real y su parte imaginaria. a partir del estándar Fortran 2003. >>> c = 2+3j >>> print c. Por ejemplo un número complejo es un ejemplo especialmente simple. soporta la programación orientada a objetos.Python es un lenguaje orientado a objetos El las carreras de informática cubrir los conceptos fundamentales de la orientación a objetos requiere una asignatura entera. Cualquier número imaginario tiene dos atributos. Esto significa que la clase complex tiene la operación de producto definida internamente.type(c) (2+3j) <type 'complex'> >>> c. La primera implementación de la orientación a objetos de Matlab era tan deficiente que quedó en el olvido. Me centraré en comentar lo más básico y fundamental de lo que es un objeto: los atributos y los métodos. Si bien la suma de un número complejo es una operación trivial (es la suma de sus partes real e imaginaria respectivamente) la multiplicación no lo es. >>> help(c) Help on complex object: class complex(object) | complex(real[. métodos y operaciones disponibles para una clase utilizando la función help.real 2. Podemos ver todos los atributos. y funciones que operan sobre estas variables. los atributos. | This is equivalent to (real + imag*1j) where imag defaults to 0. De todos los paraidgmas de programación es el más exitoso que se conoce. Incluso Fortran. a su manera. En estos lenguajes cualquier función de la biblioteca está accesible al intérprete.pi) 1. están modularizadas.. Podemos importar módulos prácticamente en cualquier punto de la ejecución pero por convención se suelen importar al principio. Si queremos importar sólo sin y pi podemos hacerlo de la siguiente manera: >>> from math import sin. después de importar math.2246063538223773e-16 Dos puntos a tener en cuenta:   Cada módulo es en sí un objeto..605551275463989 >>> c. de modo que estas dos operaciones: >>> abs(c) 3.) Esta función que aparece como __abs__() es en realidad la función valor absoluto.| | | | | | | | | | | Methods defined here: __abs__(. y) (. En Python todo está modularizado Esta sí es una diferencia esencial entre Matlab/Octave y Python..__coerce__(y) <==> coerce(x. crezca también la probabilidad de conflictos.. Prácticamente la totalidad de módulos o scripts en Python importan algún módulo.605551275463989 Son equivalentes a todos los efectos.pi . Por ejemplo. En Python todas las bibliotecas..) x.) x. Esto hace que.__abs__() <==> abs(x) __add__(. hemos llegado a la constante como un atributo del módulo y a la función sin como un método.__add__(y) <==> x+y __coerce__(. incluso la biblioteca estándar. tener que arrastrar el nombre math puede ser algo tedioso. Ahora podéis pensar que para la función seno o para :math:pi. En este caso. si queremos calcular el seno de tendremos que importar antes el módulo que contiene tanto la función seno como el valor de >>> import math >>> math.) x... especialmente si no hay una intención especial de agrupar las funciones de este módulo. a medida que el número de funciones crece.__abs__() 3.sin(math.. 2246063538223773e-16 Aunque esta manera de importar el contenido de los módulos es bastante práctica porque evita olvidos no es la recomendada para producción. en el menú archivo seleccionamos nueva ventana. Cuando se dice que Python incluye baterías se menciona el hecho que la biblioteca estándar es enorme comparada con otros lenguajes de programación. mencioné que para programar en Python es una gran idea acostumbrarse a utilizar un interfaz de desarrollo integrada (IDE) como Eclipse. Es más. La biblioteca estándar de Python incluso viene con la posibilidad de generar interfaces gráficas con ventanas en cualquier sistema operativo.. algo más sofisticado que IDLE. A modo de ejemplo ejecutaremos un “Hola..0 >>> tan(pi) -1. lo que abrirá un editor en el que podemos escribir el programa. mundo!” portable. gestionará y ejecutará sus scripts o módulos. Pero Python no es Matlab ni Visual Basic en el sentido que uno debe decidir cómo programará. Podemos utilizar un wildcard para importar todo el contenido del módulo y ponerlo a disposición del programa: >>> from math import * >>> sin(pi) 1. que sólo incluye funcionalidades básicas. podemos seguir exactamente el mismo método en cualquier sistema operativo.2246063538223773e-16 También podéis pensar. Una vez abrimos IDLE. debido a que Python tiene la gran particularidad de que el significado de un programa depende de cómo se ha escrito es prácticamente imprescindible utilizar una herramienta específica.2246063538223773e-16 >>> cos(pi) -1. porque siempre es mala idea no leer la introducción. Mundo!' . pero no cargador En la introducción. es decir. Entonces en esta nueva ventana escribimos lo siguiente: if __name__ == '__main__': print 'Hola. Python incluye baterías.>>> sin(pi) 1. ¿Y si tengo que importar veinticinco funciones del módulo math? ¿Tengo que escribirlas todas en la llamada a import? Evidentemente no. resta. . para cambiarla basta con apretar el tabulador o backspace al principio de cada línea para cambiarla.. Hay un condicional. La parte inicial. un debugger. En IDLE. Ahora. Lo utilizaremos otras veces y veremos de su importancia más adelante. La comodidad es una sensación muy personal y para conseguirla puedo ayudaros muy poco. un profiler. como en Fortran. Pero si comparamos IDLE con el IDE de Matlab seguimos echando de menos un montón de piezas: la ayuda integrada. Parte de la gracia de cualquier lenguaje de programación.. El símbolo correspondiente a la potencia es el doble asterisco. y es también el caso de C o Fortran. un if. No hay ningún end ni corchetes que encapsulen las sentencias ejecutables.Editor para Python de IDLE en Linux Justo después de escribir los dos puntos finales de la primera línea veremos que el editor nos sitúa automáticamente a cuatro caracteres del margen izquierdo. el if __name__ == '__main__': es una convención de Python que viene a decir que lo que hay a partir de esta línea tiene que ejecutarse si se ejecuta el archivo . división. Todo lo que esté indentado después de los dos puntos es parte del bloque if. y ninguna sentencia que termine el bloque. En el intérprete aparecerá un Hola. Sólo hay que hacer un par de puntualizaciones al comportamiento del lenguaje. **. Mundo!. El motivo puede parecer puramente estético pero leed otra vez el programa.py. algo que nos permita navegar entre los objetos. por ejemplo. Python es también una calculadora El intérprete cuenta con todas las operaciones aritméticas usuales: suma. es llegar a un entorno de desarrollo con el que nos sintamos cómodos. multiplicación. Lo que determina la prioridad del bloque de código es precisamente la separación respecto al margen izquierdo. seleccionad run y luego run module o pulsad F5.. en la ventana del editor. La necesidad de utilizar una herramienta específica radica aumentar la facilidad en la que se maneja la indentación del código.. .>>> 2**10 1024 Otra diferencia es el operador modulo que da el residuo de la división entrera entre dos números. Debe de haber formas más simples.5 Por lo demás el comportamiento respecto a las operaciones aritméticas es el mismo e importando los módulos math y cmath conseguiremos funcionalidades equivalentes a cualquier calculadora. En este artículo vamos a crear un script para pasar código fuente Python (. de resolver este tipo de problemáticas.. Si tanto el numerador como el denominador son números enteros. En Matlab.py que contiene el script se puede obtener del repositorio de este blog. . si alguno de los dos operandos es un número en coma flotante el resultado también lo será. Script para pasar código Python a HTML Hola.5 Sin embargo este comportamiento se corregirá en Python 3 de manera que cualquier división será la división en coma flotante. el operador / corresponde a la división entera y no a la división en coma flotante.py. el cual contiene el script mi_tokenize. en: https://sites. Sin embargo. a mí se me ha ocurrido esta. Python comparte la convención con C al respecto >>> 5%2 1 La división tiene un comportamiento un poco particular en Python 2 y depende del tipo de cada operador. Como siempre. >>> 5/2 2 >>> 5. sin duda.com/site/elviajedelnavegante/ El fichero se llama mi_tokenize. Aunque aún estamos muy lejos de algo parecido a Matlab y Octave. . a diferencia de C en el que se trata de un operador.google. Podemos modificar el comportamiento de Python 2 utilizando el módulo __future__ que introduce algunas de las modificaciones que recibirá el lenguaje en el futuro >>> from __future__ import division >>> 5/2 2. Además vamos a darle coloración al código Python. el fichero . Octave y Fortran este operador es una función.zip.py) a formato HTML (y de esta manera mostrar dicho código en una página web).0/2 2. El funcionamiento es sencillo.. en Firefox.En este problema no se ha utilizado programación orientada a objetos. . en términos generales. Todo se resuelve con programación imperativa (mediante funciones). que representa el código Python formateado (con indentación y coloreado de código). esto es. formateado en HTML y coloreado.. Al grano. no se implementa ninguna clase. Un ejemplo sería el siguiente: La captura de arriba es del Stani's Python Editor. Abajo nos encontramos el mismo código. se genera otro (con extensión html) con código HTML. a partir de un fichero de código fuente Python. De lo que se trata es que. crear otro fichero con una cabecera html. Listo. . ya que se tiene que identificar los diferentes bloques de código a los que se quieren dar color.py. ¿Cómo hacerlo? Mediante los módulos cStringIO y tokenize. leerlo. que se pueden encontrar en cualquier distribución de Python. El verdadero problema es el coloreado del código. En nuestro caso.¿Cómo enfocar el problema? Pasar código Python a html es casi trivial. ya tenemos el código en una página web. daremos color a los comentarios. incluir dicho código Python y cerrar el html. Únicamente hay que abrir un fichero . a las cadenas y a las palabras clave de la versión que utilicemos de Python. py con el método read() de open.cStringIO sirve para crear. línea a línea sobre una cadena con varias líneas (con saltos de línea). En realidad esto sirve para iterar. Mejor lo vemos con los pasos que debe de dar nuestro script: 1) Cargamos en memoria un fichero . Por ejemplo: import cStringIO cadena = ''' Este es un ejemplo de la potencia del módulo cStringIO ''' texto = cStringIO. etc) a partir de un buffer de cadena. 2) Mediante cStringIO creamos un fichero en memoria ó buffer de cadena. a partir de una cadena.StringIO(cadena) for i in texto: print i Devuelve: Este es un ejemplo de la potencia del módulo cStringIO . un buffer de cadena. tokenize es el módulo que nos permite analizar código Python e identificar componentes del mismo (comentarios. cadenas. el cual es necesario para utilizar el tokenize. coding: utf-8 -*# Código Python. tokens = tokenize.org/library/stringio.org/library/tokenize.python.3) Mediante tokenize. texto = cStringIO. Imaginemos que hemos cargado mediante el método read() de open un fichero con código Python con el siguiente contenido: # -*. Veámoslo con un ejemplo.generate_tokens(texto. podemos obtener los token (elementos de código).5): print "Número ". i Mediante los pasos anteriores vamos a identificar los elementos del código.html#module-cStringIO http://docs. El código que haría esta operación podría ser el siguiente: # Creamos buffer de cadena. e identificando los elementos de código Python. palabras clave y cadenas. iterando sobre ellos.readline) . comentarios.python. y a partir del buffer de cadena creado en el paso anterior. En la documentación de Python tenéis una explicación muy buena (en inglés) de estos dos módulos: http://docs.html Puff!!! Una explicación algo extraña. for i in range(0.StringIO(cadena) # Creamos tokens. a saber. (3. 6). 0).%s]" % (b.STRING: print "Cadena: %s en posición [%s.%s]" % (b. 18)] Por tanto. Aparte. 0).c.b.coding: utf-8 -*.(4.c.d) if a == tokenize. 8). 2). ¿Y cómo se colorea el texto? Pues mediante código HTML del tipo: Así el otro hándicap es que a partir de las coordenadas de los elementos de código a colorear hay que insertar código HTML. en posición [(2. 23)] Comentario: # Código Python._ in tokens: if a == tokenize. La idea fundamental es esta. y demás operaciones se llega al resultado esperado.(3. 7)] Cadena: "Número " en posición [(4.(4.d) Dando como resultado: Comentario: # -*.for a.(1. 3)] Palabra clave: in en posición [(3.COMMENT: print "Comentario: %s en posición [%s.c. 0).c.d) if a == tokenize.kwlist: print "Palabra clave: %s en posición [%s.en posición [(1. .(2. mediante el módulo tokenize podemos identificar todos los elementos de los que se compone un código Python. 8)] Palabra clave: print en posición [(4.NAME and b in keyword. 17)] Palabra clave: for en posición [(3. mediante operaciones de transformación entre listas y cadenas.%s]" %( b.d. El script mi_tokenize. Módulos que se cargan y estructuras que se definen: Importamos los módulos necesarios y creamos un diccionario para colorear los elementos de código Python. El código principal que ejecuta el script: . y no mezclar cosas. Aquí se presentan capturas de pantalla del código.py Tal como antes se ha comentado. el lector puede obtener el código de este script en el repositorio de El viaje del navegante. debido principalmente a que se utiliza sintaxis html en el código Python. Podemos observar que el script pide dos argumentos para funcionar. mediante read() una cadena con el contenido del fichero. mediante la función tokenizar_codigo se crea una cadena con sintaxis html y Python. que se guarda en el fichero identificado por f_html_nombre. Finalmente.html si esta se omite) .py: Darse cuenta que reemplazamos ciertos caracteres especiales en html. el primero el fichero Python y el segundo el nombre del fichero html que se generará (se le da extensión . Función para cargar el fichero . A continuación llamamos a la función cargar_fichero que devuelve. . La función que analiza el código creando una cadena con html y código Python es la siguiente: . a saber: La función para insertar los elementos de html: . pero me ha parecido más pedagógico realizarlo de esta forma.Esta función podría haberse escrito de otra forma. Devuelve una cadena con código html. Como se puede observar se utilizan cStringIO y tokenize. para ahorrar código. Esta última función utiliza dos funciones auxiliares. . El lector puede pensar que sería mucho mejor utilizar CSS para estos menesteres. es verdad. Lo verdaderamente importante es el parseo de código Python y el tratamiento de cadenas. y en cierta manera. pero no es objetivo de este post hacer un tratado sobre web y CSS. es mejor probar el script.Y la función para incluir la cabecera y pie del documento de la página web: Pero como no es lo mismo andar el camino que conocer el camino. 1 Requisitos o 2.2 Prueba de módulos 1 Historia del documento Este documento fué creado el 8 de Abril de 2004. escribir a: nospam en pp punto com punto mx El original de este documento se encuentra en http://pp.1 Introducción o 6. 2008 .2 Usando una clase 6 Interfase gráfica de usuario o 6.correcciones o preguntas acerca de este en documento.com. Segunda edición: 29 de Diciembre de 2008. México 2004. ////////////////////////////////////////////////////////////////////////////////////// Programación en Python --. Para sugerencias.2 Un editor o 6.1 Documentación o 8.1 Usando funciones o 5.2 Cómo realizar los ejemplos 3 Números grandes o 3.3 Usando una clase 7 Servidor HTTP 8 Toques finales o 8.1 Agregando las comas 4 Manejo de información 5 Generación de documentos HTML o 5.Se insta al lector a mejorar el código.mx/python Derechos Reservados (c) Patricio Páez Serrato.Parte II Ejemplos Author: Patricio Páez Serrato Date: 9 de Abril de 2004 Índice         1 Historia del documento 2 Introducción o 2. Primera publicación el 27 de Junio de 2004. 2006. 1. Además de resaltar la sintaxis en colores.2 Cómo realizar los ejemplos Programar en Python puede hacerse de varias maneras según la necesidad o el gusto de cada persona. Los usuarios de MS-Windows pueden instalar algunos de estos editores del CD Gnuwin.5. permite editar archivos fuente y es más amigable al inicio. 2.2 Introducción La primera parte de este documento es una referencia del lenguaje Python. y como menciono durante el tutorial: los resultados de estos ejemplos pueden crecer y convertirse en sus propios conjuntos de herramientas. No por ser sencillos dejan de ser útiles. Ambos vienen incluídos en el instalador de Python para MS-Windows y se instalan cuando se aceptan todas las opciones del instalador sin modificación. Empiezan por algo muy sencillo. En Linux el lector puede verificar mediante este comando: [usuario@pc]$ rpm -qa | grep ^tk tk-8. Unix o Linux siempre y cuando Python corra. Se recomienda crear una carpeta para realizar y guardar los ejemplos.2.1 Requisitos Los ejemplos pueden realizarse tanto en una PC con MS-Windows. con enlaces a páginas de interés (se encuentra en http://pp. Para los neófitos mi recomendación es que utilicen el ambiente gráfico interactivo llamado idle. cambiar primero a esa carpeta y entonces correr idle: En MS. Para correr idle. y 2.Windows: C:\ejemplos> C:\python22\idle\idle . Cada editor nos permite ejecutar el código Python que contiene. muestra el prompt >>> y espera un comando. Todos los ejemplos.3-7mdk tkinter-2. Pueden usarse las versiones 1. excepto las interfases gráficas pueden hacerse en modo texto. Esta segunda parte recopila los ejemplos que he mostrado cuando imparto el Tutorial de Python. El idle tiene dos ambientes: el shell interactivo con título Python Shell en su ventana.com.mx/python).0 en adelante. emacs.1-3mdk 2. y uno o más editores que se abren con el menú File --> New Window. y combinando hasta llegar a algo más complejo. Scite y otros. el cual cambia hasta que se salva a un archivo con File --> Save As (y subsecuentemente File --> Save). usando preferentemente un editor que resalte la sintaxis de Python como Vim. Los ejemplos tratan conceptos generales y procuran no usar características únicas en las versiones más recientes. Esta herramienta viene incluída con el módulo tkinter.3. Cada editor empieza con el título Untitled en su ventana. Los ejemplos con Tkinter requieren tener el conjunto de funciones gráficas Tk así como el modulo de Python Tkinter que lo accesa. En Linux: [usuario@pc ejemplos]$ idle & La primera vez que hacen un ejemplo, intenten hacerlo paso a paso en forma interactiva en el shell, tecleando cada comando. Es la forma en que aprenderán más que si simplemente copian y pegan. Una vez que ya teclearon y funcionaron las cosas, entonces copien del shell interactivo y peguen a una ventana de editor y salven en un archivo con terminación .py para que conserven lo que hicieron para la posteridad. 3 Números grandes Podemos explorar los enteros largos de Python si hacemos una tabla de potencias de 2, evaluando 2^n mientras n varía de 0 a n. >>> for n in range(60): print n, 2**n El resultado será: 0 1 1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256 9 512 10 1024 11 2048 12 4096 13 8192 14 16384 15 32768 16 65536 17 131072 18 262144 19 524288 20 1048576 21 2097152 22 4194304 23 8388608 24 16777216 25 33554432 26 67108864 27 134217728 28 268435456 29 536870912 30 1073741824 31 2147483648 32 4294967296 33 8589934592 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 17179869184 34359738368 68719476736 137438953472 274877906944 549755813888 1099511627776 2199023255552 4398046511104 8796093022208 17592186044416 35184372088832 70368744177664 140737488355328 281474976710656 562949953421312 1125899906842624 2251799813685248 4503599627370496 9007199254740992 18014398509481984 36028797018963968 72057594037927936 144115188075855872 288230376151711744 576460752303423488 Nota: desde la versión 2.2 de Python, si el resultado de una expresión entera excede el límite de los enteros (2^32 generalmente), éste es convertido automáticamente a entero largo. (mostrado con terminación L en el ambiente interactivo): >>> 12345678901234 12345678901234L En versiones 2.1 y anteriores tendremos un error: >>> 12345678901234 OverflowError: integer literal too large En el ejemplo anterior, lo que tendremos que hacer en este caso es agregar L al final del 2: >>> for n in range(60): print n, 2L{*}{*}n 3.1 Agregando las comas Los números muy grandes son difíciles de entender sin las comas que normalmente usamos. Vamos entonces a definir una función que agregue las comas. Los pasos necesarios serían:   Convertir a cadena, para poder tomar cada dígito. Recorrer la cadena de derecha a izquierda, de tres en tres dígitos. Se inserta la coma cada vez si todavía quedan más de tres dígitos a la izquierda. Al probar la función en el código anterior, remplazamos 2**n con poncoma(2**n) y además formamos columnas con el operador %: def poncoma( n ): "Regresa n como cadena con comas." s = str(n) pos = len(s) while pos > 3: pos = pos - 3 s = s[:pos] + ',' + s[pos:] return s for n in range(60): print '%3d %30s' % ( n, poncoma( 2**n ) ) Nota sobre versiones de Python: en las versiones 1.5.2 hasta 2.0, podemos utilizar la función rjust() del módulo string. Necesitaremos incluir el comando import string al principio del ejemplo*,* y referir la función como string.rjust(str(n), 3) y string.rjust(poncoma(2**n), 30). A partir de las versión 2.1 todas las cadenas y las funciones que regresan cadena tienen la función rjust() incluída, y podríamos usar str(n).rjust(3) y poncoma(2**n).rjust(30). El resultado será ahora más legible: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 1 2 4 8 16 32 64 128 256 512 1,024 2,048 4,096 8,192 16,384 32,768 65,536 131,072 262,144 524,288 1,048,576 2,097,152 4,194,304 8,388,608 16,777,216 33,554,432 67,108,864 134,217,728 268,435,456 536,870,912 1,073,741,824 2,147,483,648 4,294,967,296 8,589,934,592 984 36.177.899.208 17.Aguascalientes Tijuana.Morelos . Aguascalientes. con las siglas EDP).251.044.656 562. 4 Manejo de información Hace años al Departamento de Informática se le llamaba de Procesamiento Electrónico de Datos (Electronic Data Processing en Inglés.115.254.023.416 35.075.710.255.744.125.Campeche Tuxtla Gutiérrez.949.Baja California Sur Campeche. de México Chilpancingo.104 8.872 288.953.474.599.927.Chiapas Chihuahua.303.936 144.744 576.Baja California Mexicali.511.355.594.719.488.376.093.776 2.057.869.151.028.552 4.370.906.Coahuila Colima.963. El nombre antiguo era más descriptivo de la labor que se supone debían realizar las computadoras.799.503.Hidalgo Guadalajara.888 1. Tenemos la siguiente información en el archivo capitales.711.F.D.099.976.423.Chihuahua Saltillo.992 18.796.007.953.230.624 2.Michoacán Cuernavaca. y con decimales.813.752.188.088.877.184 34.018.509.184.372.312 1.738.627.968 72.460.199.476.737.037.421.755.438.481.398.496 9.740.022.398.664 140.txt: México.842.592.685.832 70.906.186.Guanajuato Pachuca.Jalisco Morelia.944 549.736 137.797. Aquí mostraremos cómo hacemos esto en Python.Guerrero Guanajuato.328 281.179.488 Le dejamos al lector el ejercicio de mejorar poncoma() añadiendo instrucciones para que acepte números con signo negativo.248 4.014.627.511.368 68.359.Colima Durango.855.199.Edo. con un conjunto de datos pequeño pero real.472 274.368.046.Durango Toluca.34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 17.813. luego separaremos los campos de cada registro.Tamaulipas Tlaxcala.Sinaloa Hermosillo. # usamos una función lambda: pares = map( lambda e: string. unicos = [] for nombre in capitales+estados: if nombre not in unicos: . revisando los resultados: # Leemos el archivo a una cadena: f = open( 'capitales. '\n' ) print lista # Convertimos cada elemento de la lista a una pareja.Nayarit Monterrey.Puebla Querétaro.estado in pares: capitales.Quintana Roo Culiacán.Sonora San Luis Potosí.Tabasco Tampico. lista ) print pares # Podemos crear una lista para cada campo: # una lista de capitales y otra lista de estados.').append( capital ) estados. la vamos a convertir a una lista de registros.read() # Partimos la cadena a una lista cuyos elementos son # los registros de nuestra 'base de datos' import string lista = string.Querétaro Chetumal.Tlaxcala Jalapa.split( e.Zacatecas Son los nombres de los Estados mexicanos con su ciudad capital.San Luis Potosí Villa Hermosa.Oaxaca Puebla.Tepic.Nuevo León Oaxaca. seguida de una coma y el nombre del Estado.txt' ) datos = f. '.Veracruz Mérida. A continuación vamos a leer esta pequeña 'base de datos' a una cadena en Python. Primero la capital.Yucatán Zacatecas. El lector puede ir haciendo primero estos pasos en forma interactiva.split( datos.append( estado ) # Cómo determinar los nombres únicos de ambas listas? # Usamos la concatenación de listas. # Esta es una forma de obtenerlas: capitales = [] estados = [] for capital. ').readlines() arreglo = map( lambda x: x. line 420) Unknown directive type "code-block". code-block:: html <html> <head><title>página hecha a mano</title></head> <body> <h1>Hola.rst. print 5 Generación de documentos HTML Hoy en día usar HTML es cosa del diario.. Muchas páginas de HTML se generan por programas. lee y regresa un arreglo.append(nombre) else: print nombre # Cuántos elementos tenemos? print len(unicos) # Los ordenamos alfabéticamente: unicos.split('. leemos correo.txt' ) for renglon in matriz: for celda in renglon: print '%-20s' % celda. definimos una función que lee el archivo de este ejemplo. .</h1> probando<br> </body> </html> . separa en campos y registros.." f = open( nombrearchivo ) renglones = f.sort() print unicos Para concluir. y cada vez son más las aplicaciones que usan el navegador como punto de acceso al usuario.. Un documento básico de HTML puede ser así: System Message: ERROR/3 (ejemplos. cuando navegamos en internet. renglones ) return arreglo matriz = leedatos( 'capitales. Por esta razón vamos a practicar con Python.unicos. y nos regresa una matriz en forma de una lista: def leedatos( nombrearchivo ): "Abre un archivo. no por personas. ni saber las dimensiones.html." return '''<html> <head> <title>''' + cadena + '''</title> .inicio del documento ---------<html> <head><title>página hecha a mano</title></head> <body> ---------. 5. Finalmente desarrollamos tabla() que será muy utilizada para mostrar arreglos.. destino().. line 443) Unknown directive type "code-block".Si nunca habías hecho un documento HTML. Tenemos el siguiente código con las funciones básicas: System Message: ERROR/3 (ejemplos. Empezamos con las funciones inicio() y final(). saltolinea() y horizontal(). No es necesario utilizar variables i..</h1> probando<br> ---------- ---------. parrafo(). . j como en otros lenguajes para recorrer el arreglo. Cada renglón del arreglo puede ser de distinta longitud.final del documento </body> </html> ---------- Ahora definiremos una función en Python para que regrese cada parte como texto. code-block:: html ---------.1 Usando funciones Vamos a dividir el documento HTML en las partes que lo forman. line 473) Unknown directive type "code-block"..rst. puedes pegar el texto de arriba a un nuevo documento y salvarlo como estatica. liga(). code-block:: python def inicio( cadena='' ): "Inicia el documento HTML.cuerpo del documento <h1>Hola. .rst. Abre luego el documento con un navegador para que lo muestre. Luego agregamos para el cuerpo del documento las funciones encabezado(). tomando como base la muestra anterior: System Message: ERROR/3 (ejemplos. " return '<p>' + texto + '</p>\n' def saltolinea(): "Genera un salto de línea. 'r2c2'] ] ) print final() Hemos pasado un arreglo en forma explícita." return '<a name="' + clave + '>' + texto + '</a>' def liga( url. Las funciones que definimos pueden anidarse." return '<hr />' def destino( clave. default es H1. Por ejemplo: .""" temp = '<table border="1">\n' for renglon in arreglo: temp = temp + '<tr>' for celda in renglon: temp = temp + '<td>' + str(celda) + '</td>\n' temp = temp + '</tr>\n' return temp + '</table>\n' def final(): "Fin del documento HTML." return '<br>\n' def tabla( arreglo ): """Muestra arreglo en una tabla HTML. texto ): "Regresa texto como destino.</head> <body>\n''' def encabezado( nivel='1'. string='' ): "Regresa string con encabezado o título HTML." return '<h'+ nivel + '>'+ string + '</h'+ nivel + '>' def horizontal(): "Línea horizontal en el documento HTML. ['r2c1'. se convierten a cadena siempre. 'r1c2']. Las celdas pueden ser cualquier tipo. texto): "Liga o hipervínculo a url con texto." return '''</body> </html>''' Las funciones se van llamando en orden como se muestra en este ejemplo: print print print print inicio( 'Página dinamica') encabezado( 'Página generada con Python') parrafo( 'Tenemos a continuación una tabla:') tabla( [ ['r1c1'." return '<a href="' + url + '">' + texto + '</a>' def parrafo( texto ): "Genera un párrafo con texto. pero podemos usar una variable. b.python. Cada celda toma un valor que depende de x.parrafo( 'El sitio ' + liga( 'http://www. col+1): dato = calcula(ren. que lee de nuestro archivo capitales.org') + 'tiene mucha información sobre Python." f = open( nombrearchivo ) renglones = f.py con un comando así: [user@host ejemplos]$ python html. Para hacer esto.'www.py > prueba. necesitamos correr nuestro guión html.""" array = [] for ren in range(1.python." if operador == '+': return str(a) + ' + ' + str(b) + ' = ' + str( a+b) elif operador == '*': return str(a) + ' * ' + str(b) + ' = ' + str( a*b) def leedatos( nombrearchivo ): "Abre un archivo. leedatos() es la rutina de la sección anterior sobre manejo de datos.html En Windows: C:\ejemplos> python html.append( dato ) return array def calcula( a. El arreglo es de 10 x 10 si no se suministran los valores de ren y col.exe en su PATH. operador) array[-1]. Para probar nuestros experimentos necesitamos enviar la salida del programa a un archivo que podemos llamar prueba. ren+1): array. Generalmente es C:python22python: C:\ejemplos> c:\python22\python html. operador): "Regresa una cadena tipo 'a operador b = resultado'. hay que agregarla.python.y y el valor de operador.' ) para obtener: El sitio www. operador='+'): """Construye y regresa un arreglo ren x col. Aquí está el código: def hacertabla( ren=10. En el siguiente ejemplo hacemos ambas cosas.py > prueba.append( [] ) for col in range( 1. col.org.readlines() .py > prueba. col=10.html Si Windows no tiene la ruta del ejecutable python.org tiene mucha información sobre Python.*html*. lee y regresa un arreglo. que será lo más usual. o llenarla con datos de alguna fuente. hacertabla() construye una matriz con expresiones.html La tabla podemos ahora construirla con una rutina.txt y usa lo que aprendimos para separar campos y registros. text = '' return temp def inicio( self. nivel. La clase tiene también métodos con los mismos nombres que las funciones básicas." self. y borra el buffer. Esto representa mejoras respecto a nuestro ejemplo anterior.txt' ) ) encabezado( 'Tabla de sumas' ) tabla ( hacertabla() ) encabezado( 'Tabla de multiplicación' ) parrafo( 'Esta tabla usa la misma función con otro contenido' ) tabla ( hacertabla(12. string): "Regresa string con encabezado o título HTML. class buffer: """Clase para generar objetos que almacenan codigo HTML que despues sera escrito a algun archivo. mientras que el método pop() es para regresar y vaciar el atributo de texto. El método add() se usa para agregar texto a la instancia. 9. Esto nos permite generar más de una página simultáneamente. porque ahora podremos escribir el texto HTML a un archivo desde el programa sin redireccionar la salida estándar.""" def __init__( self ): "Constructor.add( encabezado( nivel.arreglo = map( lambda x: x." temp = self." self. '*').text self.2 Usando una clase El siguiente paso es definir una clase que llamaremos buffer." self.text + texto def pop( self ): "Regresa el texto del buffer. titulo ): "Inicia el documento HTML." self. renglones ) return arreglo print print print print print print print print print print inicio( 'Mi primera página dinamica') encabezado( 'Página generada con Python') parrafo( 'Algunos ejemplos de las rutinas para generar HTML') tabla( leedatos( 'capitales. texto ): "Agrega texto arbitrario al buffer.add( inicio( titulo ) ) def encabezado( self. crea el atributo de texto.split('.'). Estos métodos simplemente llaman a la función correspondiente y van agregando el texto regresado mediante el método add().text = self.text = '' def add( self. string ) ) def horizontal( self ): "Línea horizontal en el documento HTML. La clase buffer crea un atributo text en cada instancia que es el texto HTML que se va formando. ) final() 5." . default es H1. como cuando lo vamos a escribir a un archivo. clave.add( horizontal() ) def destino( self.write( pagina1. texto ): "Regresa texto como destino.encabezado( '2'. 'Ir a página 2' ) pagina1." self.html'. texto): "Liga o hipervínculo a url con texto. arreglo ): "Inserta arreglo en una tabla HTML. url. texto) ) def parrafo( self.html'." self. Creamos dos instancias de buffer. texto ): "Genera un párrafo con texto.inicio( 'Página 2' ) pagina2.liga( 'pag1.html'.write( pagina2.inicio( 'Página 1' ) pagina1." self. les agregamos contenido y finalmente escribimos cada buffer a un archivo.final() # Vaciar cada buffer a un archivo: fp = open( 'pag1.add( parrafo( texto) ) def saltolinea( self ): "Genera un salto de línea. 'Ir a página 1' ) pagina2." self. texto) ) def liga( self.add( final() ) Ahora vemos un ejemplo de cómo usamos esta clase para crear páginas HTML.self." self.html'.add( saltolinea() ) def tabla( self." self.encabezado( '2'. fp.add( destino( clave. 'Esta es Página 2') pagina2.buffer() pagina2 = html.liga( 'pag2.add( liga( url.pop() fp = open( 'pag2. Cada página lleva un enlace a la otra: import html # Crear dos instancias de la clase buffer: pagina1 = html. fp.final() pagina2.add( tabla( arreglo ) ) def final( self ): "Fin del documento HTML.pop() 'w' ) ) 'w' ) ) 6 Interfase gráfica de usuario .buffer() # Llenar cara buffer: pagina1. 'Esta es página 1') pagina1. El código básico sería: import Tkinter. necesitamos ir creando las ventanas o elementos (llamados también widgets) que usaremos. Los elementos pueden ser widgets Label.1 Introducción Para trabajar con un cualquier juego de herramientas gráficas. se crea a partir de la clase Tkinter. Un widget procesador de texto por ejemplo. a partir de la clase Tkinter. Canvas. Frame. Mediante el módulo Tkinter. Los eventos son los movimientos y acciones del ratón y teclas presionadas en el teclado. Agregar información a los elementos. un cuadro de texto. En primer nivel tendremos una ventana principal. Python puede utilizar Tk. Mostrar cada elemento con el método pack() que tiene definido. Crear una instancia de uno o más elementos para insertar en esta ventana raíz.Text().Tk() editor = Tkinter. veremos Tk.De los varios conjuntos de herramientas para hacer interfases gráficas.pack() . etc. y otros. 6. Enlazar funciones o métodos de la ventana raíz o alguno de los widgets a uno o más eventos del usuario. sys raiz = Tkinter. un marco.Text(raiz) editor. La clase Text() tiene los métodos insert() y get() para escribir o leer el contenido del buffer de texto que corresponde al área visible para el usuario. Para terminar la aplicación se llama al método quit() de la ventana raíz.Tk(). Los pasos para todo programa gráfico serán:         Importar las clases y constantes del módulo Tkinter. los cuales quedan en una jerarquía.Label(raiz) w. 6. como puede ser texto al editor o a una etiqueta Llamar el método mainloop() de nuestra ventana raíz.2 Un editor El widget de texto Text() nos da la base para hacer un editor.mainloop() El ejemplo anterior se basa en el primer ejemplo de Fredrik Lundh en su documento An introduction to Tkinter. para que se active la atención a los eventos. a la cual agregamos botones. Crear una instancia de la ventana raíz. Tk es el conjunto de herramientas que se hizo originalmente para el lenguaje de guiones TCL.pack() w[ 'text' ] = 'Hola mundo' raiz. mediante un comando import en su forma import Tkinter.Tk() w = Tkinter. Ya en código tendremos más o menos el siguiente esqueleto: import Tkinter raiz = Tkinter. nombrearchivo. Estos dos eventos de teclado se llaman <Control-q> y <Control-s> en Tkinter*.write( editor.close() print 'archivo'. El bloque maneja la excepción en caso de que el archivo no exista y se trate de un archivo nuevo a crear. sys def quit(event ): "Termina la aplicación. Se agregan también las funciones quit() para terminar la aplicación.bind( '<Control-s>'.read() ) raiz.' raiz = Tkinter.insert( '1." f = open( nombrearchivo.argv[1] ) editor.read() ) except: print nombrearchivo. existen herramientas como Glade que ayudan a crearla en forma gráfica.0'.argv[1] try: f = open( nombrearchivo ) editor. 'es archivo nuevo' else: print 'falta proporcionar nombre de archivo' sys.get( '1. END) ) f.quit() def save(event): "Salva el texto del editor. La aplicación se termina mediante la combinación de teclas Control+q y el archivo se salva con las teclas Control+s.3 Usando una clase El caso anterior tiene una sola ventana de texto.Tk() editor = Tkinter.pack() editor. f. f.* y se ligan las funciones quit() y save() a estos eventos mediante el método bind que tienen todos los widgets en Tk: import Tkinter.argv)>1: nombrearchivo = sys. 'w' ) f." raiz. 'salvado.insert( '1. 6. save ) if len(sys. Para casos de interfases más complejas. Para tener varios archivos abiertos no tenemos que repetir el código para cada ventana. y save() para guardar el contenido del buffer en el archivo. .mainloop() Al código anterior le agregamos instrucciones en el bloque principal indicar que se requiere el nombre del archivo. Lo que utilizamos es una clase y cada ventana es una instancia de la misma. quit ) editor.0'.0'.bind( '<Control-q>'.f = open( sys.exit() mainloop() Este primer ejemplo nos muestra lo fácil que es crear una aplicación gráfica directamente.Text(raiz) editor. Text( self.s = string.buffer. event ): . una ventana principal.buffer = Tkinter.s ) if d.buffer. Usamos una lista editores inicialmente vacía.siguiente) self.'\015'.1 if i < 0: i = len(notas)-1 notas[i].nombrearchivo ). nombrearchivo ): "Construye la instancia.index( self) + 1 ) % len( notas ) notas[i].lift() return 'break' def siguiente( self.bind( '<Control-q>'.s.END. self." self. height=10) self. 14 ) self.tl.index( self) .buffer[ 'wrap'] = Tkinter.splitlines() self.lift() return 'break' def quit( self. lineas) ) + 1 def anterior( self.read().pack() self.tl.buffer. event ): i = ( notas.buffer.buffer.Toplevel() self.focus_set() notas[i].quit) self.buffer[ 'foreground' ] = 'black' self. self.tl.nombrearchivo ] ) lineas = self. '') self.tl." def __init__( self.tl = Tkinter.buffer[ 'background'] = 'white' self. La clase editor tiene el método quit() para terminar la aplicación.focus_set() notas[i].buffer. mediante un ciclo se va agregando una instancia de editor para cada parámetro que se proporcionó. self.buffer[ 'font'] = ( 'verdana'.geometry( d[ self.has_key( self.buffer.nombrearchivo ): self. event ): i = notas. cuyos eventos en Tkinter se llaman <Prior> y <Next>.El código base para crear un editor que ya vimos será incluído en una clase editor.nombrearchivo = nombrearchivo self. En este caso la ocultamos desde el inicio con el método withdraw().replace( open( self. que podría ser la ventana de inicio de la aplicación.buffer['width'] = max( map(len.anterior ) self. específicamente en la función __init__() que es su función contructora y se ejecuta cuando se crea una instancia.buffer['height'] = len( lineas ) + 1 self. El código es así: class editor: "Un area de texto simple.bind( '<Prior>'.NONE self.tl.insert( Tkinter.title (nombrearchivo) self. Tk siempre crea una instancia de la clase Tk(). self.bind( '<Next>'. y siguiente() y anterior() que son para activar otra de las ventanas de edición utilizando las teclas página siguiente y página anterior del teclado. termina. dato in lineas: d[llave] = dato import sys.Tk() root. o bien en internet. al cual podemos modificar si deseamos.CGIHTTPRequestHandler) httpd.conf' nombresarchivos = sys. SimpleHTTPServer.write( llave + ' ' + dato + '\n') nota.items() ): f. Un servidor básico de HTTP.withdraw() root.read(). Tkinter archivoconf = 'editor.serve_forever() Para añadir CGI utilizamos CGIHTTPRequestHandler en lugar de SimpleHTTPRequestHandler en nuestra instancia de servidor: import BaseHTTPServer." lineas = [] try: f = open( archivoconf ) lineas = map( string. 80).tl.tl.HTTPServer( ( ''. f.nombrearchivo ] = nota.append( editor( nombrearchivo ) ) notas[0]. 'no existe' for llave. cierra ventanas."Actualiza posiciones. CGIHTTPServer httpd = BaseHTTPServer.split. string.splitlines() ) except: print archivoconf. 80).mainloop() 7 Servidor HTTP Python nos permite hacer aplicaciones que incluyan un servidor de HTTP. SimpleHTTPServer httpd = BaseHTTPServer.serve_forever() . dato in sorted( d.HTTPServer( ( ''.withdraw() for llave. 'w' ) for nota in notas: d[ nota.withdraw() LeeConf() notas = [] for nombrearchivo in nombresarchivos: notas. empieza así: import BaseHTTPServer.focus_set() root.tl.buffer.geometry() nota. CGIHTTPServer. Puede ser en la intranet de nuestra casa u oficina." f = open( archivoconf.argv[ 1:] if nombresarchivos: d = {} root = Tkinter.SimpleHTTPRequestHandler) httpd.quit() def LeeConf(): "Lee nombres y posiciones de archivoconf. Para lograr esto..net para más información. Para el caso de un módulo. arroja una bitácora de los accesos. Después con la herramienta pydoc incluída con Python. 8. Ver http://roundup.2 Prueba de módulos Se recomienda al final de un módulo definir una función prueba() que llame algunas de las funciones para validar que todo está bien. Esta función deberá correr solamente cuando el módulo se carga como guión principal.*html* con la documentación del mismo: [usuario@pc ejemplos]$ /usr/lib/python2. Mientras el guión corre./html.py -w . para que pydoc sepa que es un archivo y no un módulo predefinido. Podrás ver los archivos que estén en el directorio de trabajo al momento de correr el guión servidor.sf. no cuando se importa desde otro archivo. y después uno o más párrafos de explicación.py. podemos generar un archivo html. podemos incluir las siguientes cadenas: '''Cadena de descripción del módulo Puede tener una línea de encabezado.1 Documentación Documentar nuestros programas..''' __author__ = 'xxxx xxxx' __date__ = 'xxxx xxxx' __version__ = 'xxxx xxxx' __credits__ = 'xxxx xxxx' __text__ = 'xxxx xxxx' __file__ = 'xxxx xxxx' Las funciones para generar HTML las incluímos todas en un archivo html.Ambos casos pueden probarse en tu máquina tratando de mostrar la dirección http://localhost en un navegador./' antes del nombre del archivo.py Escribimos '. módulos y ejemplos en Python no representa un esfuerzo adicional si hemos incluído las cadenas de documentación. Roundup es un ejemplo de una aplicación hecha en Python que crea su servidor HTTP con CGI. 8 Toques finales 8. usar el siguiente código: if __name__ == '__main__': prueba() ///////////////////////////////////////////////////////////////////////////// . al cual agregamos al inicio las cadenas anteriores. En Linux es necesario que estés como root para correr estos guiones.1/pydoc. 5 meses Puntos: 1048 Fecha de Ingreso: junio-2009 Mensajes: 2. México Mensajes: 6. comentarles que vengo haciendo las cosas con php y me interesa meterme con python. Tal es así que estuve leyendo sobre el y estoy . #3 (permalink) 01/10/2011.219 Antigüedad: 4 años.166 Antigüedad: 8 años. 09:58 cristian_cena Colaborador ¿como integrar python con html/css/javascript? Hola.219 Antigüedad: 4 años. No se como integrar python con html/css/javascript. 11:50 cristian_cena Colaborador Fecha de Ingreso: junio-2009 Mensajes: 2. #2 (permalink) 01/10/2011. Si bien me he encontrado numerosas y valiosas guias. 11:19 Fecha de Ingreso: marzo-2005 Ubicación: Monterrey. no he hallado aún un lugar donde expliquen como desarrollar mi primer web con python sin frameworks.. 2 meses Puntos: 268 Respuesta: ¿como integrar python con html/css/javascript? . python no sirve contenido estático esto lo debes de configurar en tu servidor web. Les agradezco si tienen a mano algun link/ejemplo que pueda serme útil. 2 meses Puntos: 268 razpeitia Moderador Respuesta: ¿como integrar python con html/css/javascript? Al igual que php.. comentarles que vengo haciendo las cosas con php y me interesa meterme con python. con lo simple y bonito que luce el código y con lo rápido que aparenta ser el desarrollo en este lenguaje.¿como integrar python con html/css/javascript? Estas en el tema de ¿como integrar python con html/css/javascript? en el foro de Python en Foros del Web. Tal es así que estuve leyendo sobre el y estoy muy feliz con la sintaxis. Hola. #1 (permalink) 01/10/2011. <body> 10.219 Antigüedad: 4 años. 5 meses Puntos: 1048 razpeitia Moderador Respuesta: ¿como integrar python con html/css/javascript? Depende de que estés usando para programar web con python. ?> 11. </body> 12. ?> 4. </html> Como podría reescribirlo en python? #4 (permalink) 01/10/2011. <!DOCTYPE HTML> 5.166 Antigüedad: 8 años. <?php 2. <title>hola mundo metiendo php en codigo html</title> 8.php: Código HTML: Ver original 1. si tienes a bien quisiera que veamos un ejemplo: supongamos que tengo esto en php: archivo. <html lang="en-US"> 6. 3. comprendo. 2 meses Puntos: 268 Respuesta: ¿como integrar python con html/css/javascript? . 01:13 cristian_cena Colaborador Fecha de Ingreso: junio-2009 Mensajes: 2. $hola = "hola mundo". </head> 9. mod_python ? mod_wsgi ? fastcgi ? Tal vez te interesa leer este documento antes de empezar con la programación web con python #5 (permalink) 02/10/2011. <head> 7. 12:28 Fecha de Ingreso: marzo-2005 Ubicación: Monterrey. <?php echo $hola.gracias razpeitia. México Mensajes: 6. supongo que lo mejor será que use mod_python ya que uso apache para php. Gracias por el link me viene muy bien.com/embedding-. 1 mes Puntos: 532 AlvaroG /bin/env python Respuesta: ¿como integrar python con html/css/javascript? Un ejemplo simple que te servirá de base para traducir el PHP: http://www. 2 meses Puntos: 268 Respuesta: ¿como integrar python con html/css/javascript? Gracias AlvaroG. Saludos. Por simple que parezca. para mí es de vital importancia. Uruguay Mensajes: 7. emm. La facilidad de desarrollo y los sistemas integrados de cacheo hacen que valga la pena aún para cosas pequeñas. Soy super nuevo con python. #8 (permalink) 03/10/2011. 1 mes Puntos: 532 AlvaroG /bin/env python .. solo escribi lineas en la consola pero nada más.442 Antigüedad: 8 años.Muchas gracias por tu respuesta razpeitia. Uruguay Mensajes: 7.442 Antigüedad: 8 años. Muy útiles tus consejos. 08:16 cristian_cena Colaborador Fecha de Ingreso: junio-2009 Mensajes: 2. 07:11 Fecha de Ingreso: julio-2005 Ubicación: Canelones. 08:59 Fecha de Ingreso: julio-2005 Ubicación: Canelones.howtoforge.219 Antigüedad: 4 años. ya creía que lo mejor sería entrar con django y dejar de improvisar je. se agradece. __________________ blog ElCodiguero #7 (permalink) 03/10/2011..driva-opensuse Te recomiendo que desarrolles sobre frameworks. #6 (permalink) 03/10/2011. Eternamente agradecido si tienes la amabilidad de traducir el código que comparti arriba. Saludos. Seguramente los números hoy en día sean diferentes (y no vayas a tomar estos números como indicadores de nada. Con un framework tipo Django. Pyramid. pero 3-4 veces más lento que WP con un cache apropiado. __________________ blog ElCodiguero #9 (permalink) . 300 para WP.Zend FW . y servirla del cache 1. o cualquiera de los otros. Me gustaría ahondar en el asunto del cache. simple pero sin cache. que incorpora un sistema de cache. se estará ejecutando cada vez que se la solicite. y hacemos algunas cuentas. y 50000 para WP + SuperCache. y para cada caso habrá que estudiarlo. Si vos tenés una página hecha a mano. las subsecuentes peticiones servidas desde el cache compensan con creces esa generación inicial. contra el mismo sitio creado con: . 2-3 veces más rápido que Zend.php que se encargaba de procesar plantillas y URLs. ya que uno a veces evita los frameworks porque los considera demasiado pesados para algunos proyectos. vemos que la generación de la página en WP tomaba 200 ms. 5000 para el sitio basado en Zend. Por supuesto que para aprender uno siempre busca ir a lo básico. lo comparé en mi servidor local.WordPress . Aunque esa primera vez sea menos eficiente que una solución a mano. usando el comando "ab". si querés podés empezar con Web2Py. Hice algo bastante rígido basado en un solo index.Respuesta: ¿como integrar python con html/css/javascript? Si. Si tomamos los números como correctos. Es decir: mi sitio era 50 veces más rápido que WP. Por probar. cada petición demoraba 4 ms. No necesariamente Django. Te cuento una anécdota personal: en su momento (hace como 5 años ya) quise hacer mi sitio en PHP a mano. El asunto es que será mucho más fácil y útil: aunque quieras aprender lo básico para sitios simples. En mi solución. Flesk. son solamente un ejemplo). pero hay que saber cuándo vale la pena Saludos. a la hora de crear proyectos más grandes seguro terminarás usando algún framework. así es. la página se crea 1 vez y luego se sirve desde el cache.WordPress + WP SuperCache Ya no recuerdo exactamente los números. por su facilidad de desarrollo. por lo que resultaba más lenta luego de servir 72 páginas. y por eso vale la pena usarlos incluso para páginas relativamente estáticas. pero la cantidad de peticiones procesadas por minuto era algo así como 10-15mil para mi sitio. pero la conclusión es que un buen cache hace que un framework sea más rápido que las soluciones a medida. CherryPy.2 ms. Espero les sirva. es toda una delicia. 1.507 Antigüedad: 5 años. He aqui ejemplos de programas en Python. pero si tienes buenas bases de programación no te será difícil. ¿Cómo imprimir? print "Hola usuario" cadena="Soy buena onda" print cadena 2. si empiezas con Django y empiezas a leer los primeros capítulos de djangobook vas a ver como te conviene hacerlo con un Framework. Saludos __________________ Aprender sin pensar es inútil. Has como dice Alvaro. ¿Cómo crear una función? def msgSinArgumentos(): print "Yo no tengo parámetros" def msgConArgumentos(cad): cad="Yo si tengo parámetros" print cad Ejemplos.py ''' Crear una función para calcular el factorial ''' def factorial(x): if x==0: return 1 . 5 meses Puntos: 973 Respuesta: ¿como integrar python con html/css/javascript? Hola cristian_cena. Pensar sin aprender.03/10/2011. Factorial. 1. 18:05 Carlangueitor Moderador ლ(ಠ益ಠლ) Fecha de Ingreso: marzo-2008 Ubicación: México Mensajes: 7. recién veo tu MP. peligroso. ////////////////////////////////////////////////////////////////////////////////////////////// ueno lo prometido es deuda. Yo realmente no tengo mucho tiempo programando en python (4 o 6 meses). 75.+100" while (numero<=maxi): suma=suma+numero numero=numero+2 print "Suma parcial [". Bucles.25.suma. maxi=2.2) print "Valor original= ". 100 print "Inicio" print "Sumatoria del 2+.0." \n" print "Suma total ["." resultado= ".py from math import* def Funcion_Seno(x): return cos(x)-x def Funcion_Coseno(x): return sin(x)-x MX=30 .i.."] no.numero.0.else: return x * factorial(x -1) #main numero=0 continuar='n' print "Factorial de un numero" while continuar!='s': continuar=raw_input('¿Desea realizar el cálculo? Si->s No-n: ') while numero<=0: numero=int(raw_input('Introduce numero:')) resultado=factorial(numero) print "El factorial de %d es %d" %(numero.suma. Menu. numero.0] print "Inicio" print "Bucles con vectores" for i in vector: vo=vo+pow(i.1. 4. ".py from math import* vo=0 vector=[0.50."]" print "Fin" 3.py suma.resultado) 2. Sumatoria.vo print "Fin" 4. " posición no.altura def CalcArea(self): return self.base): self.AsignaBase(b) MiCalculo.ObtenerAltura() .base=base def AsignaAltura(self. h=0." posición no. Calcular función coseno 3.contador elif opcion==3: exit() else: print "Opción inválida" 5.resultado.altura/2 #main b.Area.py #ejemplo de POO en Python class Area: def AsignaBase(self. ". Salir" while opcion<=0: opcion=int(raw_input('Tu opción es:')) if opcion==1: print "Elegiste calcular función seno [sin(x)-x]" while contador<=MX: contador+=1 resultado=Funcion_Seno(contador) print "\nValor = ".base*self.contador elif opcion==2: print "Elegiste calcular función coseno [cos(x)-x]" while contador<=MX: contador+=1 resultado=Funcion_Coseno(contador) print "\nValor = ". altura): self.base def ObtenerAltura(self): return self.altura=altura def ObtenerBase(self): return self.resultado. AsignaAltura(h) print "Base leida: %f"%MiCalculo. ". Calcular función seno 2. 0 print "**** [Cálculo del área]****" MiCalculo=Area() while b<=0: b=float(raw_input('Base: ')) while h<=0: h=float(raw_input('Altura: ')) MiCalculo.resultado=0 contador=0 opcion=0 print "*** [ Funciones matemáticas en Python ] ***" print"\n\t 1.ObtenerBase() print "Altura leida: %f"%MiCalculo. maximo.8 salir="s" opc=0 grados=0 while salir =="s": print "[Conversor de temperaturas]\n" print "1.8)+32 def obtenerCelsius(gf): return (gf-32)/1." celsius leidos" print "Grados fahrenheit obtenidos: ".0.81.0 print "[Obtener velocidad]" while (cont<maximo): vo=vo+(k1-(k2*vo))*cont cont=cont+dt print "".vo." fahrenheit leidos" print "Grados celsius obtenidos: ".CalcArea() 6.5. Obtener grados fahrenheit" print "2.9. Menú sencillo en Python def obtenerFahrenheit(gc): return (gc*1.50.print "Área obtenida: %f"%MiCalculo. para alcular la velocidad dt.cont.0." --> periodo:[".cont=0.vo.obtenerFahrenheit(grados) if opc==2: print "[Obtener celsius]\n" while grados<=0: grados=float(raw_input('Introduce valor: ')) print grados.obtenerCelsius(grados) else: print "opción no válida" ."]" 7. Uso de while.k2. Obtener grados celsius" while opc<=0: opc=int(raw_input('Introduce opción:')) if opc==1: print "[Obtener fahrenheit]\n" while grados<=0: grados=float(raw_input('Introduce valor: ')) print grados.2.k1. En este ejercicio tenemos que tener en cuenta que: 1 minuto = 60 segundos.C.5.3. para cualquier número de segundos inferior a un millón.8. Este es el primero de la serie de artículos que presentaré estos días sobre una colección de ejercicios muy básicos de programación.2. te resultarán triviales los planteamientos expuestos. Decir que son muy sencillos y sirven para afianzar conocimientos básicos de sintaxis y razonamiento. en Python y en español. Ejercicio 1.10] i. Peyrin. De lo contrario.6. minutos y segundos. 1 dia = 24 horas = 1440 minutos = 86400 segundos. 1 hora = 60 minutos = 3600 segundos. Si eres novel en programación ó en Python.7. I. de P. Los enunciados los he obtenido del libro Esquemas Algorítmicos Fundamentales . editorial Masson.4.sustituto=0. para resolver con Python (o cualquier otro lenguaje). Hola.salir=raw_input('Deseas realizar ota operación? (s/n):') print "" if salir=="n": print "adios" 8. Escribir un algoritmo que. horas. dato = raw_input(u'Número de segundos: ') # Hacemos un cast.Secuencias e Iteración. calcule su equivalente en días. Sustituir un número de un arreglo ''' sustituir un elemento de un arreglo ''' numeros=[1.P. dato = long(dato) .564 for i in range(len(numeros)): if numeros[i]==6: numeros[i]=sustituto print numeros[i] //////////////////////////////////////////////////////// Ejercicios resueltos de programación.9. Scholl y J. este post es para tí. # Pedimos datos. convirtiendo la cadena en un número largo. nhoras. para el verbo cantar el resultado es yo canto. media) print cadena Ejercicio 3. el canta. # Obtenemos números. aux = divmod(dato. 'segundo'. vosotros cantáis. nseg = divmod(aux. Escribir un algoritmo que. numeros = [] for i in ['primer'. numeros. nmin. obtenga la conjugación en singular y plural de presente de indicativo. 3600) # Minutos y segundos. if dato >= 1000000: print "El número debe de ser menor a 1000000" else: # Días. ndias. print '%d días. minimo = numeros[0] maximo = numeros[2] # Obtenemos la media aritmética. nseg) Ejercicio 2. . %d minutos. %d horas.sort() # Obtenemos máximo y mínimo. %d segundos' % \ (ndias. Por ejemplo. ellos cantan.append(float(raw_input(texto))) # Ordenamos.3) # Visualizamos resultados. aux = divmod(aux.'tercer']: texto = u'Introduce el %s número: ' % (i) numeros. tu cantas. maximo. nhoras. 86400) # Horas. nosotros cantamos. el máximo y la media de tres números. cadena = u'Mínimo: %d.# Comprobamos si el número introducido es menor a un millón. nmin. media = round((numeros[0] + numeros[1] + numeros[2]) / float(3). Media: %f' % (minimo. Escribir un algoritmo que imprima el mínimo. Máximo: %d. 60) # Mostramos resultado. dado el infinitivo de un verbo regular de la primera conjugación. conjugación: ') # Recorremos la tabla hashing (diccionario).1. 'nosotros':'amos'. 'tu':'as'. Por ejemplo: 1.split('. # Obtenemos datos.'el'. for i in pronombre: print i. palabra[0:len(palabra)-2] + terminaciones[i] Ejercicio 4. nbinario = raw_input(u'Número binario (4 cifras): ') # Obtenemos los dígitos. para un número binario de 4 cifras. imprima su valor en base 10. 'vosotros':u'áis'.') if len(nbinario) == 1: nbinario = list(nbinario[0]) # Inicializamos algunos contadores.0. decimal = 0 potencia = 0 # Le damos la vuelta al número binario.1.potencia) if i == '1' else 0 potencia += 1 . -forma 2: el dato es un entero cuya representación decimal con cuatro cifras no contenga más que 0 ó 1: Por ejemplo: 1101.'tu'.'ellos'] terminaciones = {'yo':'o'.pronombre = ['yo'. for i in nbinario: decimal += pow(2. nbinario = nbinario. Escribir un algoritmo que.reverse() # Calculamos el número decimal. 'el':'a'. 'ellos':'an'} # Pedimos datos. Se estudiarán dos formas del problema según la representación de los datos: -forma 1: los datos son cuatro enteros (0 ó 1).'nosotros'. palabra = raw_input(u'Verbo regular 1ra. construyendo la conjugación verbal. a partir del número binario. nbinario.'vosotros'. anyo) print cadena Ejercicio 6. 0.02. # Declaramos datos básicos (euros) con los que trabajar.# Visualizamos resultado. 2. dato = raw_input(u'Introducir importe (euros): ') # Buscamos parte decimal y entera.20. dato = raw_input('Introduce dato: ') # Decodificamos año dentro del siglo XXI. El dato es un entero comprendido entre 10100 y 311299. 0.10. cadena = u'Su representación decimal es %d' % (decimal) print cadena Ejercicio 5. para el dato 30485. Por ejemplo.50. Escribir un algoritmo que. 0. .200. 0. para una suma de dinero dada. donde meter el dinero. 0.10. del mes dentro del año y del año dentro del siglo. Se desea utilizar el mínimo de billetes y monedas.5. No hay ninguna limitación respecto al número de billetes y monedas disponibles. Escribir un algoritmo que decodifique fechas del siglo XXI.100. indique cómo descomponerla en billetes y monedas corrientes. monedero = [] # Pedimos la cantidad.20. billetes_y_monedas = [500. cadena = '%d-%d-%d' % (dia.50. el resultado es el texto 3-4-2085. mes. anyo = 2000 + int(dato[len(dato)-2:]) # Decodificamos mes. mes = int(dato[len(dato)-4:len(dato)-2]) # Decodificamos día.05.01] # Creamos un monedero. 0. dia = int(dato[:len(dato)-4]) # Mostramos resultado. El resultado es una secuencia de caracteres: número del día dentro del mes. 1. # Obtenemos dato. unidades.unidades)) # Asignamos lo que nos queda..dato = dato.append((i. try: parte_decimal = float('0.'+dato[1]) except: parte_decimal = 0.unidades)) # Asignamos lo que nos queda. . cadena = '' for i in monedero: if i[0] >= 5: cadena += '%d billete/s de %d euros' % (i[1]..split('. un símbolo de operación y otra cifra.2) # Visualizamos el resultado. Escribir un algoritmo que simule el funcionamiento de una calculadora..append((i.i[0]) if i[0] < 5: cadena += '%d moneda/s de %s euros' % (i[1]. dato = raw_input(u'Introduce operación: ') # Inicializamos resultado.0 # Entera. i) if unidades != 0: monedero. El dato es una serie de tres caracteres: una cifra. parte_entera = long(dato[0]) # Algoritmo de asignación de dinero. # Pedimos datos.') # Decimal. resto = divmod(parte_decimal. parte_decimal = round(resto. resto = divmod(parte_entera.i[0]) cadena += '\n' print cadena Ejercicio 7. unidades. parte_entera = resto if parte_decimal > 0: for i in billetes_y_monedas: # Obtenemos número de monedas y los guardamos.. i) if unidades != 0: monedero. El resultado es el valor de la expresión dada. for i in billetes_y_monedas: # Obtenemos número de billetes ó monedas y los guardamos. 43.split('. minutos.resultado Ejercicio 8. Escribir un algoritmo que imprima la hora correspondiente al siguiente segundo. if segundos != 60: tiempo = (horas. por cuestión de simplicidad. tiempo = raw_input('Introduce tiempo: ') # Obtenemos datos.24 tiene que devolver 13.split('*') if len(serie) == 2: resultado = long(serie[0]) * long(serie[1]) else: # ¿División? serie = dato. # Pedimos datos.') horas = int(aux[0]) minutos = int(aux[1]) segundos = int(aux[2]) # Aumentamos un segundo.long(serie[1]) else: # ¿Multiplicación? serie = dato. Se supone que lo que introducimos es una hora correcta. Por ejemplo. Darse cuenta que no se chequean los datos introducidos.split('-') if len(serie) == 2: resultado = long(serie[0]) .split('/') if len(serie) == 2: resultado = long(serie[0]) / long(serie[1]) # Mostramos resultado.25. segundos += 1 # Casos. Consideremos una hora expresada en forma de tripleta . para la entrada 13. print "El resultado es". segundos) . aux = tiempo.resultado = 0 # ¿Suma? serie = dato.43.split('+') if len(serie) == 2: resultado = long(serie[0]) + long(serie[1]) else: # ¿Resta? serie = dato. 5! = 5*4*3*2*1 = 120. def es_consonante(letra): if letra. diéresis. 0. def factorial(numero): return 1 if numero <=0 else numero * factorial(numero -1) Saludos. Escribir una función que calcule el factorial de un número.'u']: return True else: return False Ejercicio 10. Escribir una función que determine si una letra dada es consonante. etc). print tiempo Ejercicio 9.else: if minutos == 59 and horas == 23: tiempo = (0. Por ejemplo.'i'. minutos + 1.'e'.'o'.lower() not in ['a'. José Julio9 de enero de 2011 20:36 . en 14:07 Enviar por correo electrónicoEscribe un blogCompartir con TwitterCompartir con Facebook Etiquetas: ejercicios. 0. python 94 comentarios: 1. A la función le faltaría controlar las letras con acentuación (tildes. 0) else: if minutos == 59: tiempo = (horas + 1. 0) # E imprimimos resultado (una tupla). 0) else: tiempo = (horas. 50. u' céntimos' //////////////////////////////////////////////////////////////////////////////////// Mi diario Python Diario sobre el aprendizaje en python. 27 de mayo de 2013 Voy a dejar algunos ejercicios en python. python ejercicios » Ejercicios en python (Parte 1) Ejercicios en python (Parte 1) lunes.. x cociente = resto print centimos. x if x == 1: print cociente. x) if x > 2: print cociente. traducción de manuales en ingles y alguna cosa mas.Esta es una solución más corta para el problema 6: #-*. tutoriales. 1] cociente = cifra centimos = int(100 * (cifra . Si hay alguna dificultad no duden en .    Ir al Inicio » ejercicios .coding: UTF-8 -*cifra = float(raw_input(u'¿Cuántos euros? ')) monedas = [500.int(cifra))) for x in monedas: if cociente >= x: cociente. ' moneda de '. x if x == 2: print cociente. resto = divmod(cociente. 10. Ejercicios paso a paso. ' monedas de '. ' billete de '. 200.. 20. ejercicios en python . 100. 2. 5. También voy a crear un post con mis soluciones. Por ejemplo la cadena "estoy probando" debería devolver la cadena "odnaborp yotse" 7 . ejemplo: es_palindromo ("radar") tendría que devolver True.Ejercicios Python comentar. 3. pero escribirla por nosotros mismos resulta un muy buen ejercicio.Definir una función max() que tome como argumento dos números y devuelva el mayor de ellos.3. que tome tres números como argumentos y devuelva el mayor de ellos.Definir una función que calcule la longitud de una lista o una cadena dada.Escribir una funcion sum() y una función multip() que sumen y multipliquen respectivamente todos los números de una lista. de lo contrario devuelve False.Definir una función inversa() que calcule la inversión de una cadena. 6.4]) debería devolver 24.Definir una función max_de_tres(). (Es cierto que python tiene una función max() incorporada.Definir una función es_palindromo() que reconoce palíndromos (es decir.Definir una función superposicion() que tome dos listas y devuelva True si tienen al menos 1 miembro en común o devuelva False de lo contrario.2.3.2. pero hacerla nosotros mismos es un muy buen ejercicio. ustedes pueden aportar las suyas.Escribir una función que tome un carácter y devuelva True si es una vocal. 5. 4. 8.4]) debería devolver 10 y multip([1. Escribir la función usando el bucle for anidado. (Es cierto que python tiene la función len() incorporada. 1. palabras que tienen el mismo aspecto escritas invertidas). . Por ejemplo: sum([1. 2. end="") palabra = input() lista += [palabra] print("La lista creada es:".2    Para contar los elementos. 9. lista) Listas (1) . numero = int(input("Dígame cuántas palabras tiene la lista: ")) if numero < 1: print("¡Imposible!") else: lista = [] for i in range(numero): print("Dígame la palabra".1   Este programa puede incluir un bucle que se ejecute tantas veces como palabras tiene la lista. se compara el valor de la lista con el valor buscado y si coinciden.Definir una función generar_n_caracteres() que tome un entero n y devuelva el caracter multiplicado por n. Listas (1) . 10. 7]) debería imprimir lo siguiente: **** Listas . Ejemplo: procedimiento([4. numero = int(input("Dígame cuántas palabras tiene la lista: ")) if numero < 1: print("¡Imposible!") else: lista = [] for i in range(numero): print("Dígame la palabra". En cada iteración del bucle. se pide un valor y se añade a la lista.9. se aumenta el valor de un contador.Definir un histograma procedimiento() que tome una lista de números enteros e imprima un histograma en la pantalla. Puesto que no se van a modificar los valores de la lista. la lista se puede recorrer directamente (for i in lista).Soluciones (1) Se ofrecen a continuación unas posibles soluciones de los ejercicios de listas (1). este programa puede incluir un bucle que recorra la lista una vez creada. str(i + 1) + ": ". "x") debería devolver "xxxxx". str(i + 1) + ": ". end="") . Por ejemplo: generar_n_caracteres(5. En cada iteración del bucle. se compara el valor de la lista con el valor buscado y si coinciden. Puesto que se van a modificar los valores de la lista. se elimina el valor de la lista. Puesto que se van a modificar los valores de la lista.3    Para sustituir los elementos. se compara el valor de la lista con el valor buscado y si coinciden. lista) Listas (1) . end="") palabra = input() lista += [palabra] print("La lista creada es:". if contador == 0: print("La palabra '" + buscar elif contador == 1: print("La palabra '" + buscar lista. "veces Listas (1) . este programa puede incluir un bucle que recorra la lista una vez creada. En cada iteración del bucle. lista) buscar = input("Sustituir la palabra: ") sustituir = input("por la palabra: ") for i in range(len(lista)): if lista[i] == buscar: lista[i] = sustituir print("La lista es ahora:". contador. se sustituye el valor de la lista. este programa puede incluir un bucle que recorra la lista una vez creada.") + "' aparece una vez en la + "' aparece".4    Para borrar los elementos.") else: print("La palabra '" + buscar en la lista. En cada iteración del bucle.") buscar = contador for i in if i a buscar: ") + "' no aparece en la lista. str(i + 1) + ": ". . la lista se tiene que recorrer indirectamente (for i in range(len(lista))). lista) input("Dígame la palabra = 0 lista: == buscar: contador += 1. numero = int(input("Dígame cuántas palabras tiene la lista: ")) if numero < 1: print("¡Imposible!") else: lista = [] for i in range(numero): print("Dígame la palabra". la lista se tiene que recorrer indirectamente (for i in range(len(lista))).palabra = input() lista += [palabra] print("La lista creada es:". se compara el elemento siguiente al borrado. numero = int(input("Dígame cuántas palabras tiene la lista: ")) if numero < 1: print("¡Imposible!") else: lista = [] for i in range(numero): print("Dígame la palabra". str(i + 1) + ": ". En la siguiente iteración del bucle. end="") palabra = input() lista += [palabra] print("La lista creada es:". Como el bucle se ejecuta tantas veces como elementos tenía originalmente. lo que produciría un error. por lo que el elemento que ha ocupado la posición del elemento borrado escapa a la comprobación. mientras que la lista de palabras inicial debe recorrerse de forma indirecta y al revés por los mismos motivos que en el ejercicio anterior. str(i + 1) + ": ". Este problema puede pasar desapercibido si la lista no contiene dos elementos seguidos a eliminar. lista) numero2 = int(input("Dígame cuántas palabras tiene la lista de . -1. al llegar a la última iteración. end="") palabra = input() lista += [palabra] print("La lista creada es:". numero = int(input("Dígame cuántas palabras tiene la lista: ")) if numero < 1: print("¡Imposible!") else: lista = [] for i in range(numero): print("Dígame la palabra". se estaría haciendo referencia a un elemento que ya no existe. Si se eliminan más elementos. lista) Listas (1) . La lista de palabras a eliminar se puede recorrer de forma directa. al eliminar un elemento los elementos siguientes avanzan una posición. o Si la lista se recorre del primer al último elemento. al eliminar un elemento la lista se acorta. -1): if lista[i] == eliminar: del(lista[i]) print("La lista es ahora:". lista) eliminar = input("Palabra a eliminar: ") for i in range(len(lista)-1. Este programa puede incluir un bucle que recorra la lista de palabras a eliminar y en cada iteración elimine una palabra. Un detalle importante es que la lista se tiene que recorrer al revés (del último al primer elemento) por dos motivos: o Si la lista se recorre del primer al último elemento. el error se produciría antes.5    Este ejercicio es similar al anterior. eliminar) for i in eliminar: for j in range(len(lista)-1. -1. -1. numero = int(input("Dígame cuántas palabras tiene la lista: ")) if numero < 1: print("¡Imposible!") else: lista = [] for i in range(numero): print("Dígame la palabra". se comprueba si el elemento se encuentra en la sublista anterior a ese elemento (desde el principio hasta el elemento anterior) y si es así. str(i + 1) + ": ". -1)).6    Para crear la lista inversa. la lista se debe recorrer indirectamente y al revés ( for i in range(len(lista)-1. En cada iteración del bucle.7    Para eliminar los elementos repetidos. En cada iteración del bucle.palabras a eliminar: ")) if numero2 < 1: print("¡Imposible!") else: eliminar = [] for i in range(numero2): print("Dígame la palabra". str(i + 1) + ": ". Puesto que se van a eliminar los valores de la lista. end="") palabra = input() eliminar += [palabra] print("La lista de palabras a eliminar es:". este programa puede incluir un bucle que recorra la lista una vez creada. la lista se puede recorrer directamente (for i in lista). este programa puede incluir un bucle que recorra la lista una vez creada. -1): if lista[j] == i: del(lista[j]) print("La lista es ahora:". se borra. Puesto que no se van a modificar los valores de la lista. se añade el elemento de la lista inicial al principio de la lista inversa. lista) inversa = [] for i in lista: inversa = [i] + inversa print("La lista inversa es:". end="") palabra = input() lista += [palabra] print("La lista creada es:". lista) Listas (1) . . inversa) Listas (1) . -1.8    El programa debe empezar pidiendo dos listas y eliminando los elementos repetidos. se borra. -1. str(i + 1) + ": ". numero = int(input("Dígame cuántas palabras tiene la primera lista: ")) if numero < 1: print("¡Imposible!") else: primera = [] for i in range(numero): print("Dígame la palabra". end="") palabra = input() segunda += [palabra] print("La segunda lista es:". -1): if lista[i] in lista[:i]: del(lista[i]) print("La lista sin repeticiones es:". segunda) . En cada iteración del bucle. -1. lista) for i in range(len(lista)-1. Puesto que se van a eliminar los valores de la lista. -1)). como en el ejercicio anterior. end="") palabra = input() lista += [palabra] print("La lista creada es:". primera) for i in range(len(primera)-1.numero = int(input("Dígame cuántas palabras tiene la lista: ")) if numero < 1: print("¡Imposible!") else: lista = [] for i in range(numero): print("Dígame la palabra". -1): if primera[i] in primera[:i]: del(primera[i]) # print("La primera lista sin repeticiones es:". primera) numero2 = int(input("Dígame cuántas palabras tiene la segunda lista: ")) if numero2 < 1: print("¡Imposible!") else: segunda = [] for i in range(numero2): print("Dígame la palabra". lista) Listas (1) . se comprueba si el elemento se encuentra en la sublista anterior a ese elemento (desde el principio hasta el elemento anterior) y si es así. str(i + 1) + ": ". str(i + 1) + ": ". end="") palabra = input() primera += [palabra] print("La primera lista es:". la lista se debe recorrer indirectamente y al revés ( for i in range(len(lista)-1. -1.1 Escriba un programa que permita crear una lista de palabras. comunes) soloPrimera = [] for i in primera: if i not in segunda: soloPrimera += [i] print("Palabras que sólo aparecen en la primera lista:". Listas (1) . soloSegunda) todas = comunes + soloPrimera + soloSegunda print("Todas las palabras:". soloPrimera) soloSegunda = [] for i in segunda: if i not in primera: soloSegunda += [i] print("Palabras que sólo aparecen en la segunda lista:". todas) ///// Su pregunta Listas . Se pueden consultar unas posibles soluciones. el programa tiene que pedir un número y luego solicitar ese número de palabras para crear la lista. Por último.for i in range(len(segunda)-1. Para ello. segunda) comunes = [] for i in primera: if i in segunda: comunes += [i] print("Palabras que aparecen en las dos listas:". -1): if segunda[i] in segunda[:i]: del(segunda[i]) # print("La segunda lista sin repeticiones es:". Dígame cuántas palabras tiene la lista: 3 Dígame la palabra 1: Alberto Dígame la palabra 2: Benito Dígame la palabra 3: Carmen . el programa tiene que escribir la lista.Ejercicios (1) Estos ejercicios corresponden a lo explicado en la lección Listas. Dígame cuántas palabras tiene la lista: 4 Dígame la palabra 1: Carmen Dígame la palabra 2: Alberto Dígame la palabra 3: Benito Dígame la palabra 4: Carmen La lista creada es: ['Carmen'. pida una palabra y diga cuántas veces aparece esa palabra en la lista. 'Benito'. 'Benito'. 'Carmen'] Dígame la palabra a buscar: Alberto La palabra 'Alberto' aparece una vez en la lista. 'Carmen'] Dígame la palabra a buscar: Carmen La palabra 'Carmen' aparece 2 veces en la lista. 'Carmen'] Dígame cuántas palabras tiene la lista: 0 ¡Imposible! Listas (1) . a continuación.2 Escriba un programa que permita crear una lista de palabras y que. Dígame cuántas palabras tiene la lista: 4 Dígame la palabra 1: Carmen . Dígame cuántas palabras tiene la lista: 4 Dígame la palabra 1: Carmen Dígame la palabra 2: Alberto Dígame la palabra 3: Benito Dígame la palabra 4: Carmen La lista creada es: ['Carmen'. 'Alberto'.La lista creada es: ['Alberto'. 'Alberto'. 'Benito'. Dígame la palabra 2: Alberto Dígame la palabra 3: Benito Dígame la palabra 4: Carmen La lista creada es: ['Carmen'. 'Carmen'] Sustituir la palabra: Carmen por la palabra: David La lista es ahora: ['Alberto'.4 Escriba un programa que permita crear una lista de palabras y que. 'Benito'. 'Carmen'] Dígame la palabra a buscar: David La palabra 'David' no aparece en la lista.3 Escriba un programa que permita crear una lista de palabras y que. Listas (1) . Dígame cuántas palabras tiene la lista: 4 Dígame la palabra 1: Alberto Dígame la palabra 2: Carmen Dígame la palabra 3: Benito Dígame la palabra 4: Carmen La lista creada es: ['Alberto'. 'Carmen'. 'Benito'. pida dos palabras y sustituya la primera por la segunda en la lista. Dígame cuántas palabras tiene la lista: 4 Dígame la palabra 1: Alberto Dígame la palabra 2: Carmen . 'David'] Listas (1) . pida una palabra y elimine esa palabra de la lista. 'Benito'. 'David'. a continuación. 'Alberto'. a continuación. elimine de la primera lista los nombres de la segunda lista. 'Benito'.5 Escriba un programa que permita crear dos listas de palabras y que. 'Benito'] Palabra a eliminar: Carmen La lista es ahora: ['Alberto'. Dígame cuántas palabras tiene la lista: 5 Dígame la palabra 1: Carmen Dígame la palabra 2: Carmen Dígame la palabra 3: Alberto Dígame la palabra 4: Benito Dígame la palabra 5: David La lista creada es: ['Carmen'. cree una segunda lista igual a la primera. 'Benito'] Listas (1) . 'David'] Dígame cuántas palabras tiene la lista de palabras a eliminar: 3 Dígame la palabra 1: Benito Dígame la palabra 2: Juan Dígame la palabra 3: Carmen La lista de palabras a eliminar es: ['Benito'.6 Escriba un programa que permita crear una lista de palabras y que. 'Carmen'. pero al revés (no se trata de escribir la lista al revés. 'Carmen'. 'Carmen'] La lista es ahora: ['Alberto'. .Dígame la palabra 3: Carmen Dígame la palabra 4: Benito La lista creada es: ['Alberto'. 'Alberto'. 'David'] Listas (1) . a continuación. a continuación. 'Juan'. 'Carmen'. a continuación. pero no en la segunda. 'Alberto'] Listas (1) . pero no en la primera. Dígame cuántas palabras tiene la lista: 4 Dígame la palabra 1: Alberto Dígame la palabra 2: Carmen Dígame la palabra 3: Benito Dígame la palabra 4: Daniel La lista creada es: ['Alberto'. 'Carmen'] La lista sin repeticiones es: ['Alberto'. 'Carmen'. 'Carmen'. 'Benito'. Lista de palabras que aparecen en la primera lista. 'Benito'] Listas (1) . escriba las siguientes listas (en las que no debe haber repeticiones):     Lista de palabras que aparecen en las dos listas. Dígame cuántas palabras tiene la lista: 4 Dígame la palabra 1: Alberto Dígame la palabra 2: Carmen Dígame la palabra 3: Benito Dígame la palabra 4: Carmen La lista creada es: ['Alberto'.8 Escriba un programa que permita crear dos listas de palabras y que. 'Benito'. 'Carmen'. 'Daniel'] La lista inversa es: ['Daniel'. elimine los elementos repetidos (dejando únicamente el primero de los elementos repetidos). 'Benito'.7 Escriba un programa que permita crear una lista de palabras y que.sino de crear una lista distinta). a continuación. . 'Carmen'. Lista de palabras que aparecen en ambas listas. Lista de palabras que aparecen en la segunda lista. 'Juan'] Bucle while .Nota: Para evitar las repeticiones. Dígame cuántas palabras tiene la primera lista: 4 Dígame la palabra 1: Carmen Dígame la palabra 2: Alberto Dígame la palabra 3: Benito Dígame la palabra 4: Carmen La primera lista es: ['Carmen'. 'Carmen'] Dígame cuántas palabras tiene la segunda lista: 3 Dígame la palabra 1: Benito Dígame la palabra 2: Juan Dígame la palabra 3: Carmen La segunda lista es: ['Benito'. 'Alberto'. Nota: En estos ejercicios no se debe realizar ninguna comprobación de tipos. es decir. . Se pueden consultar unas posibles soluciones. 'Carmen'] Palabras que aparecen en las dos listas: ['Carmen'. que si el programa pide un número y el usuario escribe una palabra. 'Benito'. 'Juan'. los programas pueden fallar e interrumpirse. 'Benito'] Palabras que sólo aparecen en la primera lista: ['Alberto'] Palabras que sólo aparecen en la segunda lista: ['Juan'] Todas las palabras: ['Carmen'.Ejercicios (1) Estos ejercicios corresponden a lo explicado en la lección sobre el bucle while. 'Benito'. 'Alberto'. el programa deberá empezar eliminando los elementos repetidos en cada lista. Escriba un número: 14 Escriba otro número: 123 Escriba otro número: -25 Escriba otro número: 123 Escriba otro número: Los números que ha escrito son [14. El programa termina escribiendo la lista de números. Escriba una palabra: viaje Escriba otra palabra: aventura Escriba otra palabra: tebeo Escriba otra palabra: Las palabras que ha escrito son ['viaje'.01 Escriba un programa que pida palabras y las guarde en una lista. escriba una nota que no esté entre 0 y 10. -25. El programa termina escribiendo la lista de palabras.5 Escriba una nota: 0 . El programa termina escribiendo la lista de notas. 123.03 Escribe un programa que te pida notas (números decimales entre 0 y 10) y las guarde en una lista. La lista de notas final no debe escribirse como lista. Para terminar de introducir notas. sino como valores separados por espacios. 123] Bucle while (1) . simplemente debe pulsarse Intro.Bucle while (1) . simplemente debe pulsarse Intro.02 Escriba un programa que pida números enteros y los guarde en una lista. Escriba una nota: 7. Para terminar de introducir números. 'tebeo'] Bucle while (1) . Para terminar de introducir palabras. 'aventura'. 06 Escriba un programa que pida primero dos números enteros (mínimo y máximo) y que después pida números enteros situados entre ellos. Escriba un número: 6 Escriba un número mayor que 6: 10 Escriba un número mayor que 10: 12 Escriba un número mayor que 12: 25 Escriba un número mayor que 25: 9 Los números que ha escrito son [6. Escriba un número: 6 Escriba un número mayor que 6: 6 6 no es mayor que 6.5 0. El programa termina escribiendo la lista de números. Bucle while (1) .05 Escriba un programa que pida números enteros cada vez más grandes y los guarde en una lista. 25] Bucle while (1) . . Inténtelo de nuevo: 8 Los números que ha escrito son 6 y 8. El programa termina escribiendo los dos números. Inténtelo de nuevo: 1 1 no es mayor que 6.0 10. Para terminar de escribir números.0 Bucle while (1) . Para terminar de escribir números. 10.04 Escriba un programa que pida dos números enteros. de manera que el segundo sea mayor que el primero.Escriba una nota: 10 Escriba una nota: -1 Las notas que ha escrito son: 7. 12. escriba un número que no sea mayor que el anterior. Escriba el límite: 50 Escriba un número: 10 . 15. Inténtelo de nuevo: 50 Escriba un número entre 6 y 50: 45 Escriba otro número entre 6 y 50: 13 Escriba un número entre 6 y 50: 4 Los números situados entre 6 y 50 que ha escrito son [45. La lista creada es [10.08 Escriba un programa que pida primero un número entero y después pida números enteros hasta que la suma de los números introducidos coincida con el número inicial. El programa termina escribiendo la lista de números. Escriba el límite: 50 Escriba un número: 10 Escriba otro número: 25 Escriba otro número: 15 Escriba otro número: 14 El límite a superar es 50. 14] Bucle while (1) . 25.07 Escriba un programa que pida primero un número entero (límite) y después pida números enteros hasta que la suma de los números introducidos supere el número inicial. El programa termina escribiendo la lista de números. El programa termina escribiendo la lista de números.escriba un número que no esté comprendido entre los dos valores iniciales. Escriba un número: 6 Escriba un número mayor que 6: 4 4 no es mayor que 6. 13] Bucle while (1) . 39] Bucle while (1) . telef2]. El programa termina escribiendo todos los nombres y teléfonos. [nombre3. telef1]. se debe pulsar Intro cuando pida el nombre. 1. Escriba otro número: 1 Escriba otro número: 39 El límite a alcanzar es 50. Escriba un nombre: Paco Jerte Escriba su teléfono: 963141592 Escriba otro nombre: Susana Horia Escriba su teléfono: Escriba otro nombre: Ulises Tropeado Escriba su teléfono: 962718281 Escriba otro nombre: . [nombre2.Escriba otro número: 45 45 es demasiado grande. La lista creada es [10. 1. telef3]. 39] Escriba el límite: 50 Escriba un número: 60 60 es demasiado grande.09 Escriba un programa que pida nombres de personas y sus números de teléfono. La lista creada es [10. Escriba otro número: 10 Escriba otro número: 45 45 es demasiado grande. Notas:   La lista en la que se guardan los nombres y teléfonos puede ser [ [nombre1. Escriba otro número: 1 Escriba otro número: 39 El límite a alcanzar es 50. Para terminar de escribir nombres y números. etc] Una persona puede no tener número de teléfono. [nombre2.. [nombre3.... Notas:   La lista en la que se guardan los nombres y notas es [ [nombre1. nota2. nota2. Para terminar de escribir nombres de alumnos. .5 Escriba otra nota: 12 Escriba otro nombre: Diego Loso Escriba una nota: 14 Escriba otro nombre: Inés Pejo Escriba una nota: 7. . ] Un alumno puede no tener notas Escriba un nombre: Héctor Tuga Escriba una nota: 4 Escriba otra nota: 8. . .5 Escriba otra nota: 1 Escriba otra nota: 2 Escriba otra nota: -5 Escriba otro nombre: Las notas de los alumnos son: ...10 Escriba un programa que pida los nombres y las notas (decimales entre 0 y 10) de varios alumnos. nota1. nota2.. ].Los nombres y teléfonos son: Paco Jerte: 963141592 Susana Horia: Ulises Tropeado: 962718281 Bucle while (1) . nota1. ]. escriba una nota fuera del intervalo de 0 a 10. ]. Para terminar de escribir notas de un alumno. se debe pulsar Intro cuando pida el nombre.. nota1. Héctor Tuga: 4.5 1.0 **********************La solución:------- .5 Diego Loso: Inés Pejo: 7.0 2.0 8.
Copyright © 2024 DOKUMEN.SITE Inc.