89
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.”

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

Embed Size (px)

Citation preview

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

Cómo se utiliza Python y Django en Mejorando.laSeguramente 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 = (

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

'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.”

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

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

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

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

Windows. Linux, Mac OSX, Solaris y AIX entre otros cuentan con uno, aunque algunas veces compensa instalar una versión más actualizada que la que encontraremos en la distribución del sistema operativo. En el caso especial de Windows bastará con descargarse un instalador, darle doble clic y decir que sí a todo.

Cuando ejecutamos código en Python lo lanzamos a un intérprete que es capaz de entender este lenguaje. 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.

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.

Consola de Python en la ventana de IDLE en Linux

La manera de acceder a esta consola difiere en función del sistema operativo. En los UNIX y derivados bastará con abrir una consola de sistema y teclear en ella python. En Windows bastará con abrir el programa correspondiente que seguro que se llamará Python shell o algo parecido.

Una vez estemos delante del intérprete de Python podemos empezar a jugar. En este respecto se trata de un lenguaje de programación parecido a Matlab, de modo que podemos probar a hacer una suma sin problemas.

>>> 2+24

Como seguramente intentaréis hacer algo más complicado con números, una gran parte de las funciones matemáticas básicas están en el módulo math, pero ya llegaremos a ello.

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

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 =. Esto es cierto tanto la primera vez que se utiliza una variable como cuando se le asigna un valor a una variable ya existente.

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, no en tiempo de compilación del mismo modo que sucede en Matlab o Octave.

Si volvemos al intérprete:

>>> a = 2.3>>> b = 3.2>>> print a*b7.36>>> a = 2>>> print type(a)<type 'int'>>>> print a*b6.4>>> a = 'hola'>>> print type(a)<type 'str'>>>> print a*bTraceback (most recent call last): File "<stdin>", line 1, 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.

Obviamete, cuando intentamos multiplicar una secuencia de caracteres por un número en coma flotante obtenemos un error claramente identificado como error de tipo.

Aunque Python está lleno de sorpresas. Si vuestra intución os dice que una operación puede ser posible a lo mejor está implementada. 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. Por ejemplo... ¿Qué sucede si multiplicamos una palabra por 2?

>>> a = 'hola'>>> print 2*aholahola

Pues que tenemos dos veces 'hola'. Entonces, si tomamos la definición de multiplicación como una secuencia de sumas...

>>> print a+aholahola

Python está lleno de detalles de estos así que algunas veces es bueno dejarse llevar por la intuición.

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

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. De todos los paraidgmas de programación es el más exitoso que se conoce. Incluso Fortran, a partir del estándar Fortran 2003, soporta la programación orientada a objetos. Matlab era también otro lenguaje que históricamente había ignorado la orientación a objetos pero por soportarlo también, a su manera. La primera implementación de la orientación a objetos de Matlab era tan deficiente que quedó en el olvido. A la segunda consiguieron un resultado razonable gracias a casi copiar el planteamiento de Python.

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.

Me centraré en comentar lo más básico y fundamental de lo que es un objeto: los atributos y los métodos. De este modo veremos una clase como una manera de agrupar variables, los atributos, y funciones que operan sobre estas variables, los métodos.

Es imposible hablar de Python y no hablar sobre la orientación a objetos porque en Python prácticamente todo es un objeto. Por ejemplo un número complejo es un ejemplo especialmente simple.

>>> c = 2+3j>>> print c,type(c)(2+3j) <type 'complex'>>>> c.real2.0>>> c.imag3.0>>> print c*(1j)+32j

Python dispone de una constante especial, j que es la unidad imaginaria. Como en Matlab y Octave es recomendable utilizarlo como sufijo de un número tal como se hace en el ejemplo. Cualquier número imaginario tiene dos atributos, su parte real y su parte imaginaria.

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. Esto significa que la clase complex tiene la operación de producto definida internamente. Podemos ver todos los atributos, métodos y operaciones disponibles para una clase utilizando la función help.

>>> help(c)Help on complex object:

class complex(object) | complex(real[, imag]) -> complex number | | Create a complex number from a real part and an optional imaginary part. | This is equivalent to (real + imag*1j) where imag defaults to 0.

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

| | Methods defined here: | | __abs__(...) | x.__abs__() <==> abs(x) | | __add__(...) | x.__add__(y) <==> x+y | | __coerce__(...) | x.__coerce__(y) <==> coerce(x, y)

(...)

Esta función que aparece como __abs__() es en realidad la función valor absoluto, de modo que estas dos operaciones:

>>> abs(c)3.605551275463989>>> c.__abs__()3.605551275463989

Son equivalentes a todos los efectos.

En Python todo está modularizado

Esta sí es una diferencia esencial entre Matlab/Octave y Python. En estos lenguajes cualquier función de la biblioteca está accesible al intérprete. Esto hace que, a medida que el número de funciones crece, crezca también la probabilidad de conflictos.

En Python todas las bibliotecas, incluso la biblioteca estándar, están modularizadas. Por ejemplo, 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.sin(math.pi)1.2246063538223773e-16

Dos puntos a tener en cuenta:

Cada módulo es en sí un objeto. En este caso, después de importar math, hemos llegado a la constante como un atributo del módulo y a la función sin como un método.

Prácticamente la totalidad de módulos o scripts en Python importan algún módulo. Podemos importar módulos prácticamente en cualquier punto de la ejecución pero por convención se suelen importar al principio.

Ahora podéis pensar que para la función seno o para :math:pi, tener que arrastrar el nombre math puede ser algo tedioso; especialmente si no hay una intención especial de agrupar las funciones de este módulo. Si queremos importar sólo sin y pi podemos hacerlo de la siguiente manera:

>>> from math import sin,pi

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

>>> sin(pi)1.2246063538223773e-16

También podéis pensar... ¿Y si tengo que importar veinticinco funciones del módulo math? ¿Tengo que escribirlas todas en la llamada a import? Evidentemente no. 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.2246063538223773e-16>>> cos(pi)-1.0>>> tan(pi)-1.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.

Python incluye baterías, pero no cargador

En la introducción, porque siempre es mala idea no leer la introducción, mencioné que para programar en Python es una gran idea acostumbrarse a utilizar un interfaz de desarrollo integrada (IDE) como Eclipse; algo más sofisticado que IDLE.

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, que sólo incluye funcionalidades básicas. La biblioteca estándar de Python incluso viene con la posibilidad de generar interfaces gráficas con ventanas en cualquier sistema operativo.

Pero Python no es Matlab ni Visual Basic en el sentido que uno debe decidir cómo programará, gestionará y ejecutará sus scripts o módulos. Es más, 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.

A modo de ejemplo ejecutaremos un “Hola, mundo!” portable, es decir, podemos seguir exactamente el mismo método en cualquier sistema operativo.

Una vez abrimos IDLE, en el menú archivo seleccionamos nueva ventana, lo que abrirá un editor en el que podemos escribir el programa. Entonces en esta nueva ventana escribimos lo siguiente:

if __name__ == '__main__': print 'Hola, Mundo!'

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

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 motivo puede parecer puramente estético pero leed otra vez el programa. Hay un condicional, un if, y ninguna sentencia que termine el bloque. No hay ningún end ni corchetes que encapsulen las sentencias ejecutables.

Lo que determina la prioridad del bloque de código es precisamente la separación respecto al margen izquierdo. Todo lo que esté indentado después de los dos puntos es parte del bloque if. La necesidad de utilizar una herramienta específica radica aumentar la facilidad en la que se maneja la indentación del código. En IDLE, por ejemplo, para cambiarla basta con apretar el tabulador o backspace al principio de cada línea para cambiarla.

Pero si comparamos IDLE con el IDE de Matlab seguimos echando de menos un montón de piezas: la ayuda integrada, algo que nos permita navegar entre los objetos, un debugger, un profiler... Parte de la gracia de cualquier lenguaje de programación, y es también el caso de C o Fortran, es llegar a un entorno de desarrollo con el que nos sintamos cómodos. La comodidad es una sensación muy personal y para conseguirla puedo ayudaros muy poco.

Ahora, en la ventana del editor, seleccionad run y luego run module o pulsad F5. En el intérprete aparecerá un Hola, Mundo!.

La parte inicial, 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 .py. Lo utilizaremos otras veces y veremos de su importancia más adelante.

Python es también una calculadora

El intérprete cuenta con todas las operaciones aritméticas usuales: suma, resta, multiplicación, división...

Sólo hay que hacer un par de puntualizaciones al comportamiento del lenguaje. El símbolo correspondiente a la potencia es el doble asterisco, **, como en Fortran.

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

>>> 2**101024

Otra diferencia es el operador modulo que da el residuo de la división entrera entre dos números. En Matlab, Octave y Fortran este operador es una función, a diferencia de C en el que se trata de un operador. Python comparte la convención con C al respecto

>>> 5%21

La división tiene un comportamiento un poco particular en Python 2 y depende del tipo de cada operador. Si tanto el numerador como el denominador son números enteros, el operador / corresponde a la división entera y no a la división en coma flotante. Sin embargo, si alguno de los dos operandos es un número en coma flotante el resultado también lo será.

>>> 5/22>>> 5.0/22.5

Sin embargo este comportamiento se corregirá en Python 3 de manera que cualquier división será la división en coma flotante. 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/22.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. Aunque aún estamos muy lejos de algo parecido a Matlab y Octave.

Script para pasar código Python a HTML

Hola. En este artículo vamos a crear un script para pasar código fuente Python (.py) a formato HTML (y de esta manera mostrar dicho código en una página web). Además vamos a darle coloración al código Python. Debe de haber formas más simples, sin duda, de resolver este tipo de problemáticas, ... a mí se me ha ocurrido esta.

Como siempre, el fichero .py que contiene el script se puede obtener del repositorio de este blog, en:

https://sites.google.com/site/elviajedelnavegante/

El fichero se llama mi_tokenize.zip, el cual contiene el script mi_tokenize.py.

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

En este problema no se ha utilizado programación orientada a objetos, esto es, no se implementa ninguna clase. Todo se resuelve con programación imperativa (mediante funciones).

Al grano...El funcionamiento es sencillo, en términos generales. De lo que se trata es que, a partir de un fichero de código fuente Python, se genera otro (con extensión html) con código HTML, que representa el código Python formateado (con indentación y coloreado de código).

Un ejemplo sería el siguiente:

La captura de arriba es del Stani's Python Editor. Abajo nos encontramos el mismo código, formateado en HTML y coloreado, en Firefox.

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

¿Cómo enfocar el problema?

Pasar código Python a html es casi trivial. Únicamente hay que abrir un fichero .py, leerlo, crear otro fichero con una cabecera html, incluir dicho código Python y cerrar el html. Listo, ya tenemos el código en una página web.

El verdadero problema es el coloreado del código, ya que se tiene que identificar los diferentes bloques de código a los que se quieren dar color. En nuestro caso, daremos color a los comentarios, a las cadenas y a las palabras clave de la versión que utilicemos de Python.

¿Cómo hacerlo? Mediante los módulos cStringIO y tokenize, que se pueden encontrar en cualquier distribución de Python.

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

cStringIO sirve para crear, a partir de una cadena, un buffer de cadena. tokenize es el módulo que nos permite analizar código Python e identificar componentes del mismo (comentarios, cadenas, etc) a partir de un buffer de cadena. Mejor lo vemos con los pasos que debe de dar nuestro script:

1) Cargamos en memoria un fichero .py con el método read() de open.

