5.1   Usando funciones

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

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:

Unknown directive type ``code-block''.

.. code-block:: python 
 
    def inicio( cadena='' ): 
        "Inicia el documento HTML." 
        return '''<html> 
      <head> 
        <title>''' + cadena + '''</title> 
      </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:

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

usando-una-clase [1]5.2   Usando una claseusando-una-clase