2) Mediante cStringIO creamos un fichero en memoria ó buffer de cadena, el cual es necesario para utilizar el tokenize. En realidad esto sirve para iterar, línea a línea sobre una cadena con varias líneas (con saltos de línea). Por ejemplo:

import cStringIO

cadena = '''

Este es un ejemplo

de la potencia del

módulo cStringIO

'''

texto = cStringIO.StringIO(cadena)

for i in texto: print i

Devuelve:

Este es un ejemplo

de la potencia del

módulo cStringIO

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

3) Mediante tokenize, y a partir del buffer de cadena creado en el paso anterior, podemos obtener los token (elementos de código), iterando sobre ellos, e identificando los elementos de código Python.

En la documentación de Python tenéis una explicación muy buena (en inglés) de estos dos módulos:

http://docs.python.org/library/stringio.html#module-cStringIO

http://docs.python.org/library/tokenize.html

Puff!!! Una explicación algo extraña. Veámoslo con un ejemplo. Imaginemos que hemos cargado mediante el método read() de open un fichero con código Python con el siguiente contenido:

# -*- coding: utf-8 -*-

# Código Python.

for i in range(0,5):

print "Número ", i

Mediante los pasos anteriores vamos a identificar los elementos del código, a saber, comentarios, palabras clave y cadenas. El código que haría esta operación podría ser el siguiente:

# Creamos buffer de cadena.

texto = cStringIO.StringIO(cadena)

# Creamos tokens.

tokens = tokenize.generate_tokens(texto.readline)

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

for a,b,c,d,_ in tokens:

if a == tokenize.STRING:

print "Cadena: %s en posición [%s,%s]" %( b,c,d)

if a == tokenize.NAME and b in keyword.kwlist:

print "Palabra clave: %s en posición [%s,%s]" % (b,c,d)

if a == tokenize.COMMENT:

print "Comentario: %s en posición [%s,%s]" % (b,c,d)

Dando como resultado:

Comentario: # -*- coding: utf-8 -*- en posición [(1, 0),(1, 23)]

Comentario: # Código Python. en posición [(2, 0),(2, 17)]

Palabra clave: for en posición [(3, 0),(3, 3)]

Palabra clave: in en posición [(3, 6),(3, 8)]

Palabra clave: print en posición [(4, 2),(4, 7)]

Cadena: "Número " en posición [(4, 8),(4, 18)]

Por tanto, mediante el módulo tokenize podemos identificar todos los elementos de los que se compone un código Python. La idea fundamental es esta. Aparte, mediante operaciones de transformación entre listas y cadenas, y demás operaciones se llega al resultado esperado.

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

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

El script mi_tokenize.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. Aquí se presentan capturas de pantalla del código, debido principalmente a que se utiliza sintaxis html en el código Python, y no mezclar cosas.

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:

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

Podemos observar que el script pide dos argumentos para funcionar, el primero el fichero Python y el segundo el nombre del fichero html que se generará (se le da extensión .html si esta se omite) . A continuación llamamos a la función cargar_fichero que devuelve, mediante read() una cadena con el contenido del fichero. Finalmente, 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.

Función para cargar el fichero .py:

Darse cuenta que reemplazamos ciertos caracteres especiales en html.

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

La función que analiza el código creando una cadena con html y código Python es la siguiente:

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

Esta función podría haberse escrito de otra forma, para ahorrar código, pero me ha parecido más pedagógico realizarlo de esta forma. Como se puede observar se utilizan cStringIO y tokenize. Devuelve una cadena con código html. Esta última función utiliza dos funciones auxiliares, a saber:

La función para insertar los elementos de html:

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

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, es mejor probar el script. El lector puede pensar que sería mucho mejor utilizar CSS para estos menesteres, y en cierta manera, es verdad, pero no es objetivo de este post hacer un tratado sobre web y CSS. Lo verdaderamente importante es el parseo de código Python y el tratamiento de cadenas.

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

Se insta al lector a mejorar el código.

//////////////////////////////////////////////////////////////////////////////////////

Programación en Python --- Parte II - EjemplosAuthor: Patricio Páez Serrato

Date: 9 de Abril de 2004

Índice

1 Historia del documento 2 Introducción

o 2.1 Requisitos o 2.2 Cómo realizar los ejemplos

3 Números grandes o 3.1 Agregando las comas

4 Manejo de información 5 Generación de documentos HTML

o 5.1 Usando funciones o 5.2 Usando una clase

6 Interfase gráfica de usuario o 6.1 Introducción o 6.2 Un editor o 6.3 Usando una clase

7 Servidor HTTP 8 Toques finales

o 8.1 Documentación o 8.2 Prueba de módulos

1       Historia del documento Este documento fué creado el 8 de Abril de 2004. Primera publicación el 27 de Junio de 2004. Segunda edición: 29 de Diciembre de 2008.

Para sugerencias,correcciones o preguntas acerca de este en documento, escribir a: nospam en pp punto com punto mx

El original de este documento se encuentra en http://pp.com.mx/python

Derechos Reservados (c) Patricio Páez Serrato, México 2004, 2006, 2008

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

2       Introducción La primera parte de este documento es una referencia del lenguaje Python, con enlaces a páginas de interés (se encuentra en http://pp.com.mx/python). Esta segunda parte recopila los ejemplos que he mostrado cuando imparto el Tutorial de Python. Empiezan por algo muy sencillo, y combinando hasta llegar a algo más complejo. No por ser sencillos dejan de ser útiles, y como menciono durante el tutorial: los resultados de estos ejemplos pueden crecer y convertirse en sus propios conjuntos de herramientas.

2.1       Requisitos

Los ejemplos pueden realizarse tanto en una PC con MS-Windows, Unix o Linux siempre y cuando Python corra. Pueden usarse las versiones 1.5.2, y 2.0 en adelante. Los ejemplos tratan conceptos generales y procuran no usar características únicas en las versiones más recientes.

Todos los ejemplos, excepto las interfases gráficas pueden hacerse en modo texto, usando preferentemente un editor que resalte la sintaxis de Python como Vim, emacs, Scite y otros. Los usuarios de MS-Windows pueden instalar algunos de estos editores del CD Gnuwin.

Los ejemplos con Tkinter requieren tener el conjunto de funciones gráficas Tk así como el modulo de Python Tkinter que lo accesa. 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. En Linux el lector puede verificar mediante este comando:

[usuario@pc]$ rpm -qa | grep ^tktk-8.3.3-7mdktkinter-2.1.1-3mdk

2.2       Cómo realizar los ejemplos

Programar en Python puede hacerse de varias maneras según la necesidad o el gusto de cada persona. Para los neófitos mi recomendación es que utilicen el ambiente gráfico interactivo llamado idle. Esta herramienta viene incluída con el módulo tkinter. Además de resaltar la sintaxis en colores, permite editar archivos fuente y es más amigable al inicio.

El idle tiene dos ambientes: el shell interactivo con título Python Shell en su ventana; muestra el prompt >>> y espera un comando, y uno o más editores que se abren con el menú File --> New Window. Cada editor empieza con el título Untitled en su ventana, el cual cambia hasta que se salva a un archivo con File --> Save As (y subsecuentemente File --> Save). Cada editor nos permite ejecutar el código Python que contiene.

Se recomienda crear una carpeta para realizar y guardar los ejemplos. Para correr idle, cambiar primero a esa carpeta y entonces correr idle: En MS- Windows:

C:\ejemplos> C:\python22\idle\idle

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

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 11 22 43 84 165 326 647 1288 2569 51210 102411 204812 409613 819214 1638415 3276816 6553617 13107218 26214419 52428820 104857621 209715222 419430423 838860824 1677721625 3355443226 6710886427 13421772828 26843545629 53687091230 107374182431 214748364832 429496729633 8589934592

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

34 1717986918435 3435973836836 6871947673637 13743895347238 27487790694439 54975581388840 109951162777641 219902325555242 439804651110443 879609302220844 1759218604441645 3518437208883246 7036874417766447 14073748835532848 28147497671065649 56294995342131250 112589990684262451 225179981368524852 450359962737049653 900719925474099254 1801439850948198455 3602879701896396856 7205759403792793657 14411518807585587258 28823037615171174459 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):

>>> 1234567890123412345678901234L

En versiones 2.1 y anteriores tendremos un error:

>>> 12345678901234OverflowError: 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.

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

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 11 22 43 84 165 326 647 1288 2569 51210 1,02411 2,04812 4,09613 8,19214 16,38415 32,76816 65,53617 131,07218 262,14419 524,28820 1,048,57621 2,097,15222 4,194,30423 8,388,60824 16,777,21625 33,554,43226 67,108,86427 134,217,72828 268,435,45629 536,870,91230 1,073,741,82431 2,147,483,64832 4,294,967,29633 8,589,934,592

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

34 17,179,869,18435 34,359,738,36836 68,719,476,73637 137,438,953,47238 274,877,906,94439 549,755,813,88840 1,099,511,627,77641 2,199,023,255,55242 4,398,046,511,10443 8,796,093,022,20844 17,592,186,044,41645 35,184,372,088,83246 70,368,744,177,66447 140,737,488,355,32848 281,474,976,710,65649 562,949,953,421,31250 1,125,899,906,842,62451 2,251,799,813,685,24852 4,503,599,627,370,49653 9,007,199,254,740,99254 18,014,398,509,481,98455 36,028,797,018,963,96856 72,057,594,037,927,93657 144,115,188,075,855,87258 288,230,376,151,711,74459 576,460,752,303,423,488

Le dejamos al lector el ejercicio de mejorar poncoma() añadiendo instrucciones para que acepte números con signo negativo, y con decimales.

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, con las siglas EDP). El nombre antiguo era más descriptivo de la labor que se supone debían realizar las computadoras. Aquí mostraremos cómo hacemos esto en Python, con un conjunto de datos pequeño pero real.

Tenemos la siguiente información en el archivo capitales.txt:

México,D.F.Aguascalientes,AguascalientesTijuana,Baja CaliforniaMexicali,Baja California SurCampeche,CampecheTuxtla Gutiérrez,ChiapasChihuahua,ChihuahuaSaltillo,CoahuilaColima,ColimaDurango,DurangoToluca,Edo. de MéxicoChilpancingo,GuerreroGuanajuato,GuanajuatoPachuca,HidalgoGuadalajara,JaliscoMorelia,MichoacánCuernavaca,Morelos

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

Tepic,NayaritMonterrey,Nuevo LeónOaxaca,OaxacaPuebla,PueblaQuerétaro,QuerétaroChetumal,Quintana RooCuliacán,SinaloaHermosillo,SonoraSan Luis Potosí,San Luis PotosíVilla Hermosa,TabascoTampico,TamaulipasTlaxcala,TlaxcalaJalapa,VeracruzMérida,YucatánZacatecas,Zacatecas

Son los nombres de los Estados mexicanos con su ciudad capital. Primero la capital, seguida de una coma y el nombre del Estado.

A continuación vamos a leer esta pequeña 'base de datos' a una cadena en Python, la vamos a convertir a una lista de registros, luego separaremos los campos de cada registro. El lector puede ir haciendo primero estos pasos en forma interactiva, revisando los resultados:

# Leemos el archivo a una cadena:

f = open( 'capitales.txt' )datos = f.read()

# Partimos la cadena a una lista cuyos elementos son# los registros de nuestra 'base de datos'

import stringlista = string.split( datos, '\n' )print lista

# Convertimos cada elemento de la lista a una pareja,# usamos una función lambda:

pares = map( lambda e: string.split( e, ','), lista )

print pares

# Podemos crear una lista para cada campo:# una lista de capitales y otra lista de estados.# Esta es una forma de obtenerlas:

capitales = []estados = []for capital,estado in pares: capitales.append( capital ) estados.append( estado )

# Cómo determinar los nombres únicos de ambas listas?# Usamos la concatenación de listas.

unicos = []for nombre in capitales+estados: if nombre not in unicos:

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

unicos.append(nombre) else: print nombre

# Cuántos elementos tenemos?

print len(unicos)

# Los ordenamos alfabéticamente:

unicos.sort()print unicos

Para concluir, definimos una función que lee el archivo de este ejemplo, separa en campos y registros, y nos regresa una matriz en forma de una lista:

def leedatos( nombrearchivo ): "Abre un archivo, lee y regresa un arreglo." f = open( nombrearchivo ) renglones = f.readlines() arreglo = map( lambda x: x.split(','), renglones ) return arreglo

matriz = leedatos( 'capitales.txt' )

for renglon in matriz: for celda in renglon: print '%-20s' % celda, print

5       Generación de documentos HTML Hoy en día usar HTML es cosa del diario, cuando navegamos en internet, leemos correo, y cada vez son más las aplicaciones que usan el navegador como punto de acceso al usuario. Muchas páginas de HTML se generan por programas, no por personas. Por esta razón vamos a practicar con Python.

Un documento básico de HTML puede ser así:

System Message: ERROR/3 (ejemplos.rst, line 420)

Unknown directive type "code-block".

.. code-block:: html

<html> <head><title>página hecha a mano</title></head> <body>

<h1>Hola...</h1> probando<br>

</body> </html>

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

Si nunca habías hecho un documento HTML, puedes pegar el texto de arriba a un nuevo documento y salvarlo como estatica.html. Abre luego el documento con un navegador para que lo muestre.

5.1       Usando funciones

Vamos a dividir el documento HTML en las partes que lo forman, tomando como base la muestra anterior:

System Message: ERROR/3 (ejemplos.rst, line 443)

Unknown directive type "code-block".

.. code-block:: html

---------- inicio del documento ---------- <html> <head><title>página hecha a mano</title></head> <body>

---------- cuerpo del documento ---------- <h1>Hola...</h1> probando<br>

---------- final del documento ---------- </body> </html>

Ahora definiremos una función en Python para que regrese cada parte como texto. Empezamos con las funciones inicio() y final(). Luego agregamos para el cuerpo del documento las funciones encabezado(), parrafo(), liga(), destino(), saltolinea() y horizontal().

Finalmente desarrollamos tabla() que será muy utilizada para mostrar arreglos. No es necesario utilizar variables i, j como en otros lenguajes para recorrer el arreglo, ni saber las dimensiones. Cada renglón del arreglo puede ser de distinta longitud.

Tenemos el siguiente código con las funciones básicas:

System Message: ERROR/3 (ejemplos.rst, line 473)

Unknown directive type "code-block".

.. code-block:: python

def inicio( cadena='' ): "Inicia el documento HTML." return '''<html> <head> <title>''' + cadena + '''</title>

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

</head> <body>\n'''

def encabezado( nivel='1', string='' ): "Regresa string con encabezado o título HTML, default es H1." return '<h'+ nivel + '>'+ string + '</h'+ nivel + '>'

def horizontal(): "Línea horizontal en el documento HTML." return '<hr />'

def destino( clave, texto ): "Regresa texto como destino." return '<a name="' + clave + '>' + texto + '</a>'

def liga( url, texto): "Liga o hipervínculo a url con texto." return '<a href="' + url + '">' + texto + '</a>'

def parrafo( texto ): "Genera un párrafo con texto." return '<p>' + texto + '</p>\n'

def saltolinea(): "Genera un salto de línea." return '<br>\n'

def tabla( arreglo ): """Muestra arreglo en una tabla HTML.

Las celdas pueden ser cualquier tipo, se convierten a cadena siempre."""

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 '''</body> </html>'''

Las funciones se van llamando en orden como se muestra en este ejemplo:

print inicio( 'Página dinamica')print encabezado( 'Página generada con Python')print parrafo( 'Tenemos a continuación una tabla:')print tabla( [ ['r1c1', 'r1c2'], ['r2c1', 'r2c2'] ] )print final()

Hemos pasado un arreglo en forma explícita, pero podemos usar una variable.

Las funciones que definimos pueden anidarse. Por ejemplo:

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

parrafo( 'El sitio ' + liga( 'http://www.python.org,'www.python.org')

+ 'tiene mucha información sobre Python.' )

para obtener:

El sitio www.python.org tiene mucha información sobre Python.

Para probar nuestros experimentos necesitamos enviar la salida del programa a un archivo que podemos llamar prueba.*html*. Para hacer esto, necesitamos correr nuestro guión html.py con un comando así:

[user@host ejemplos]$ python html.py > prueba.html

En Windows:

C:\ejemplos> python html.py > prueba.html

Si Windows no tiene la ruta del ejecutable python.exe en su PATH, hay que agregarla. Generalmente es C:python22python:

C:\ejemplos> c:\python22\python html.py > prueba.html

La tabla podemos ahora construirla con una rutina, o llenarla con datos de alguna fuente, que será lo más usual. En el siguiente ejemplo hacemos ambas cosas. hacertabla() construye una matriz con expresiones. leedatos() es la rutina de la sección anterior sobre manejo de datos, que lee de nuestro archivo capitales.txt y usa lo que aprendimos para separar campos y registros. Aquí está el código:

def hacertabla( ren=10, col=10, operador='+'): """Construye y regresa un arreglo ren x col.

Cada celda toma un valor que depende de x,y y el valor de operador. El arreglo es de 10 x 10 si no se suministran los valores de ren y col."""

array = [] for ren in range(1, ren+1): array.append( [] ) for col in range( 1, col+1): dato = calcula(ren, col, operador) array[-1].append( dato ) return array

def calcula( a, b, operador): "Regresa una cadena tipo 'a operador b = resultado'." 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, lee y regresa un arreglo." f = open( nombrearchivo ) renglones = f.readlines()

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

arreglo = map( lambda x: x.split(','), renglones ) return arreglo

print inicio( 'Mi primera página dinamica')print encabezado( 'Página generada con Python')print parrafo( 'Algunos ejemplos de las rutinas para generar HTML')print tabla( leedatos( 'capitales.txt' ) )print encabezado( 'Tabla de sumas' )print tabla ( hacertabla() )print encabezado( 'Tabla de multiplicación' )print parrafo( 'Esta tabla usa la misma función con otro contenido' )print tabla ( hacertabla(12, 9, '*'), )print final()

5.2       Usando una clase

El siguiente paso es definir una clase que llamaremos buffer. Esto representa mejoras respecto a nuestro ejemplo anterior, porque ahora podremos escribir el texto HTML a un archivo desde el programa sin redireccionar la salida estándar. Esto nos permite generar más de una página simultáneamente.

La clase buffer crea un atributo text en cada instancia que es el texto HTML que se va formando. El método add() se usa para agregar texto a la instancia, mientras que el método pop() es para regresar y vaciar el atributo de texto, como cuando lo vamos a escribir a un archivo.

La clase tiene también métodos con los mismos nombres que las funciones básicas. Estos métodos simplemente llaman a la función correspondiente y van agregando el texto regresado mediante el método add().

class buffer: """Clase para generar objetos que almacenan codigo HTML que despues sera escrito a algun archivo."""

def __init__( self ): "Constructor, crea el atributo de texto." self.text = ''

def add( self, texto ): "Agrega texto arbitrario al buffer." self.text = self.text + texto

def pop( self ): "Regresa el texto del buffer, y borra el buffer." temp = self.text self.text = '' return temp

def inicio( self, titulo ): "Inicia el documento HTML." self.add( inicio( titulo ) )

def encabezado( self, nivel, string): "Regresa string con encabezado o título HTML, default es H1." self.add( encabezado( nivel, string ) )

def horizontal( self ):

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

"Línea horizontal en el documento HTML." self.add( horizontal() )

def destino( self, clave, texto ): "Regresa texto como destino." self.add( destino( clave, texto) )

def liga( self, url, texto): "Liga o hipervínculo a url con texto." self.add( liga( url, texto) )

def parrafo( self, texto ): "Genera un párrafo con texto." self.add( parrafo( texto) )

def saltolinea( self ): "Genera un salto de línea." self.add( saltolinea() )

def tabla( self, arreglo ): "Inserta arreglo en una tabla HTML." self.add( tabla( arreglo ) )

def final( self ): "Fin del documento HTML." self.add( final() )

Ahora vemos un ejemplo de cómo usamos esta clase para crear páginas HTML. Creamos dos instancias de buffer, les agregamos contenido y finalmente escribimos cada buffer a un archivo. Cada página lleva un enlace a la otra:

import html

# Crear dos instancias de la clase buffer:

pagina1 = html.buffer()pagina2 = html.buffer()

# Llenar cara buffer:

pagina1.inicio( 'Página 1' )pagina1.encabezado( '2', 'Esta es página 1')pagina1.liga( 'pag2.html', 'Ir a página 2' )pagina1.final()

pagina2.inicio( 'Página 2' )pagina2.encabezado( '2', 'Esta es Página 2')pagina2.liga( 'pag1.html', 'Ir a página 1' )pagina2.final()

# Vaciar cada buffer a un archivo:

fp = open( 'pag1.html', 'w' )fp.write( pagina1.pop() )fp = open( 'pag2.html', 'w' )fp.write( pagina2.pop() )

6       Interfase gráfica de usuario

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

De los varios conjuntos de herramientas para hacer interfases gráficas, veremos Tk. Tk es el conjunto de herramientas que se hizo originalmente para el lenguaje de guiones TCL. Mediante el módulo Tkinter, Python puede utilizar Tk.

6.1       Introducción

Para trabajar con un cualquier juego de herramientas gráficas, necesitamos ir creando las ventanas o elementos (llamados también widgets) que usaremos, los cuales quedan en una jerarquía. En primer nivel tendremos una ventana principal, a la cual agregamos botones, un marco, un cuadro de texto, etc.

Los pasos para todo programa gráfico serán:

Importar las clases y constantes del módulo Tkinter, mediante un comando import en su forma import Tkinter.

Crear una instancia de la ventana raíz, a partir de la clase Tkinter.Tk(). Crear una instancia de uno o más elementos para insertar en esta ventana raíz. Los

elementos pueden ser widgets Label, Canvas, Frame, y otros. Un widget procesador de texto por ejemplo, se crea a partir de la clase Tkinter.Text().

Enlazar funciones o métodos de la ventana raíz o alguno de los widgets a uno o más eventos del usuario. Los eventos son los movimientos y acciones del ratón y teclas presionadas en el teclado.

Mostrar cada elemento con el método pack() que tiene definido. Agregar información a los elementos, como puede ser texto al editor o a una etiqueta Llamar el método mainloop() de nuestra ventana raíz, para que se active la atención a

los eventos. Para terminar la aplicación se llama al método quit() de la ventana raíz.

Ya en código tendremos más o menos el siguiente esqueleto:

import Tkinterraiz = Tkinter.Tk()w = Tkinter.Label(raiz)w.pack()w[ 'text' ] = 'Hola mundo'raiz.mainloop()

El ejemplo anterior se basa en el primer ejemplo de Fredrik Lundh en su documento An introduction to Tkinter.

6.2       Un editor

El widget de texto Text() nos da la base para hacer un 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. El código básico sería:

import Tkinter, sys

raiz = Tkinter.Tk()editor = Tkinter.Text(raiz)editor.pack()

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

f = open( sys.argv[1] )editor.insert( '1.0', f.read() )

raiz.mainloop()

Al código anterior le agregamos instrucciones en el bloque principal indicar que se requiere el nombre del archivo. El bloque maneja la excepción en caso de que el archivo no exista y se trate de un archivo nuevo a crear. Se agregan también las funciones quit() para terminar la aplicación, y save() para guardar el contenido del buffer en el archivo. La aplicación se termina mediante la combinación de teclas Control+q y el archivo se salva con las teclas Control+s. Estos dos eventos de teclado se llaman <Control-q> y <Control-s> en Tkinter*,* 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, sys

def quit(event ): "Termina la aplicación." raiz.quit()

def save(event): "Salva el texto del editor." f = open( nombrearchivo, 'w' ) f.write( editor.get( '1.0', END) ) f.close() print 'archivo', nombrearchivo, 'salvado.'

raiz = Tkinter.Tk()editor = Tkinter.Text(raiz)editor.pack()editor.bind( '<Control-q>', quit )editor.bind( '<Control-s>', save )

if len(sys.argv)>1: nombrearchivo = sys.argv[1] try: f = open( nombrearchivo ) editor.insert( '1.0', f.read() ) except: print nombrearchivo, 'es archivo nuevo'else: print 'falta proporcionar nombre de archivo' sys.exit()

mainloop()

Este primer ejemplo nos muestra lo fácil que es crear una aplicación gráfica directamente. Para casos de interfases más complejas, existen herramientas como Glade que ayudan a crearla en forma gráfica.

6.3       Usando una clase

El caso anterior tiene una sola ventana de texto. Para tener varios archivos abiertos no tenemos que repetir el código para cada ventana. Lo que utilizamos es una clase y cada ventana es una instancia de la misma.

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

El código base para crear un editor que ya vimos será incluído en una clase editor, específicamente en la función __init__() que es su función contructora y se ejecuta cuando se crea una instancia.

Tk siempre crea una instancia de la clase Tk(), una ventana principal, que podría ser la ventana de inicio de la aplicación. En este caso la ocultamos desde el inicio con el método withdraw().

La clase editor tiene el método quit() para terminar la aplicación, 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, cuyos eventos en Tkinter se llaman <Prior> y <Next>.

Usamos una lista editores inicialmente vacía, mediante un ciclo se va agregando una instancia de editor para cada parámetro que se proporcionó. El código es así:

class editor: "Un area de texto simple."

def __init__( self, nombrearchivo ): "Construye la instancia." self.tl = Tkinter.Toplevel() self.tl.title (nombrearchivo) self.nombrearchivo = nombrearchivo self.buffer = Tkinter.Text( self.tl, height=10) self.buffer.pack() self.buffer[ 'wrap'] = Tkinter.NONE self.buffer[ 'background'] = 'white' self.buffer[ 'foreground' ] = 'black' self.buffer[ 'font'] = ( 'verdana', 14 ) self.buffer.bind( '<Prior>', self.anterior ) self.buffer.bind( '<Next>', self.siguiente) self.buffer.bind( '<Control-q>', self.quit)

self.s = string.replace( open( self.nombrearchivo ).read(),'\015', '') self.buffer.insert( Tkinter.END, self.s )

if d.has_key( self.nombrearchivo ): self.tl.geometry( d[ self.nombrearchivo ] ) lineas = self.s.splitlines() self.buffer['height'] = len( lineas ) + 1 self.buffer['width'] = max( map(len, lineas) ) + 1

def anterior( self, event ): i = notas.index( self) - 1 if i < 0: i = len(notas)-1 notas[i].buffer.focus_set() notas[i].tl.lift() return 'break'

def siguiente( self, event ): i = ( notas.index( self) + 1 ) % len( notas ) notas[i].buffer.focus_set() notas[i].tl.lift() return 'break'

def quit( self, event ):

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

"Actualiza posiciones, cierra ventanas, termina." f = open( archivoconf, 'w' ) for nota in notas: d[ nota.nombrearchivo ] = nota.tl.geometry() nota.tl.withdraw() for llave, dato in sorted( d.items() ): f.write( llave + ' ' + dato + '\n') nota.tl.withdraw() root.quit()

def LeeConf(): "Lee nombres y posiciones de archivoconf." lineas = [] try: f = open( archivoconf ) lineas = map( string.split, f.read().splitlines() ) except: print archivoconf, 'no existe' for llave, dato in lineas: d[llave] = dato

import sys, string, Tkinter

archivoconf = 'editor.conf'nombresarchivos = sys.argv[ 1:]if nombresarchivos: d = {} root = Tkinter.Tk() root.withdraw()

LeeConf() notas = [] for nombrearchivo in nombresarchivos: notas.append( editor( nombrearchivo ) ) notas[0].buffer.focus_set()

root.mainloop()

7       Servidor HTTP Python nos permite hacer aplicaciones que incluyan un servidor de HTTP. Puede ser en la intranet de nuestra casa u oficina, o bien en internet. Un servidor básico de HTTP, al cual podemos modificar si deseamos, empieza así:

import BaseHTTPServer, SimpleHTTPServerhttpd = BaseHTTPServer.HTTPServer( ( '', 80), SimpleHTTPServer.SimpleHTTPRequestHandler)httpd.serve_forever()

Para añadir CGI utilizamos CGIHTTPRequestHandler en lugar de SimpleHTTPRequestHandler en nuestra instancia de servidor:

import BaseHTTPServer, CGIHTTPServerhttpd = BaseHTTPServer.HTTPServer( ( '', 80), CGIHTTPServer.CGIHTTPRequestHandler)httpd.serve_forever()

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

Ambos casos pueden probarse en tu máquina tratando de mostrar la dirección http://localhost en un navegador. Podrás ver los archivos que estén en el directorio de trabajo al momento de correr el guión servidor. Mientras el guión corre, arroja una bitácora de los accesos. En Linux es necesario que estés como root para correr estos guiones.

Roundup es un ejemplo de una aplicación hecha en Python que crea su servidor HTTP con CGI. Ver http://roundup.sf.net para más información.

8       Toques finales 8.1       Documentación

Documentar nuestros programas, módulos y ejemplos en Python no representa un esfuerzo adicional si hemos incluído las cadenas de documentación. Para el caso de un módulo, podemos incluir las siguientes cadenas:

'''Cadena de descripción del módulo

Puede tener una línea de encabezado,y después uno o más párrafos de explicación...'''

__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.py, al cual agregamos al inicio las cadenas anteriores. Después con la herramienta pydoc incluída con Python, podemos generar un archivo html.*html* con la documentación del mismo:

[usuario@pc ejemplos]$ /usr/lib/python2.1/pydoc.py -w ./html.py

Escribimos './' antes del nombre del archivo, para que pydoc sepa que es un archivo y no un módulo predefinido.

8.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, no cuando se importa desde otro archivo. Para lograr esto, usar el siguiente código:

if __name__ == '__main__': prueba()/////////////////////////////////////////////////////////////////////////////

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

¿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. Hola, comentarles que vengo haciendo las cosas con php y me interesa meterme con python. Tal es así que estuve leyendo sobre el y estoy ...

  #1 (permalink)01/10/2011, 09:58

cristian_cenaColaborador

Fecha de Ingreso: junio-2009Mensajes: 2.219Antigüedad: 4 años, 2 mesesPuntos: 268

¿como integrar python con html/css/javascript?

Hola, comentarles que vengo haciendo las cosas con php y me interesa meterme con python. Tal es así que estuve leyendo sobre el y estoy muy feliz con la sintaxis, con lo simple y bonito que luce el código y con lo rápido que aparenta ser el desarrollo en este lenguaje.

Si bien me he encontrado numerosas y valiosas guias, no he hallado aún un lugar donde expliquen como desarrollar mi primer web con python sin frameworks.

No se como integrar python con html/css/javascript. Les agradezco si tienen a mano algun link/ejemplo que pueda serme útil.

  #2 (permalink)01/10/2011, 11:19

razpeitiaModerador

Fecha de Ingreso: marzo-2005Ubicación: Monterrey, MéxicoMensajes: 6.166Antigüedad: 8 años, 5 mesesPuntos: 1048

Respuesta: ¿como integrar python con html/css/javascript?

Al igual que php, python no sirve contenido estático esto lo debes de configurar en tu servidor web.

  #3 (permalink)01/10/2011, 11:50

cristian_cenaColaborador

Fecha de Ingreso: junio-2009Mensajes: 2.219Antigüedad: 4 años, 2 mesesPuntos: 268

Respuesta: ¿como integrar python con html/css/javascript?

gracias razpeitia, comprendo, si tienes a bien quisiera que veamos un ejemplo:

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

supongamos que tengo esto en php:archivo.php:Código HTML:Ver original

1. <?php2. $hola = "hola mundo";3. ?>4. <!DOCTYPE HTML>5. <html lang="en-US">6. <head>7.     <title>hola mundo metiendo php en codigo html</title>8. </head>9. <body>10.     <?php echo $hola; ?>11. </body>12. </html>

Como podría reescribirlo en python?

  #4 (permalink)01/10/2011, 12:28

razpeitiaModerador

Fecha de Ingreso: marzo-2005Ubicación: Monterrey, MéxicoMensajes: 6.166Antigüedad: 8 años, 5 mesesPuntos: 1048

Respuesta: ¿como integrar python con html/css/javascript?

Depende de que estés usando para programar web con python.

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, 01:13

cristian_cenaColaborador

Fecha de Ingreso: junio-2009Mensajes: 2.219Antigüedad: 4 años, 2 mesesPuntos: 268

Respuesta: ¿como integrar python con html/css/javascript?

Muchas gracias por tu respuesta razpeitia, emm, supongo que lo mejor será que use mod_python ya que uso apache para php. Soy super nuevo con python, solo escribi

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

lineas en la consola pero nada más. Gracias por el link me viene muy bien. Eternamente agradecido si tienes la amabilidad de traducir el código que comparti arriba. Por simple que parezca, para mí es de vital importancia.

Saludos.

  #6 (permalink)03/10/2011, 07:11

AlvaroG/bin/env python

Fecha de Ingreso: julio-2005Ubicación: Canelones, UruguayMensajes: 7.442Antigüedad: 8 años, 1 mesPuntos: 532

Respuesta: ¿como integrar python con html/css/javascript?

Un ejemplo simple que te servirá de base para traducir el PHP: http://www.howtoforge.com/embedding-...driva-opensuse

Te recomiendo que desarrolles sobre frameworks. La facilidad de desarrollo y los sistemas integrados de cacheo hacen que valga la pena aún para cosas pequeñas.

Saludos.__________________blog ElCodiguero

  #7 (permalink)03/10/2011, 08:16

cristian_cenaColaborador

Fecha de Ingreso: junio-2009Mensajes: 2.219Antigüedad: 4 años, 2 mesesPuntos: 268

Respuesta: ¿como integrar python con html/css/javascript?

Gracias AlvaroG, ya creía que lo mejor sería entrar con django y dejar de improvisar je. Muy útiles tus consejos, se agradece.

  #8 (permalink)03/10/2011, 08:59

AlvaroG/bin/env python

Fecha de Ingreso: julio-2005Ubicación: Canelones, UruguayMensajes: 7.442Antigüedad: 8 años, 1 mesPuntos: 532

Respuesta: ¿como integrar python con html/css/javascript?

Si, así es. No necesariamente Django, si querés podés empezar con Web2Py, CherryPy, Flesk, Pyramid, o cualquiera de los otros. El asunto es que será mucho más fácil y útil: aunque quieras aprender lo básico para sitios simples, a la hora de crear proyectos más grandes seguro terminarás usando algún framework.

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

Me gustaría ahondar en el asunto del cache, ya que uno a veces evita los frameworks porque los considera demasiado pesados para algunos proyectos.

Si vos tenés una página hecha a mano, simple pero sin cache, se estará ejecutando cada vez que se la solicite.Con un framework tipo Django, que incorpora un sistema de cache, la página se crea 1 vez y luego se sirve desde el cache. Aunque esa primera vez sea menos eficiente que una solución a mano, las subsecuentes peticiones servidas desde el cache compensan con creces esa generación inicial.

Te cuento una anécdota personal: en su momento (hace como 5 años ya) quise hacer mi sitio en PHP a mano. Hice algo bastante rígido basado en un solo index.php que se encargaba de procesar plantillas y URLs. Por probar, lo comparé en mi servidor local, usando el comando "ab", contra el mismo sitio creado con:- Zend FW- WordPress- WordPress + WP SuperCache

Ya no recuerdo exactamente los números, pero la cantidad de peticiones procesadas por minuto era algo así como 10-15mil para mi sitio, 5000 para el sitio basado en Zend, 300 para WP, y 50000 para WP + SuperCache.

Es decir: mi sitio era 50 veces más rápido que WP, 2-3 veces más rápido que Zend, pero 3-4 veces más lento que WP con un cache apropiado. Si tomamos los números como correctos, y hacemos algunas cuentas, vemos que la generación de la página en WP tomaba 200 ms, y servirla del cache 1,2 ms. En mi solución, cada petición demoraba 4 ms, por lo que resultaba más lenta luego de servir 72 páginas.

Seguramente los números hoy en día sean diferentes (y no vayas a tomar estos números como indicadores de nada, son solamente un ejemplo), y para cada caso habrá que estudiarlo, pero la conclusión es que un buen cache hace que un framework sea más rápido que las soluciones a medida, y por eso vale la pena usarlos incluso para páginas relativamente estáticas, por su facilidad de desarrollo.Por supuesto que para aprender uno siempre busca ir a lo básico, pero hay que saber

cuándo vale la pena

Saludos.__________________blog ElCodiguero

  #9 (permalink)03/10/2011, 18:05

CarlangueitorModerador ლ(ಠ益ಠლ)

Fecha de Ingreso: marzo-2008Ubicación: MéxicoMensajes: 7.507Antigüedad: 5 años, 5 mesesPuntos: 973

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

Respuesta: ¿como integrar python con html/css/javascript?

Hola cristian_cena, recién veo tu MP.

Has como dice Alvaro, si empiezas con Django y empiezas a leer los primeros capítulos de djangobook vas a ver como te conviene hacerlo con un Framework, es toda una delicia.

Yo realmente no tengo mucho tiempo programando en python (4 o 6 meses), pero si tienes buenas bases de programación no te será difícil.

Saludos__________________Aprender sin pensar es inútil. Pensar sin aprender, peligroso.

//////////////////////////////////////////////////////////////////////////////////////////////

ueno lo prometido es deuda. He aqui ejemplos de programas en Python. Espero les sirva.

1. ¿Cómo imprimir?print "Hola usuario"cadena="Soy buena onda"print cadena

2. ¿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.1. Factorial.py'''Crear una función para calcular el factorial'''

def factorial(x): if x==0: return 1 else: return x * factorial(x -1)

#mainnumero=0continuar='n'print "Factorial de un numero"

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

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,resultado)

2. Sumatoria.pysuma, numero, maxi=2, 4, 100print "Inicio"print "Sumatoria del 2+..+100"while (numero<=maxi): suma=suma+numero numero=numero+2 print "Suma parcial [",suma,"] no. ",numero," \n"

print "Suma total [",suma,"]"print "Fin"

3. Bucles.pyfrom math import*

vo=0vector=[0.25,0.50,0.75,1.0]print "Inicio"print "Bucles con vectores"for i in vector: vo=vo+pow(i,2) print "Valor original= ",i," resultado= ",voprint "Fin"

4. Menu.py

from math import*def Funcion_Seno(x):return cos(x)-xdef Funcion_Coseno(x):return sin(x)-xMX=30resultado=0contador=0opcion=0print "*** [ Funciones matemáticas en Python ] ***"print"\n\t 1. Calcular función seno 2. Calcular función coseno 3. Salir"while opcion<=0:opcion=int(raw_input('Tu opción es:'))if opcion==1:

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

print "Elegiste calcular función seno [sin(x)-x]"while contador<=MX:contador+=1resultado=Funcion_Seno(contador)print "\nValor = ",resultado," posición no. ",contadorelif opcion==2:print "Elegiste calcular función coseno [cos(x)-x]"while contador<=MX:contador+=1resultado=Funcion_Coseno(contador)print "\nValor = ",resultado," posición no. ",contadorelif opcion==3:exit()else:print "Opción inválida"

5.Area.py#ejemplo de POO en Python

class Area:def AsignaBase(self,base):self.base=basedef AsignaAltura(self, altura):self.altura=alturadef ObtenerBase(self):return self.basedef ObtenerAltura(self):return self.alturadef CalcArea(self):return self.base*self.altura/2#mainb, h=0, 0print "**** [Cálculo del área]****"MiCalculo=Area()while b<=0:b=float(raw_input('Base: '))while h<=0:h=float(raw_input('Altura: '))MiCalculo.AsignaBase(b)MiCalculo. AsignaAltura(h)print "Base leida: %f"%MiCalculo.ObtenerBase()print "Altura leida: %f"%MiCalculo.ObtenerAltura()print "Área obtenida: %f"%MiCalculo.CalcArea()

6. Uso de while, para alcular la velocidad

dt,k1,k2,vo,maximo,cont=0.5,9.81,0.2,0,50,0print "[Obtener velocidad]"while (cont<maximo):

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

vo=vo+(k1-(k2*vo))*cont cont=cont+dt print "",vo," --> periodo:[",cont,"]"

7. Menú sencillo en Pythondef obtenerFahrenheit(gc): return (gc*1.8)+32

def obtenerCelsius(gf): return (gf-32)/1.8

salir="s"opc=0grados=0

while salir =="s":

print "[Conversor de temperaturas]\n" print "1. Obtener grados fahrenheit" print "2. 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," celsius leidos" print "Grados fahrenheit obtenidos: ",obtenerFahrenheit(grados)

if opc==2: print "[Obtener celsius]\n" while grados<=0: grados=float(raw_input('Introduce valor: ')) print grados," fahrenheit leidos" print "Grados celsius obtenidos: ",obtenerCelsius(grados) else: print "opción no válida"

salir=raw_input('Deseas realizar ota operación? (s/n):') print ""

if salir=="n": print "adios"8. Sustituir un número de un arreglo'''sustituir un elemento de un arreglo

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

'''

numeros=[1,2,3,4,5,6,7,8,9,10]i,sustituto=0,564

for i in range(len(numeros)): if numeros[i]==6: numeros[i]=sustituto

print numeros[i]////////////////////////////////////////////////////////

Ejercicios resueltos de programación, en Python y en español, I.

Hola. 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, para resolver con Python (o cualquier otro lenguaje). Decir que son muy sencillos y sirven para afianzar conocimientos básicos de sintaxis y razonamiento. Si eres novel en programación ó en Python, este post es para tí. De lo contrario, te resultarán triviales los planteamientos expuestos.

Los enunciados los he obtenido del libro Esquemas Algorítmicos Fundamentales - Secuencias e Iteración, de P.C. Scholl y J.P. Peyrin, editorial Masson.

Ejercicio 1.Escribir un algoritmo que, para cualquier número de segundos inferior a un millón, calcule su equivalente en días, horas, minutos y segundos.

En este ejercicio tenemos que tener en cuenta que:

1 minuto = 60 segundos.1 hora = 60 minutos = 3600 segundos.1 dia = 24 horas = 1440 minutos = 86400 segundos.

# Pedimos datos.dato = raw_input(u'Número de segundos: ')

# Hacemos un cast, convirtiendo la cadena en un número largo.dato = long(dato)

# Comprobamos si el número introducido es menor a un millón.if dato >= 1000000: print "El número debe de ser menor a 1000000"else: # Días. ndias, aux = divmod(dato, 86400)

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

# Horas. nhoras, aux = divmod(aux, 3600) # Minutos y segundos. nmin, nseg = divmod(aux, 60) # Mostramos resultado. print '%d días, %d horas, %d minutos, %d segundos' % \ (ndias, nhoras, nmin, nseg)

Ejercicio 2.Escribir un algoritmo que imprima el mínimo, el máximo y la media de tres números.

# Obtenemos números.numeros = []for i in ['primer', 'segundo','tercer']: texto = u'Introduce el %s número: ' % (i) numeros.append(float(raw_input(texto)))

# Ordenamos.numeros.sort()

# Obtenemos máximo y mínimo.minimo = numeros[0]maximo = numeros[2]

# Obtenemos la media aritmética.media = round((numeros[0] + numeros[1] + numeros[2]) / float(3),3)

# Visualizamos resultados.cadena = u'Mínimo: %d, Máximo: %d, Media: %f' % (minimo, maximo, media)print cadena

Ejercicio 3.Escribir un algoritmo que, dado el infinitivo de un verbo regular de la primera conjugación, obtenga la conjugación en singular y plural de presente de indicativo. Por ejemplo, para el verbo cantar el resultado es yo canto, tu cantas, el canta, nosotros cantamos, vosotros cantáis, ellos cantan.

pronombre = ['yo','tu','el','nosotros','vosotros','ellos']

terminaciones = {'yo':'o', 'tu':'as', 'el':'a', 'nosotros':'amos',

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

'vosotros':u'áis', 'ellos':'an'}

# Pedimos datos.palabra = raw_input(u'Verbo regular 1ra. conjugación: ')

# Recorremos la tabla hashing (diccionario), construyendo la conjugación verbal.for i in pronombre: print i, palabra[0:len(palabra)-2] + terminaciones[i]

Ejercicio 4.Escribir un algoritmo que, para un número binario de 4 cifras, imprima su valor en base 10. Se estudiarán dos formas del problema según la representación de los datos: -forma 1: los datos son cuatro enteros (0 ó 1). Por ejemplo: 1,1,0,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.

# Obtenemos datos.nbinario = raw_input(u'Número binario (4 cifras): ')

# Obtenemos los dígitos.nbinario = nbinario.split(',')if len(nbinario) == 1: nbinario = list(nbinario[0])

# Inicializamos algunos contadores.decimal = 0potencia = 0

# Le damos la vuelta al número binario.nbinario.reverse()

# Calculamos el número decimal, a partir del número binario.for i in nbinario: decimal += pow(2,potencia) if i == '1' else 0 potencia += 1

# Visualizamos resultado.cadena = u'Su representación decimal es %d' % (decimal)print cadena

Ejercicio 5.Escribir un algoritmo que decodifique fechas del siglo XXI. El dato es un entero comprendido entre 10100 y 311299. El resultado es una secuencia de caracteres: número del día dentro

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

del mes, del mes dentro del año y del año dentro del siglo. Por ejemplo, para el dato 30485, el resultado es el texto 3-4-2085.

# Obtenemos dato.dato = raw_input('Introduce dato: ')

# Decodificamos año dentro del siglo XXI.anyo = 2000 + int(dato[len(dato)-2:])

# Decodificamos mes.mes = int(dato[len(dato)-4:len(dato)-2])

# Decodificamos día.dia = int(dato[:len(dato)-4])

# Mostramos resultado.cadena = '%d-%d-%d' % (dia, mes, anyo)print cadena

Ejercicio 6.Escribir un algoritmo que, para una suma de dinero dada, indique cómo descomponerla en billetes y monedas corrientes. Se desea utilizar el mínimo de billetes y monedas. No hay ninguna limitación respecto al número de billetes y monedas disponibles.

# Declaramos datos básicos (euros) con los que trabajar.billetes_y_monedas = [500,200,100,50,20,10,5, 2, 1, 0.50, 0.20, 0.10,0.05, 0.02, 0.01]

# Creamos un monedero, donde meter el dinero.monedero = []

# Pedimos la cantidad.dato = raw_input(u'Introducir importe (euros): ')

# Buscamos parte decimal y entera.dato = dato.split('.')

# Decimal...try: parte_decimal = float('0.'+dato[1])except: parte_decimal = 0.0

# Entera...

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

parte_entera = long(dato[0])

# Algoritmo de asignación de dinero.for i in billetes_y_monedas: # Obtenemos número de billetes ó monedas y los guardamos. unidades, resto = divmod(parte_entera, i) if unidades != 0: monedero.append((i,unidades)) # Asignamos lo que nos queda. parte_entera = resto

if parte_decimal > 0: for i in billetes_y_monedas: # Obtenemos número de monedas y los guardamos. unidades, resto = divmod(parte_decimal, i) if unidades != 0: monedero.append((i,unidades)) # Asignamos lo que nos queda. parte_decimal = round(resto,2)

# Visualizamos el resultado.cadena = ''for i in monedero: if i[0] >= 5: cadena += '%d billete/s de %d euros' % (i[1],i[0]) if i[0] < 5: cadena += '%d moneda/s de %s euros' % (i[1],i[0]) cadena += '\n'print cadena

Ejercicio 7.Escribir un algoritmo que simule el funcionamiento de una calculadora. El dato es una serie de tres caracteres: una cifra, un símbolo de operación y otra cifra. El resultado es el valor de la expresión dada.

# Pedimos datos.dato = raw_input(u'Introduce operación: ')

# Inicializamos resultado.resultado = 0

# ¿Suma?serie = dato.split('+')if len(serie) == 2: resultado = long(serie[0]) + long(serie[1])else: # ¿Resta?

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

serie = dato.split('-') if len(serie) == 2: resultado = long(serie[0]) - long(serie[1]) else: # ¿Multiplicación? serie = dato.split('*') if len(serie) == 2: resultado = long(serie[0]) * long(serie[1]) else: # ¿División? serie = dato.split('/') if len(serie) == 2: resultado = long(serie[0]) / long(serie[1])

# Mostramos resultado.print "El resultado es",resultado

Ejercicio 8.Consideremos una hora expresada en forma de tripleta . Escribir un algoritmo que imprima la hora correspondiente al siguiente segundo. Por ejemplo, para la entrada 13,43,24 tiene que devolver 13,43,25.

Se supone que lo que introducimos es una hora correcta. Darse cuenta que no se chequean los datos introducidos, por cuestión de simplicidad.

# Pedimos datos.tiempo = raw_input('Introduce tiempo: ')

# Obtenemos datos.aux = tiempo.split(',')horas = int(aux[0])minutos = int(aux[1])segundos = int(aux[2])

# Aumentamos un segundo.segundos += 1

# Casos.if segundos != 60: tiempo = (horas, minutos, segundos)else: if minutos == 59 and horas == 23: tiempo = (0, 0, 0) else: if minutos == 59: tiempo = (horas + 1, 0, 0) else:

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

tiempo = (horas, minutos + 1, 0)

# E imprimimos resultado (una tupla).print tiempo

Ejercicio 9.Escribir una función que determine si una letra dada es consonante.

A la función le faltaría controlar las letras con acentuación (tildes, diéresis, etc).

def es_consonante(letra): if letra.lower() not in ['a','e','i','o','u']: return True else: return False

Ejercicio 10.Escribir una función que calcule el factorial de un número. Por ejemplo, 5! = 5*4*3*2*1 = 120.

def factorial(numero): return 1 if numero <=0 else numero * factorial(numero -1)

Saludos.

en 14:07

Enviar por correo electrónico Escribe un blog Compartir con Twitter Compartir con Facebook

Etiquetas: ejercicios, python

94 comentarios:

1.

José Julio9 de enero de 2011 20:36

Esta es una solución más corta para el problema 6:

#-*- coding: UTF-8 -*-

cifra = float(raw_input(u'¿Cuántos euros? '))

monedas = [500, 200, 100, 50, 20, 10, 5, 2, 1]

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

cociente = cifra

centimos = int(100 * (cifra - int(cifra)))

for x in monedas:if cociente >= x:cociente, resto = divmod(cociente, x)if x > 2:print cociente, ' billete de ', xif x == 2:print cociente, ' monedas de ', xif x == 1:print cociente, ' moneda de ', xcociente = restoprint centimos, u' céntimos'

////////////////////////////////////////////////////////////////////////////////////

Mi diario PythonDiario sobre el aprendizaje en python. Ejercicios paso a paso, tutoriales, traducción de manuales en ingles y alguna cosa mas...

Ir al Inicio » ejercicios , ejercicios en python , python ejercicios » Ejercicios en python (Parte 1)

Ejercicios en python (Parte 1)lunes, 27 de mayo de 2013

Voy a dejar algunos ejercicios en python. Si hay alguna dificultad no duden en

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

Ejercicios Python

comentar. También voy a crear un post con mis soluciones, ustedes pueden aportar las suyas.

1- Definir una función max() que tome como argumento dos números y devuelva el mayor de ellos. (Es cierto que python tiene una función max() incorporada, pero hacerla nosotros mismos es un muy buen ejercicio.

2- Definir una función max_de_tres(), que tome tres números como argumentos y devuelva el mayor de ellos.

3- Definir una función que calcule la longitud de una lista o una cadena dada. (Es cierto que python tiene la función len() incorporada, pero escribirla por nosotros mismos resulta un muy buen ejercicio.

4- Escribir una función que tome un carácter y devuelva True si es una vocal, de lo contrario devuelve False.

5- Escribir una funcion sum() y una función multip() que sumen y multipliquen respectivamente todos los números de una lista. Por ejemplo: sum([1,2,3,4]) debería devolver 10 y multip([1,2,3,4]) debería devolver 24.

6- Definir una función inversa() que calcule la inversión de una cadena. Por ejemplo la cadena "estoy probando" debería devolver la cadena "odnaborp yotse"

7 - Definir una función es_palindromo() que reconoce palíndromos (es decir, palabras que tienen el mismo aspecto escritas invertidas), ejemplo: es_palindromo ("radar") tendría que devolver True.

8- 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. Escribir la función usando el bucle for

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

anidado.

9- Definir una función generar_n_caracteres() que tome un entero n y devuelva el caracter multiplicado por n. Por ejemplo: generar_n_caracteres(5, "x") debería devolver "xxxxx".

10- Definir un histograma procedimiento() que tome una lista de números enteros e imprima un histograma en la pantalla. Ejemplo: procedimiento([4, 9, 7]) debería imprimir lo siguiente:

****

Listas - Soluciones (1)Se ofrecen a continuación unas posibles soluciones de los ejercicios de listas (1).

Listas (1) - 1

Este programa puede incluir un bucle que se ejecute tantas veces como palabras tiene la lista.

En cada iteración del bucle, se pide un valor y se añade a la lista.

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) + ": ", end="") palabra = input() lista += [palabra] print("La lista creada es:", lista)

Listas (1) - 2

Para contar los elementos, este programa puede incluir un bucle que recorra la lista una vez creada.

Puesto que no se van a modificar los valores de la lista, la lista se puede recorrer directamente (for i in lista).

En cada iteración del bucle, se compara el valor de la lista con el valor buscado y si coinciden, se aumenta el valor de un contador.

numero = int(input("Dígame cuántas palabras tiene la lista: "))

if numero < 1: print("¡Imposible!")else: lista = [] for i in range(numero):

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

print("Dígame la palabra", str(i + 1) + ": ", end="") palabra = input() lista += [palabra] print("La lista creada es:", lista)

buscar = input("Dígame la palabra a buscar: ") contador = 0 for i in lista: if i == buscar: contador += 1; if contador == 0: print("La palabra '" + buscar + "' no aparece en la lista.") elif contador == 1: print("La palabra '" + buscar + "' aparece una vez en la lista.") else: print("La palabra '" + buscar + "' aparece", contador, "veces en la lista.")

Listas (1) - 3

Para sustituir los elementos, este programa puede incluir un bucle que recorra la lista una vez creada.

Puesto que se van a modificar los valores de la lista, la lista se tiene que recorrer indirectamente (for i in range(len(lista))).

En cada iteración del bucle, se compara el valor de la lista con el valor buscado y si coinciden, se sustituye el valor de la lista.

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) + ": ", end="") palabra = input() lista += [palabra] print("La lista creada es:", 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:", lista)

Listas (1) - 4

Para borrar los elementos, este programa puede incluir un bucle que recorra la lista una vez creada.

Puesto que se van a modificar los valores de la lista, la lista se tiene que recorrer indirectamente (for i in range(len(lista))).

En cada iteración del bucle, se compara el valor de la lista con el valor buscado y si

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

coinciden, se elimina el valor de la lista. 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, al eliminar un elemento

la lista se acorta. Como el bucle se ejecuta tantas veces como elementos tenía originalmente, al llegar a la última iteración, se estaría haciendo referencia a un elemento que ya no existe, lo que produciría un error. Si se eliminan más elementos, el error se produciría antes.

o Si la lista se recorre del primer al último elemento, al eliminar un elemento los elementos siguientes avanzan una posición. En la siguiente iteración del bucle, se compara el elemento siguiente al borrado, por lo que el elemento que ha ocupado la posición del elemento borrado escapa a la comprobación. Este problema puede pasar desapercibido si la lista no contiene dos elementos seguidos a eliminar.

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) + ": ", end="") palabra = input() lista += [palabra] print("La lista creada es:", lista)

eliminar = input("Palabra a eliminar: ") for i in range(len(lista)-1, -1, -1): if lista[i] == eliminar: del(lista[i]) print("La lista es ahora:", lista)

Listas (1) - 5

Este ejercicio es similar al anterior. Este programa puede incluir un bucle que recorra la lista de palabras a eliminar y en

cada iteración elimine una palabra. La lista de palabras a eliminar se puede recorrer de forma directa, 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.

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) + ": ", end="") palabra = input() lista += [palabra] print("La lista creada es:", lista)

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

numero2 = int(input("Dígame cuántas palabras tiene la lista de palabras a eliminar: "))

if numero2 < 1: print("¡Imposible!") else: eliminar = [] for i in range(numero2): print("Dígame la palabra", str(i + 1) + ": ", end="") palabra = input() eliminar += [palabra] print("La lista de palabras a eliminar es:", eliminar)

for i in eliminar: for j in range(len(lista)-1, -1, -1): if lista[j] == i: del(lista[j]) print("La lista es ahora:", lista)

Listas (1) - 6

Para crear la lista inversa, este programa puede incluir un bucle que recorra la lista una vez creada.

Puesto que no se van a modificar los valores de la lista, la lista se puede recorrer directamente (for i in lista).

En cada iteración del bucle, se añade el elemento de la lista inicial al principio de la lista inversa.

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) + ": ", end="") palabra = input() lista += [palabra] print("La lista creada es:", lista)

inversa = [] for i in lista: inversa = [i] + inversa print("La lista inversa es:", inversa)

Listas (1) - 7

Para eliminar los elementos repetidos, este programa puede incluir un bucle que recorra la lista una vez creada.

Puesto que se van a eliminar los valores de la lista, la lista se debe recorrer indirectamente y al revés ( for i in range(len(lista)-1, -1, -1)).

En cada iteración del bucle, 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í, se

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

borra.

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) + ": ", end="") palabra = input() lista += [palabra] print("La lista creada es:", lista)

for i in range(len(lista)-1, -1, -1): if lista[i] in lista[:i]: del(lista[i]) print("La lista sin repeticiones es:", lista)

Listas (1) - 8

El programa debe empezar pidiendo dos listas y eliminando los elementos repetidos, como en el ejercicio anterior.

Puesto que se van a eliminar los valores de la lista, la lista se debe recorrer indirectamente y al revés ( for i in range(len(lista)-1, -1, -1)).

En cada iteración del bucle, 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í, se borra.

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", str(i + 1) + ": ", end="") palabra = input() primera += [palabra] print("La primera lista es:", primera)

for i in range(len(primera)-1, -1, -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", str(i + 1) + ": ", end="")

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

palabra = input() segunda += [palabra] print("La segunda lista es:", segunda)

for i in range(len(segunda)-1, -1, -1): if segunda[i] in segunda[:i]: del(segunda[i]) # print("La segunda lista sin repeticiones es:", segunda)

comunes = [] for i in primera: if i in segunda: comunes += [i] print("Palabras que aparecen en las dos listas:", comunes)

soloPrimera = [] for i in primera: if i not in segunda: soloPrimera += [i] print("Palabras que sólo aparecen en la primera lista:", soloPrimera)

soloSegunda = [] for i in segunda: if i not in primera: soloSegunda += [i] print("Palabras que sólo aparecen en la segunda lista:", soloSegunda)

todas = comunes + soloPrimera + soloSegunda print("Todas las palabras:", todas)

/////Su pregunta

Listas - Ejercicios (1)Estos ejercicios corresponden a lo explicado en la lección Listas.

Se pueden consultar unas posibles soluciones.

Listas (1) - 1

Escriba un programa que permita crear una lista de palabras. Para ello, el programa tiene que pedir un número y luego solicitar ese número de palabras para crear la lista. Por último, el programa tiene que escribir la lista.

Dígame cuántas palabras tiene la lista: 3

Dígame la palabra 1: Alberto

Dígame la palabra 2: Benito

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

Dígame la palabra 3: Carmen

La lista creada es: ['Alberto', 'Benito', 'Carmen']

Dígame cuántas palabras tiene la lista: 0

¡Imposible!

Listas (1) - 2

Escriba un programa que permita crear una lista de palabras y que, a continuación, pida una palabra y diga cuántas veces aparece esa palabra en la lista.

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', 'Benito', 'Carmen']

Dígame la palabra a buscar: Carmen

La palabra 'Carmen' aparece 2 veces en la lista.

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', 'Benito', 'Carmen']

Dígame la palabra a buscar: Alberto

La palabra 'Alberto' aparece una vez en la lista.

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

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', 'Benito', 'Carmen']

Dígame la palabra a buscar: David

La palabra 'David' no aparece en la lista.

Listas (1) - 3

Escriba un programa que permita crear una lista de palabras y que, a continuación, 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

Dígame la palabra 3: Benito

Dígame la palabra 4: Carmen

La lista creada es: ['Alberto', 'Carmen', 'Benito', 'Carmen']

Sustituir la palabra: Carmen

por la palabra: David

La lista es ahora: ['Alberto', 'David', 'Benito', 'David']

Listas (1) - 4

Escriba un programa que permita crear una lista de palabras y que, a continuación, pida una palabra y elimine esa palabra de la lista.

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

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

Dígame la palabra 4: Benito

La lista creada es: ['Alberto', 'Carmen', 'Carmen', 'Benito']

Palabra a eliminar: Carmen

La lista es ahora: ['Alberto', 'Benito']

Listas (1) - 5

Escriba un programa que permita crear dos listas de palabras y que, a continuación, elimine de la primera lista los nombres de la segunda lista.

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', 'Carmen', 'Alberto', 'Benito', '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', 'Juan', 'Carmen']

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

La lista es ahora: ['Alberto', 'David']

Listas (1) - 6

Escriba un programa que permita crear una lista de palabras y que, a continuación, cree una segunda lista igual a la primera, pero al revés (no se trata de escribir la lista al revés, sino de crear una lista distinta).

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', 'Benito', 'Daniel']

La lista inversa es: ['Daniel', 'Benito', 'Carmen', 'Alberto']

Listas (1) - 7

Escriba un programa que permita crear una lista de palabras y que, a continuación, elimine los elementos repetidos (dejando únicamente el primero de los elementos repetidos).

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', 'Carmen']

La lista sin repeticiones es: ['Alberto', 'Carmen', 'Benito']

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

Listas (1) - 8

Escriba un programa que permita crear dos listas de palabras y que, a continuación, escriba las siguientes listas (en las que no debe haber repeticiones):

Lista de palabras que aparecen en las dos listas. Lista de palabras que aparecen en la primera lista, pero no en la segunda. Lista de palabras que aparecen en la segunda lista, pero no en la primera. Lista de palabras que aparecen en ambas listas.

Nota: Para evitar las repeticiones, el programa deberá empezar eliminando los elementos repetidos en cada lista.

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', 'Alberto', 'Benito', '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', 'Juan', 'Carmen']

Palabras que aparecen en las dos listas: ['Carmen', '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', 'Benito', 'Alberto', 'Juan']

Bucle while - Ejercicios (1)

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

Estos ejercicios corresponden a lo explicado en la lección sobre el bucle while .

Se pueden consultar unas posibles soluciones.

Nota: En estos ejercicios no se debe realizar ninguna comprobación de tipos, es decir, que si el programa pide un número y el usuario escribe una palabra, los programas pueden fallar e interrumpirse.

Bucle while (1) - 01

Escriba un programa que pida palabras y las guarde en una lista. Para terminar de introducir palabras, simplemente debe pulsarse Intro. El programa termina escribiendo la lista de palabras.

Escriba una palabra: viaje

Escriba otra palabra: aventura

Escriba otra palabra: tebeo

Escriba otra palabra:

Las palabras que ha escrito son ['viaje', 'aventura', 'tebeo']

Bucle while (1) - 02

Escriba un programa que pida números enteros y los guarde en una lista. Para terminar de introducir números, simplemente debe pulsarse Intro. El programa termina escribiendo la lista de números.

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, 123, -25, 123]

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

Bucle while (1) - 03

Escribe un programa que te pida notas (números decimales entre 0 y 10) y las guarde en una lista. Para terminar de introducir notas, escriba una nota que no esté entre 0 y 10. El programa termina escribiendo la lista de notas. La lista de notas final no debe escribirse como lista, sino como valores separados por espacios.

Escriba una nota: 7.5

Escriba una nota: 0

Escriba una nota: 10

Escriba una nota: -1

Las notas que ha escrito son: 7.5 0.0 10.0

Bucle while (1) - 04

Escriba un programa que pida dos números enteros, de manera que el segundo sea mayor que el primero. El programa termina escribiendo los dos números.

Escriba un número: 6

Escriba un número mayor que 6: 6

6 no es mayor que 6. Inténtelo de nuevo: 1

1 no es mayor que 6. Inténtelo de nuevo: 8

Los números que ha escrito son 6 y 8.

Bucle while (1) - 05

Escriba un programa que pida números enteros cada vez más grandes y los guarde en una lista. Para terminar de escribir números, escriba un número que no sea mayor que el anterior. El programa termina escribiendo la lista de números.

Escriba un número: 6

Escriba un número mayor que 6: 10

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

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, 10, 12, 25]

Bucle while (1) - 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. Para terminar de escribir números, escriba un número que no esté comprendido entre los dos valores iniciales. El programa termina escribiendo la lista de números.

Escriba un número: 6

Escriba un número mayor que 6: 4

4 no es mayor que 6. 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, 13]

Bucle while (1) - 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.

Escriba el límite: 50

Escriba un número: 10

Escriba otro número: 25

Escriba otro número: 15

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

Escriba otro número: 14

El límite a superar es 50. La lista creada es [10, 25, 15, 14]

Bucle while (1) - 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: 45

45 es demasiado grande. Escriba otro número: 1

Escriba otro número: 39

El límite a alcanzar es 50. La lista creada es [10, 1, 39]

Escriba el límite: 50

Escriba un número: 60

60 es demasiado grande. Escriba otro número: 10

Escriba otro número: 45

45 es demasiado grande. Escriba otro número: 1

Escriba otro número: 39

El límite a alcanzar es 50. La lista creada es [10, 1, 39]

Bucle while (1) - 09

Escriba un programa que pida nombres de personas y sus números de teléfono. Para terminar de escribir nombres y números, se debe pulsar Intro cuando pida el nombre. El programa termina escribiendo todos los nombres y teléfonos.

Notas:

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

La lista en la que se guardan los nombres y teléfonos puede ser [ [nombre1, telef1], [nombre2, telef2], [nombre3, telef3], etc]

Una persona puede no tener número de teléfono.

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:

Los nombres y teléfonos son:

Paco Jerte: 963141592

Susana Horia:

Ulises Tropeado: 962718281

Bucle while (1) - 10

Escriba un programa que pida los nombres y las notas (decimales entre 0 y 10) de varios alumnos. Para terminar de escribir notas de un alumno, escriba una nota fuera del intervalo de 0 a 10. Para terminar de escribir nombres de alumnos, se debe pulsar Intro cuando pida el nombre.

Notas:

La lista en la que se guardan los nombres y notas es [ [nombre1, nota1, nota2, ... ], [nombre2, nota1, nota2, ... ], [nombre3, nota1, nota2, ... ], ... ]

Un alumno puede no tener notas

Escriba un nombre: Héctor Tuga

Escriba una nota: 4

Escriba otra nota: 8.5

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

Escriba otra nota: 12

Escriba otro nombre: Diego Loso

Escriba una nota: 14

Escriba otro nombre: Inés Pejo

Escriba una nota: 7.5

Escriba otra nota: 1

Escriba otra nota: 2

Escriba otra nota: -5

Escriba otro nombre:

Las notas de los alumnos son:

Héctor Tuga: 4.0 8.5

Diego Loso:

Inés Pejo: 7.5 1.0 2.0

**********************La solución:-------