Python logo sin texto

Python 3.5.2 tutorial: funciones

Hoy día continuamos el aprendizaje: veremos las funciones en Python ¡adelante!

Python logo original
Python logo original

Introducción.

Esta es la segunda parte de nuestro tutorial sobre Python, específicamente la versión 3.5.2, para ser exactos. Para mayores detalles de compatibilidad, historia y, en fin, lo básico sobre este lenguaje, debéis leer primero nuestra entrega anterior. Pero si ya tenéis alguna experiencia, podéis comenzar aquí con funciones. Y si soís un profesional en esto, gracias por vuestra visita, vuestras correcciones las podéis hacer llegar vía Twitter a @ks7000 o realizar un comentario acá abajo al finalizar esta entrada. Pues bien, ¡manos a la obra!

Funciones en Python.

Clasificación de las funciones.

En la primera parte de nuestro tutorial hicimos una sencilla función, demasiado simple, para nuestro programa que_hubo_mundo.py, y ahora es bueno que veaíś el panorama completo de las funciones desde nuestro punto de vista.


Advertencia.
Advertencia.

Lo aquí expresado por nosotros es nuestra opinión, la forma y manera en que enfocamos el aprendizaje del lenguaje Pyhton. En la página web oficial podréis ver el tutorial completo -en inglés- y con todo detalle. Nuestra idea es que aprendáis lo básico y una vez estéis diestro o diestra en la materia, repaséis en Python.org y contrásteis la información. ¿Queréis continuar? ¡Vamos!


 Las funciones en Python las consideramos en el siguiente orden:

  • Funciones nativas o integradas: no se necesita acción alguna fuera de llamarlas y pasarles los argumentos, si es que exige alguno. Ejemplo fácil: la función print() la cual podemos llamarla y simplemente nos “devuelve” un retorno de carro por cónsola en pantalla. Y decimos que nos “devuelve” porque eso es lo que vemos que hace la función, porque en realidad no nos devuelve valor alguno, ni numérico ni de texto. ¿Recordáis la palabra clave “end” para print()? Ingresad en vuestra cónsola lo siguiente (le “pasamos” un argumento a print() especificamente un argumento con palabra clave): print(end=””) ¿Qué os parece?
  • Funciones que vienen con Python pero hay que declararlas primero para luego llamarlas: pues eso, vamos a traer un ejemplo práctico, cuando vosotros estáis trabajando en modo interactivo tal vez os gustaría poder “limpiar” la cónsola de todo lo que hayáis practicado. Pues bien, esta tarea descansa con el sistema operativo de vuestro ordenador, y en el caso de GNU/Linux se hace con el comando “clear” pero antes que intentéis probarla revisad primero el siguiente código, observad la palabra clave o comando import:
  • >>> import os
    >>> os.system(“clear”)
    0
    >>>
  • Eso es lo que veréis, más o menos. La pantalla se “limpiará” pero obervareís que aparece un cero y luego el prompt de Python interactivo. Por eso es que es una función, devuelve un valor, que en este caso es cero. Si queremos que ese cero no aparezca y veamos una prístina cónsola (solo el prompt, por su puesto) deberemos teclear algo como esto: k = os.system(“clear”). Al finalizar estos párrafos os colocamos una captura de pantalla para que veaís más detalles.
  • Funciones para Python que hay que descargarlas e importarlas: nosotros podemos publicar (como de hecho lo hicimos) nuestro archivo que_hubo_mundo.py el cual contiene la función hola() la cual solamente imprime el mensaje “¡Qué hubo mundo!”. Abrid una ventana terminal, listad los ficheros con el comando ls y si tenéis el archivo en cuestión en esa carpeta entonces abrid la terminal interactiva e ingresad lo siguiente: from que_hubo_mundo import hola y observad lo que pasa. ¡Genial! ¿o no? Pues bueno así podéis crear tus “librerías” e incluir el trabajo de otros, así, sin mayor parsimonia ni protocolo (punto 3 PEP20). El problema de esto es que si traemos el trabajo de otras personas hasta nuestro disco duro y dichos programadores publican una nueva versión (para mejor, se supone) deberemos descargar manualmente y verificar si funciona con nuestro programa -dos trabajos en uno-. Para evitar esto pasemos al siguiente punto.
  • Funciones para Python que hay que instalarlos por un procedimiento especial: Python.org mantiene siempre sus puertas abiertas a contribuciones, tanto monetarias como de programas y para ello mantiene en línea “the Python Package Index” (El Índice de Paquetes de Python) con el cual podemos instalar el trabajo de los demás y mantenernos actualizados si surgen nuevas versiones. El “procedimiento especial” consiste en instalar el programa pip el cual será el que haga el trabajo por nosotros (aunque probablemente ya lo tenéis instalado). A su vez, para instalar pip debemos descargar un archivo llamado get-pip.py desde un servidor seguro (HTTPS, “candado verde”) y ejecutarlo. Luego podremos usar directamente desde Python.org cualquier trabajo publicado. Aquí es importante acotar que se deben seguir normas y reglas para publicar y son de obligatorio cumplimiento si queremos llegar lejos en esto. Sabemos que si seguimos estudiando y trabajando duro algún día publicaremos algo allí pero si queréis probar cómo funciona (declarar, subir y luego bajar nuestra programación) Python ofrece un ambiente de prueba (le dicen “sandbox” en inglés ya que allá se acostumbra poner en los parques cajones de madera llenos de arena para que los niños y niñas desarrollen sus habilidades motoras sin dañar nada ni herirse): he aquí el enlace y “happy hacking!” como dicen allá 😉 .
os.system("clear")
os.system(“clear”)

Creación de una función con el comando pass.

La manera intencional de declarar una función que no haga nada pues tiene que darse con un comando que tampoco haga nada. Os presentamos el comando pass. Y eso es lo que hace, nada de nada. Mirad este código:

>>> def adios():
...     pass #Aquí colocaremos código a futuro
...
>>> adios()
>>>

Como veís, al invocar la función no realiza “nada”. Aquí vamos a explicar línea por línea:

  • Línea 1: definimos la función con la palabra reservada def seguido de un espacio y el nombre que hayamos escogido para la función. Luego colocamos par de paréntesis, uno que abre y otro que cierra, allí luego colocaremos los argumentos o datos que le queremos pasar a la función. Los dos puntos “:” indican que la línea no acaba allí, que hay más en líneas siguientes y al presionar intro observaréis que el prompt pasa a ser “…” y nos invita a escribir la segunda línea.
  • Línea 2: en la primera parte de este tutorial hablamos de configurar nuestro editor de textos para que al presionar la tecla TAB nos inserte espacios en vez del caracter tabulador. Ahora os rogamos, para cumplir con las normas de Python.org que lo configuréis exactamente a 4 espacios o que pulséis 4 espacios la primera vez y luego vuestro procesador indentará automáticamente cada vez que presionéis intro. Así que colocamos el comando pass (que no hace nada sino gastar 4 bytes en nuestro disco duro al estar guardado en un archivo). Luego colocamos un comentario sobre lo que pensamos hacer a futuro con dicha función.
  • Línea 3: una línea en blanco para poder presionar intro y volver al prompt interactivo. También debemos dejar una línea en blanco si estuvieramos escribiendo en un archivo, por razones de legibilidad y claridad en nuestro código.

Creación de una función útil en la vida real.

Muy bonito estudiar la teoría pero debemos de ser pragmáticos y ponerla a trabajar en nuestras vidas. Para ello vamos a realizar una función que dado un monto nos calcule el impuesto a las ventas que debemos pagar (Impuesto al Valor Agregado, I.V.A. o IVA). En nuestro país, Venezuela, todo eso está normado por la ley y si queréis revisarlo nosotros hemos publicado una entrada al respecto.

El cálculo es el siguiente: al monto (que llamaremos base gravada o base) le multiplicamos por la tasa de impuesto y la dividimos entre cien. A la fecha la tasa es de un 12% pero puede aumentar o disminuir con el paso del tiempo, pero en general dura meses y hasta años en un mismo valor. Asumiremos entonces que es 12% y pasamos a escribir la función:

>>> def impuesto(base):
...     print('Impuesto a pagar:', round(base*12/100,2))
... 
>>> impuesto(100)
Impuesto a pagar: 12
>>>

Rápidamente observamos, en la única linea de la función, como hemos utilizado la función print() , hemos separados con comas los argumentos para nos imprima un espacio en blanco entre ellos, y uno de los argumentos le hemos pasado una funcion round() a su vez con dos argumentos: el cálculo del impuesto en sí y el número 2 para indicarle que redondee el impuesto a dos decimales ya que así lo exige la ley (hay ciertos casos como el manejo de moneda extranjera o divisa -por ej.: €- y venta de hidrocarburos que, debidos a los altos montos, al multiplicar con solo 2 decimales trae mucha diferencia: solo en esos casos se exigen 4 decimales ¿por qué demonios explicamos esto? Más adelante veréis ).

Por supuesto, el comando pass lo eliminamos y el comentario también, pero no debemos dejarlo así, siempre debemos agregarle un texto explicativo, no solo para nosotros a futuro, que se nos pueden olvidar las cosas (¡vamos , a menos que seas Rainman!) sino para enriquecer a la comunidad de software libre, debemos compartir nuestras creaciones (y cobrar por el servicio, claro está, el que trabaja se gana su pan diario). Si con esos argumentos no os hemos convencido aquí va un tercero que es necesario: Python.org tiene algo llamado docustring que fue diseñado para que se puedan construir manuales a partir de un formato especial que nosotros agreguemos a nuestras funciones. ¿Cómo funciona esto? Solamente os decimos que debemos seguir estudiando cómo escribir funciones y en su oportunidad volveremos a tocar el tema.

Baste entonces con escribir nuestro comentario encerrado en un  entrecomillado triple para cumplir con Python.org y sus normas, veamos

>>> def impuesto(base):
...     ''' Cálculo del IVA a un monto dado '''
...     print('Impuesto a pagar:',round(base*12/100,2))
... 
>>>

¿A que es más lúcida nuestra función? Pero ojo, ahora vamos a llamar la función impuesto() tal cual, sin ningún monto y veremos un hermoso error, al traste con nuestra emoción, pero la computadora está en lo correcto, y si nosotros hemos fallado ¿qué esperamos entonces de nuestros futuros usuarios de nuestros programas?

Pues he aquí que vamos a mejorar nuestra función, la versión 0.1, de esta manera:

>>> def impuesto(base=0):
...     ''' Cálculo del IVA a un monto dado V. 0.1 '''
...     if base==0:
...         print('Introduzca un monto mayor que cero.')
...     else:
...         print('Impuesto a pagar:', round(base*12/100,2))
>>>

Agregamos un valor por defecto así que si al llamar a la función no le pasamos argumento entonces toma un valor de cero y si el valor es cero imprime un mensaje invitando a hacerlo. Hemos  convertido una función con argumento obligatorio en una que no lo es. Esto tiene ventajas y desventajas: si no le ponemos valor por defecto nos obligamos nosotros mismos a ser mejores programadores. Pero como le pusimos valor por defecto es recomendable que el programa avise que se le está pasando, así sea verdad o no, un valor cero, por lo tanto el impuesto sería cero y la función no tendría razón de ser. Si nos equivocaramos programando y en algún punto llamamos a la función sin argumento con el tiempo recibiremos una hermosa llamada telefónica de nuestros clientes diciendo algo como “metemos el monto de la base y el programa dice que introduzcamos un valor mayor que cero“.

Así nuestra función sigue evolucionando: volvemos a colocarla para que sea obligatoria la base como argumento PERO dejamos el mensaje y lo mejoramos para manejar valores negativos, la versión 0.2 quedaría así:

>>> def impuesto(base):
...     ''' Cálculo del IVA a un monto dado Ver. 0.2 '''
...     if base<=0:
...         print('Introduzca un monto mayor que cero.')
...     else:
...         print('Impuesto a pagar:', round(base*12/100,2))
>>>

Funciones con argumentos con palabras clave.

Os dijimos que el monto de la tasa de impuesto dura meses y hasta años con el mismo valor, pero eventualmente cambia. Por ello vamos a pensar en el futuro y modifiquemos otra vez, sería la versión 0.3:

>>> def impuesto(base, tasa=12):
...     ''' Cálculo del IVA a un monto dado Ver. 0.3 '''
...     if base<=0:
...         print('Introduzca un monto mayor que cero.')
...     else:
...         n_tasa = input('Introduzca tasa (12%)')
...         if len(n_tasa) > 0:
...             tasa=float(n_tasa)
...         print('Impuesto a pagar: Bs.', round(base*tasa/100,2))
...
>>>

Aquí le damos la oportunidad al usuario de modificar la tasa si ha cambiado, de lo contrario pulsa intro y la tasa seguirá con su valor por defecto de un 12% que le colocamos al declarar la función. La función input() devuelve una cadena de texto: si el usuario escribió algo la longitud de la cadena es mayor a cero y la función len() nos lo dirá así, por otra parte la función float() convertirá la cadena de texto a un número de doble precisión, capaz de manejar decimales.

Pasaremos por alto que el usuario introduzca un valor no numérico, ya llegará el momento de mejorar nuestro código. Por ahora nos interesa seguir aprendiendo. Así como modificamos nuestra función nos permite para la tasa desde la llamada a la función, por ello es lo correcto mostrar dicho monto para que la función input() enseñe la tasa que va a aplicar, podemos modificar la línea de la siguiente manera:

...         n_tasa = input('Introduzca tasa ('+str(tasa)'%)')

Para llamar a la función escribiremos impuesto(100 , 15) para indicarle a la función, por lógica, que a un monto de Bs. 100 le calcule el 15% de impuesto. Pero con Python tenemos varias maneras de llamar a la función y todas producirán el mismo resultado: Bs. 15 -si simplemente presionamos intro cuando verifica la tasa-, probadlo en vuestras cónsolas por favor:

>>> impuesto(100 , 15 )
Impuesto a pagar: Bs. 15.0
>>> impuesto(base=100 , tasa=15)
Impuesto a pagar: Bs. 15.0
>>> impuesto(tasa=15, base=100)
Impuesto a pagar: Bs. 15.0
>>> impuesto(tasa=15, 100)
  impuesto(tasa=15 , 100)
                    ^
SyntaxError: non-keyword arg after keyword arg

En la última entrada nos arroja error porque no estamos pasando el valor con su palabra clave, Python espera que el primer argumento sea obligatorio y no importa si solo tiene 2 argumentos (con una palabra clave pues por descarte el otro argumento es el “restante”), es decir, si vamos a cambiar el orden de los argumentos siempre debemos pasarle la palabra clave para indicarle a donde va cada valor. De otra manera, pues nos aprendemos de memoria el orden exacto de los argumentos de cada función. Si tenemos un editor que nos ayude a escribir las funciones, bien, por medio de tooltips nos dirán el nombre y tipo de variable que espera cada función mientras estamos escribiendo un comando al programar. Pero en GNU/Linux se necesitan programas pequeños que hagan cosas pequeñas y las hagan bien. Previendo la programación a futuro, rumbo a la inteligencia artificial, Python nos ofrece algo muy interesante. Empecemos por docustring ¿lo recordáis?

Anotaciones en funciones.

Podemos ‘preguntarle’ a la función para qué sirve por medio de su docustring simplemente ingresando lo siguiente:

>>> print(impuesto.__doc__)
 Cálculo del IVA a un monto dado V. 0.3

Ya vamos viendo la utilidad de documentar a medida que programamos; también tenemos la posibilidad de “saber” cuántos argumentos recibe la función sin haberle pasado un solo dato, lo que nos prepara para el poder usarla (si es que otra persona la escribió o es lo que nosotros escribimos para otras personas). Para ello debemos agregar a nuestra función la siguiente notación “ -> float: ” ya que así definimos qué tipo de dato espera entregar y recibir la función (eso disciplina nuestras tácticas de programación, pasandole a la función el tipo correcto de dato):

>>> def impuesto(base: float, tasa: float =12) -> float:
...     ''' Cálculo del IVA a un monto dado Ver. 0.3 '''
...     if base<=0:
...         print('Introduzca un monto mayor que cero.')
...     else:
...         n_tasa = input('Introduzca tasa (12%)')
...     if len(n_tasa) > 0:
...         tasa=float(n_tasa)
...     print('Impuesto a pagar: Bs.', round(base*tasa/100,2))
...
>>>print(impuesto.__annotations__)
{'base': <class 'float'>, 'return': <class 'float'>, 'tasa': <class 'float'>}

¿Observáis el formato como devuelve las definiciones de los argumentos? Vamos a analizarlos y para ello lo colocaremos en varias líneas de manera indentada:

{
    'base': <class 'float'>,
    'return': <class 'float'>,
    'tasa': <class 'float'>
}

La primera y última línea encierra la definición por medio de corchetes de apertura y cierra. La segunda línea indica que un argumento tiene como nombre clave la palabra ‘base’ y debe ser un número flotante.  La tercera línea “return’ indica lo que devuelve la función, una variable numérica flotante (la cual habremos redondeado a dos decimales, como explicamos). No especifica nombre pues ya sabemos cómo se llama la función. La cuarta línea también indica que debe recibir un argumento llamado ‘tasa’ y debe ser númerica de tipo flotante. Notarán que las nombran entre corchetes angulares como “class” o clase en castellano: si nosotros hiciéramos nuestras propias clases podremos referirnos a ellas en cualquier momento. Hay clases definidas de antamano en Python: ‘float’ es una variables numérica que admite hasta 16 decimales (en su momento veremos los tipos de datos disponibles en Python).

Las anotaciones de funciones son totalmente opcionales y están definidas en PEP 484 y son de reciente adaptación, año 2015, aunque tienen su base en otras PEP, aparte de ser compatibles, en cierta forma.

Palabra clave “return“.

Lo próximo que vamos a realizar es transformar completamente nuestro código a una verdadera función con el comando return, veamos:

>>> def impuesto(base: float, tasa: float =12, decimales: int =2) -> float:
...     ''' Cálculo del IVA a un monto dado Ver. 0.4'''
...     monto=round(base*tasa/100, decimales)
...     return monto
... 
>>> valor_impuesto=impuesto(100)
>>> print(valor_impuesto)
12.0

Lo que hicimos fue agregarle un argumento adicional, opcional, con la palabra clave “decimales” y que por defecto es 2 (por ley de nuestra República) y la “tasa” de impuesto que por ahora es 12 pero que le podemos pasar a la función un valor diferente sea el caso. También utilizamos una variable llamada “valor_impuesto” donde guardamos el valor devuetlo para la función y a continuación lo imprimimos por pantalla; pero esta variable la podemos usar donde y como la necesitemos. Así podemos practicar de varias maneras el por palabras claves, veamos, que la práctica hace al maestro (recordemos que estamos en modo interactivo y simplemente al llamar la función se imprime automáticamente por pantalla, pero si la guardamos en un archivo .py debemos guardar en una variable para luego imprimirla, tal como codificamos, de lo contrario no tendremos salida por pantalla):

>>> impuesto(20)
2.4
>>> impuesto(100, tasa=7)
7.0
>>> impuesto(100, tasa=15, decimales=4)
15.0
>>> impuesto(1477, tasa=17, decimales=4)
251.09
>>> impuesto(1970, tasa=17.89, decimales=4)
352.433
>>> impuesto(1341, decimales=4, tasa=17.89)
239.9049

Lo que siempre debemos hacer es “pasarle” la base, y luego por medio de palabras claves, sin importar el orden, los otros dos argumentos, de lo contrario arroja error (o excepción que es el nombre correcto). Si queremos pasarle argumentos, sin importar el orden, debemos colocarle palabras claves a todos los argumentos, de la siguiente manera:

>>> impuesto(decimales=2, tasa=10, base = 1500)
150.0
>>> impuesto(decimales=2, tasa=10)
Traceback (most recent call last):
 File "/usr/lib/x86_64-linux-gnu/gedit/plugins/pythonconsole/console.py", line 378, in __run
 r = eval(command, self.namespace, self.namespace)
 File "<string>", line 1, in <module>
TypeError: impuesto() missing 1 required positional argument: 'base'

Sin embargo, si le pasamos solamente los decimales y la tasa y no le pasamos la base, arroja error, porque ese debe ser un argumento obligatorio , ya que tasa y decimales le colocamos valores por defecto y así los convertimos en argumentos opcionales.

Uso de variables para pasarlas a las funciones.

Veremos algo que es facilmente deducible, pero lo complicaremos un poco con los valores por defecto en los argumentos opcionales de una función. Nos explicamos: podemos guardar en variables los valores y luego pasarlos a la función:

>>> miMonto=450
>>> miTasa=10
>>> misDecimales=3
>>> miImpuesto=impuesto(miMonto, miTasa, misDecimales)
>>> print(miImpuesto)
45.0
>>> miImpuesto=impuesto(tasa=miTasa, base=miMonto, decimales=misDecimales)
>>> print(miImpuesto)
45.0

Esto no necesita mayor explicación: es simplemente pasarle los valores por medio de variables. Lo que es más avanzado es pasarle los valores por defecto a la función por medio de variables declaradas antes de definir la función y dichas variables luego pueden cambiar su valor pero la función quedará definida con los valores dados exactamente antes de haber definido la función. Podemos así redefenir la función y luego explicaremos su utilidad:

valor_tasa=15
def impuesto(base: float, tasa: float =valor_tasa, decimales: int =2) -> float:
    ''' Cálculo del IVA a un monto dado Ver. 0.4'''
    monto=round(base*tasa/100,decimales)
    return monto

valor_tasa=16

Aunque luego cambiemos la variable valor_tasa a 16, la función impuesto() quedará en un valor de  por defecto de 15 en la tasa a lo largo de todo el programa.

¿Recordáis que os dijimos que la tasa de impuesto puede variar, según las necesidades fiscales del país? Pues bueno, nuestra función se puede preparar a futuro (por ejemplo, realizamos una sencilla aplicación de facturación y manejo de inventario) si escribimos nuestras funciones de esta manera, las podemos a volver a recompilar rápidamente si al módulo principal le cambiamos el valor. 

Funciones con argumentos arbitrarios.

Podemos definir una función que acepte cualquier argumento, habiendo ya estudiado anteriormente la flexibilidad que denota Python. Son pocos caracteres que la componen, pero no se dejen engañar: es una función compleja y difícil de asimilar, muy genérica, y es difícil darle un uso práctico:

>>> def mi_funcion(*argumentos):
...     for mi_arg in argumentos:
...         print(mi_arg)
... 
>>> mi_funcion(20)
20
>>> mi_funcion()
>>> mi_funcion(20,"prueba")
20
prueba
>>> mi_funcion(20, "prueba", 17, 20, "otra prueba")
20
prueba
17
20
otra prueba
>>>

Funciones con argumentos arbitrarios pero con palabras claves.

Para “declarar” argumentos arbitrarios en una función solamente tenemos que precederla con un asterisco y así Python “sabrá” agruparlas en un “diccionario” lo cual nos permite listarlas (y trabajar) dichos argumentos (que serán una simple variable más dentro de la función). Pero como mejor es explícito que implícito, Python nos permite pasar argumentos con palabras claves (y todas deben llevar su palabra clave o producirá una “errror” o excepción). Tomemos de nuevo nuestra función de cálculo de IVA con una base dada

>>> def impuesto(**argumentos) -> float:
...     ''' Funciones con argumentos y palabras claves '''
...     monto=0
...     base = 0
...     tasa = 12
...     decimales = 2
...     for arg_clav in argumentos.keys():
...         if arg_clav=='base':
...             base=float(argumentos[arg_clav])
...         if arg_clav=='tasa':
...             tasa=float(argumentos[arg_clav])
...         if arg_clav=='decimales':
...             decimales=int(argumentos[arg_clav])
...     monto=round(base*tasa/100,decimales)
...     return monto
...
>>> monto_iva=impuesto(decimales=2, base=500, tasa=7)
>>> print(monto_iva)
35.0
>>> print(impuesto.__annotations__)
{'return': <class 'float'>}
>>> print(impuesto.__doc__)
 Funciones con argumentos y palabras claves 
>>> 

Ya nuestras funciones van ganando complejidad y cada vez es más difícil escribirlas en modo interactivo, creemos que ya vale la pena escribirlas en un archivo por medio de nuestro editor de texto favorito, pronto daremos unas recomendaciones al respecto y unas normativas de Python. Mientras, veámos que sucede en este último ejemplo:

  • Línea 1: declaramos la función en sí con metadatos incluídos.
  • Línea 2: le establecemos su docustring.
  • Líneas 3 a 6: incializamos las variables con su valor pro defecto, si lo tuviera.
  • Línea 7: llamamos a un ciclo for para enumerar todos los argumentos con palabra claves “pasadas” a la función.
  • Líneas 8 a 13: por medio de sentencias condicionales verificamos si todos los elementos de la fórmula del cálculo del impuesto están presentes, si faltare alguno pues tomaría su valor por defecto.
  • Línea 14: realiza el cálculo en sí.
  • Línea 15: devuelve el resultado hacia fuera de la función.
  • Demás líneas: anotaciones de la función y su docustring. Obsérvese que en las anotaciones solo nos indica que es una función que solo devuelve un valor numérico flotante, sin ninguna información de los argumentos necesarios para que “haga su trabajo”

¿Qué utilidad tiene esto, declarar una función tan extraña que acepte cualquier cantidad de argumentos con palabras clave? Cuando veamos los diccionarios en mayor detalle se nos ocurrirán unos cuantos usos útiles, en este punto vamos a probar algo muy sencillo:

>>> diccionario = { "base" : 277.25 , "tasa" : 19 , "decimales": 3 }
>>> impuesto(**diccionario)
52.678
>>>

Fíjense que las palabras claves deben estar encerradas entre comillas, y que debemos colocarle dos asteriscos al llamar a la función, así estemos declarando la función con **argumentos, esto es lo más curioso del asunto y nos devuelve al principio: cualquier función acepta los argumentos con palabras claves si le colocamos ** al llamar la función con un diccionario ¿complejo, cierto? Y apenas estamos comenzando 😉 .

Funciones “clonadas”.

Python nos permite tomar las funciones que importemos y “cambiarles” el nombre. Así nuestra función impuesto() que escribimos, tal vez sea para nosotros memorizarla de otra manera, por ejemplo impt(), pues solo debemos escribir impt = impuesto  y pasarle los valores con el diccionario que hicimos anteriormente, he aquí:

>>> diccionario = { "base" : 277.25 , "tasa" : 17 , "decimales": 4 }
>>> impt = impuesto
>>> impt(**diccionario)
47.1325
>>>

Función abreviada lambda.

A veces necesitamos usar una función una sola vez (cosa rara) y codificarlo en 3 líneas como mínimo (aparte de ir en una sección aparte de nuestro proyecto dedicada a las funciones) pues que nos lleva tiempo y espacio. Para ello echamos mano de la ¿función de funciones? el comando lambda. Este comando nos permite aplicar, por ejemplo, un cálculo como el nuestro, que es sumamente sencillo, practiquemos:

>>> (lambda base : round(base*12/100,2))(100)
12.0

Como vemos no le colocamos nombre a la función, solo le indicamos que devuelva la misma base con el cálculo del impuesto (es todo lo que encierra el primer par de paréntesis de izquierda a derecha) y en el segundo par de paréntesis le pasamos el argumento con la base a calcular. Tal vez sea complicado de entender así que pasamos a definir la función y “clonarla” con un nombre:

>>> impuesto=lambda base : round(base*12/100,2)
>>> impuesto(1000)
120.0
>>> impuesto(7)
0.84
>>> impuesto(70)
8.4
>>> impuesto(100)
12.0
>>>

Acá vemos que es una manera de definir rápidamente una función. Si queremos colocarle los argumentos completos la podemos definir de la siguiente manera:

>>> impuesto=lambda base, tasa, decimales: round(base*tasa/100,decimales)
>>> impuesto(100,12,2)
12.0
>>> impuesto(543,17,4)
92.31
>>>

Evidentemente que los argumentos son posicionales, si queremos agregarles palabras claves… pues para eso definimos la función completa como ya lo hemos hecho. Consideramos útil a este comando/función dentro de otra función declarada para que se circunscriba dentro de esa función solamente, pero vosotros juzgad y dadle algún otro uso novedoso, ¡a practicar!

Estilo al codificar.

En PEP 8 se especifica cómo codificar nuestras funciones y para que queden correctas deben cumplir con las suguientes especificaciones:

  • Se deben indentar con 4 espacios y sin tabuladores (ver al final nuestras recomendaciones).
  • Las líneas no deben superar los 79 caracteres.
  • Se deben usar líneas en blanco entre funciones y clases.
  • Cuando sea posible, coloque los comentarios en la misma línea que describe.
  • Se debe usar docustring (¿deberíamos traducirlo como ‘docutexto‘?).
  • Se deben usar espacios entre los operadores y después de las comas pero no dentro de los paréntesis, ejemplo: a = f(1,2) + g(3,4) .
  • En el caso de las funciones y métodos se deben separar las palabras con guión bajo, por ejemplo impuesto_iva() , impuesto_sobre_renta() ; las clases se deben nombrar en estilo jorobas de camello: TasaDeImpuesto.
  • En el caso de que nuestro código sea para uso internacional, deberemos usar solamente caracteres básicos. Evidentemente que nuestro idioma utiliza muchos caracteres extendidos en UTF-8, así que todo dependen hacia adonde va dirigido.

Uso de gedit con python.

Por mucho nuestro editor de texto favorito es gedit debido a que tiene ciertas características deseables para programar pequeños proyectos de código.

Las capturas de pantalla aquí mostradas corresponde a gedit 3.10.4:

gedit version 3.10.4
gedit version 3.10.4

Al ejecutarlo lo primero que debemos activar es la barra de herramientas y la barra de estado en el menú desplegable “Ver”:

gedit barra de herramientas y barra de estado
gedit barra de herramientas y barra de estado

Al marcar estas dos opciones podremos ver en la aprte superios los comandos más usados como: documento nuevo, abrir documento, guardar, imprimir, etcétera. A pesar que todos estos comandos tiene sus atajos de teclados, los íconos de los botones tienen un efecto muy intuitivo. La parte más importante es la parte inferior la cual permite escoger qué lenguaje estamos programando y justo al lado la cantidad de espacios a insertar en el indentado automático y al presionar la tecla tabulador inserte espacios en vez de la caracter tabulador en sí, veamos:

gedit ventana principal
gedit ventana principal
gedit lenguajes soportados
gedit lenguajes soportados
gedit cantidad de espacios a usar con la tecla TAB
gedit cantidad de espacios a usar con la tecla TAB

También podemos guardar nuestras perferencias para la próxima vez que ejecutemos gedit, para hacerlo vamos al menu desplegable “Editar” -> “Preferencias” y marcamos las siguientes opciones, todo según las normas de estilo de Python:

Preferencias de gedit
Preferencias de gedit
  • Mostrar los números de línea nos sirve para hallar rápidamente dónde debemos corregir cuando el depurador Python nos indica algún fallo de sintaxis.
  • Al mostrar el margen derecho con una pequeña marca de agua nos ayuda a no sobrepasar los 79 caracteres.
  • Si activamos el ajuste de texto, así no sobrepasamos los 79 caracteres por línea pero cambiamos el tamaño de nuestra ventana, gedit nos colocará las líneas que no quepan en la ventan en múltiples líneas pero respetando la numeración para indicarnos que es una sola línea sobre la que estamos trabajando. La opción de no dividir palabras nos permite los comandos completos, sin divisiones.
  • La opción de resaltar la línea actual nos permite enfocarnos en la linea sobre la cual estamos editando y si es multilínea (ve punto anterior) nos  ofrece un mejor panorama.
  • Por último resaltar parejas de corchetes nos permite anidar funciones y sus argumentos son más fáciles de visualizar.
gedit activar ajuste de texto
gedit activar ajuste de texto

Una vez hayamos fijado nuestras preferencias (la cuales se aplican en tiempo real, así que muestran como se ve nuestro archivo de una vez) también podemos activar los complementos que nos serán muy útiles:

 

gedit complementos: completado de palabras, completar paréntesis y cónsola python.
gedit complementos: completado de palabras, completar paréntesis y cónsola python.
  • El completado de palabras “memoriza” los comandos que hayamos escrito y al nosotros volver a escribirlos el complemento lo sugiere por medio de un pequeño menú emergente. Recomendamos hacer click en “preferences” y marcar interactivo y un mínimo de 3 letras por palabra.
  • Completar paréntesis, corchetes rectos y llaves evita el error común de no hacerles el cierre. No funciona con los corchetes angulares “<” y “>”.
  • Por último la cónsola python: al activarla podemos pulsar CTRL+F9 y una subventana en la parte inferior nos abre una cónsolar interactiva con práticamente las mismas características de la cónsola python. Podemos volver a la edición del documento con la tecla ESC y volver a abrir la cónsola python con CONTROL+F9.
gedit con la cónsola python activada
gedit con la cónsola python activada

 

Fuentes consultadas:

En idioma castellano:

Enlaces en idioma inglés:

Python logo sin texto

Python 3.5.2 tutorial

Introducción.

Python logo original
Python logo original

En una publicación anterior tratamos el tema de generar códigos QR con lenguaje Python y hasta escribimos un sencillo cliente FTP para sincronizar los archivos de una carpeta local versus una carpeta remota. He aquí que entonces que necesitamos un tutorial sobre cómo funciona el lenguaje Python, un lenguaje versátil multiplataforma. Específicamente estaremos tratando la versión 3.5.2 porque consideramos que es el futuro y tiene varios años ya de existencia entre nosotros, dado el caso que valga la pena referirnos a alguna versión 2.X lo especificaremos pero la idea es ser lo más sencillo posible con abundancia de ejemplos y la menor teoría posible.

Historia del lenguaje Python.

A finales de los años 1980 el Doctor Guido Van Rossum creó el lenguaje Python para que sustituyera al lenguaje ABC en el Centro para las Matemáticas y la Informática en los Países Bajos. Su nombre proviene en honor del famoso grupo humorístico “Monty Python’s Flying Circus“. En un principio lo hizo por pura afición, y tiene su “hégira” en diciembre de 1989, mientras estaba de vacaciones. Hasta el día de hoy continúa trabajando en ello, ya que se convirtió en “benevolente dictador de por vida” (aún sigue al frente del desarrollo y es líder de la comunidad de seguidores) .

  • En febrero de 1991 publica la versión 1.0
  • En octubre de 2000 publica la versión 2.0 con soporte a caracteres Unicode, entre otros aspectos importantes.
  • En diciembre de 2008 sale la versión 3 o Python 3K la cual es incompatible con las versiones anteriores (os advierto no creaís a pie juntillas dicha aseveración, aprendamos y con el tiempo sopesaréis por vosotros mismos).

Diferencias entre la versión 2 y la versión 3.

Actualizado el viernes 26 de mayo de 2017.

Las versiones 3 en adelante vinieron a suplir una serie de necesidades del mundo actual. Si bien del del 2008 al 2016 han transcurrido más de 8 años -y ese tiempo en computación es una eternidad– y teniendo en cuenta que el único cambio que nos gusta a los seres humanos es el cambio de pañal, aún hoy en día no se ha podido migrar completamente todas las utilerías populares en Python. A grosso modo existen unas 360 y se han migrado unas 339, así que el progreso es de 94% pero ¡ojo! ésas son las librerías más usadas no necesariamente quiere decir que lo que ya estaba escrito migre automáticamente y esto debido a que hay serias incompatibilidades entre las versions 2 y 3.

La estrategia de migración de los desarrolladores de Python ha sido muy acertada: en julio del año 2010 (dos años después de haber lanzado la versión 3.0) emitieron una versión que marca un punto de inflexión en las versiones 2.x, la versión 2.7.0 (al momento de escribir estas líneas vamos por la versión 2.7.13).

El objetivo es que para el año 2020 se dejarán, esta vez definitivamente, de dar soporte y actualizaciones a todas las versiones 2.x y en estos tres años que faltan ir dando la oportunidad de que las aplicaciones escritas migren a la versión 3.x -“lo único constante es el cambio” así reza el refrán popular-.

De hecho nosotros aún tenemos instalada la versión 2.7.12 junto con la 3.5.2 (y Debian 8.8 aún trae ambas versiones, la 2.7.9 y la 3.4.2) debido a que colaboramos con algunos proyectos que están en versión 2.7.x: nuestra recomendación, de plano, si vais a comenzar un proyecto nuevo en Python es hacerlo de una vez en la última versión. Si por el contrario mantenéis alguna aplicación, pues ir migrando poco a poco teniendo en cuenta las principales diferencias, por nombrar solo algunas:

  • Print: en la versión 2.x es un comando y en la versión 3.x es una función, por lo que hay que escribirla entre paréntesis. Una ventaja de la nueva versión es que tiene soporte para caracteres Unicode por lo que ya no es necesario anteceder la letra “u” antes de lo que queremos imprimir para indicarle que lo haga en Unicode. Agregad solamente los paréntesis que aún la letra “u” la sigue soportando y no genera problema (lo probamos con la versión 3.5.2).
  • Otras funciones que ahora necesitan paréntesis: tales como, sin mencionar todas, exec, raise, except, (pueden necesitar, además de los apréntesis, cambios en la sintaxis).
  • División con enteros: esto de los tipos de variable es un poco largo de explicar pero fundamentalmente al dividir dos números enteros el resutlado es un número entero, para que conserve el mismo comportamiento en vuestros programas debeis sustituir “/” por “//“. En otros lenguajes para hacer una división que solo devuelva el cociente se utiliza la barra invertida “\” pero por la fuerte tendencia del lenguaje C en Python, dicho caracter tiene un comportamiento totalmente diferente ya que solo trabaja con caracteres, no con valores numéricos. Si se desea utilizar dichos operadores “//”” en Python 2 primero debemos declarar lo siguiente: from __future__ import division.

La transición de Python 2 a Python 3 es muchísimo más profunda de lo que expresamos aquí pero nuestra intención es colocarla como simple referencia en vuestras mentes, después del año 2020 solo Python 3, esperemos a ver.

Instalación de Python en nuestro ordenador.

Instalar Python en nuestro ordenador pasa por ejecutar en una ventana terminal, con los derechos suficientes, los siguientes comandos:

sudo apt-get update
sudo apt-get install python3
  • La primera línea actualiza nuestros repositorio de aplicaciones contra el respositorio remoto seleccionado, ya sea Debian o algún GNU/Linux derivado: Ubuntu, Canaima, Linex, etc.
  • La segunda línea descarga e instala en sí al Python3. Si queréis tener instalada también la versión 2 simplemente escribidlo sin el número tres. Podéis tener ambas instaladas pero debéis invocarlos (por supuesto) de diferente manera, ¿problema? ni tanto excepto si queréis ejecutar guiones -scripts- automatizados y allí si que cuenta cómo hayaís programado: para la versión 2.X o 3.X. Ojito pues, con esto.
  • Para instalarlo en otros sistemas operativos, acudíd al enlace web donde catalogan las descargas; hay múltiples versiones, escoged la adecuada. Recordad que lo que programemos os servirá en múltiples plataformas con mínimos cambios necesarios debido al hardware, más que todo, es el que hace la diferencia.

¿Para qué sirve el lenguaje Python?

Pregunta obvia, podemos ponerlo en contexto con unos cuantos ejemplos:

  • El lenguaje de marcado HTML sirve para realizar páginas web como esta que vosotros estáis leyendo, formato de títulos, párrafos, etc.
  • El lenguaje PHP sirve para generar páginas web dinámicas, incluso buscando contenido en bases de datos MySQL, PostgreSQL o MariaDB: es el caso de WordPress, la herramienta que permite la existencia de este nuestro humilde blog.
  • Mientras que los dos anteriores se ejecutan en el servidor web, el lenguaje JavaScript se ejecuta en vuestras computadoras, es decir, del lado del cliente, para ciertas funciones locales, como el tipo de navegador web e incluso sistema operativo.
  • Otros lenguajes especializados como el Pascal se especializan en tratamiento de números en el campo de las matemáticas, por eso tienen su nicho, por ejemplo, en las facultades de ingeniería, donde lo conocimos y aprendimos.
  • Existe el lenguaje C y sus variantes (C++, C#, etcétera) los cuales con sus seguidores y detractores (Linus Torvalds ama C y odia C#) siempre se ubican en el desarrollo de sistemas operativos como GNU/Linux. El lenguaje C poco le sobra por encima del lenguaje ASSEMBLER el cual es utilizado por el firmware de dispositivos primitivos -poca potencia de cálculo- y que no se pueden dar el lujo de programarlos con un lenguaje de alto nivel (el que podemos entender nosotros los humanos). El lenguaje C es, por tanto, considerado el padre de los demás lenguajes y marca un hito de separación entre la máquina y los humanos, pero no quiere decir que sea fácil de aprender, se dice que con el lenguaje C hay que “reinventar la rueda” cada vez que se inicia un proyecto de software. Para evitar esto pues C++ y C# tienen integradas sus propias librerías y asistentes que facilitan enormemente la tarea, aunque aún sigue siendo una tarea larga y a veces compleja.
  • Pues bien, he aquí que el Python nace con la potencia del lenguaje C pero con múltiples módulos escritos por sus seguidores bajo la filosofía de software libre (su licencia de uso ha cambiado a lo largo de los años) los cuales están así al alcance de todos nosotros para realizar numerosas tareas en diversos sistemas operativos, con la sencillez de un archivo de procesos por lotes; pero tal vez sea esto lo que hace la falsa impresión a sus detractores: subestiman al lenguaje python dada su sencillez.

Así que vamos a numerar las ventajas que posee el lenguaje Python (de sus desventajas hablaremos en otra entrada, en su oportunidad):

  1. Aparte de sus funciones integradas, nativas, hay una enorme variedad de programas que funcionan como módulos, esto es posible porque con el tiempo ha alcanzado su masa críticas de usuarios.
  2. Es rápido y en unas cuantas líneas fácilmente podemos delegar pequeñas tareas en nuestro sistema operativo. Esto es posible porque lo que escribimos se interpreta y al “correr” el programa se compila a lenguaje de máquina, y al modificarlo de nuevo se vuelve a compilar, lo complejo no lo vemos pero está allí en los archivos .pyc o .pyo
  3. Su entorno de desarrollo (IDE) está escrito para varios sistemas operativos: Unix, GNU/Linux, macOs y otros más.
  4. Es multiparadigma, es decir, no obligan al programador a atarse a un estilo de programación, más sin embargo se deben acatar las buenas prácticas de sintaxis que son muy sencillas pues principalmente se basan en el indentado ya que existen pocas etiquetas y símbolos, en comparación con otros lenguajes.
  5. Es considerado un lenguaje “de pegamento” ya que une rápidamente complejas piezas y situaciones en páginas web, bases de datos y “sockets” de internet.
  6. Python es interactivo: podemos escribir línea por línea y podemos usarlo hasta como una simple calculadora. Dada esta facilidad nosotros comenzaremos este tutorial de esta manera.
  7. Es software libre (más no gratuito: lo que desarrollemos debe llevar la licencia de uso heredada para así, a futuro, forme parte del entorno de desarrollo: un ciclo sin fín que cada día fortalece nuestra filosofía de vida).

El “Zen” de Python.

Por “Zen” se entiende lo que es una forma de meditación (budismo) nacida en la India y perfeccionada y bautizada en Japón con el nombre de “Chan” y que luego se latinizó en Zen. Pues bien el lenguaje Python tiene una base firme en las siguientes líneas que es muy recomendable conocerlas (y analizarlas) antes de siquiera escribir nuestra primera línea de código:

  1. Hermoso es mejor que feo.
  2. Explícito es mejor que implícito.
  3. Simple es mejor que complejo.
  4. Complejo es mejor que complicado.
  5. Plano es mejor que anidado.
  6. Disperso es mejor que denso.
  7. La legibilidad cuenta.
  8. Los casos especiales no son suficientemente especiales como para romper las reglas.
  9. Aunque de hecho está lo pragmático, gana a la pureza.
  10. Los errores nunca deberían dejarse pasar silenciosamente.
  11. A menos que se silencien explícitamente.
  12. Cuando te enfrentes a la ambigüedad, rechaza la tentación de adivinar.
  13. Debería haber una — y preferiblemente sólo una — manera obvia de hacerlo.
  14. Aunque puede que no sea obvia a primera vista a menos que seas holandés. (NT: Guido van Rossum es holandés)
  15. Ahora es mejor que nunca.
  16. Aunque muchas veces nunca es mejor que *ahora mismo*.
  17. Si la implementación es difícil de explicar, es una mala idea.
  18. Si la implementación es sencilla de explicar, puede que sea una buena idea.
  19. Los espacios de nombres son una gran idea — ¡tengamos más ideas como esas!

En realidad este Zen es la norma número 20 de las Propuestas de Mejora de Python, mejor conocidas en idioma inglés como “Python Enhancement Proposals” o PEP’s. Esta que presentamos es la famosa PEP20 (todas están en este enlace web).

Podemos decir que las PEP son como artículos de una Constitución y cada una de ellas tocan temas tales como, por ejemplo, “Guía de Estilo para el lenguaje C” (Nº 7) y “Guía de Estilo para lenguaje Python” (Nº 8) -tal como dijimos, está Python fuertemente influenciado por el lenguaje C-. Cuando estemos muy avanzados en programación y tengamos alguna influencia en la comunidad desarrolladora de software tal vez tengamos que leer alguna de ellas, ya sea para definir el rumbo de un proyecto o incluso para dirimir alguna diferencia con nuestros colegas compañeros de trabajo: allí están las “leyes” para ello.

Casos exitosos con lenguaje Python.

Una lista completa la podéis hallar en este enlace, no obstante nombraremos algunos casos que nos llaman la atención:

  • “Industrial Light & Magic” empresa especializada en gráficos computarizados para estudios de cine, ha creado “efectos especiales” en películas famosas y/o taquilleras.
  • “D-Link” en Australia utiliza Python para actualizar los “firmwares” en sus enrutadores alámbricos e inalámbricos que no pueden iniciar por sí mismos, lo cual aumentó su productividad en un 800% contra el método anterior utilizado.
  • El laboratorio Astra-Zeneca usa Python para el trabajo colaborativo en el descubrimiento de nuevos principios químicos activos en los medicamentos.
  • Fuera del campo de la Python.org existe un grupo de astrofísicos denominados “Enanas Marrones en la ciudad de Nueva York” (Dwarf Brown in New York City –DBCNY-) que mantienen una sección especial para publicar sus programas hechos en este lenguaje, ¡asombroso!
  • Y son muchos casos más, pero uno que NO nombran allí es el caso de FreeCAD que lo utilizamos para diseño de piezas, arquitectura e incluso mecanismos; dicho lenguaje está implementado de manera nativa, si desean revisen nuestro artículo sobre FreeCAD publicado no hace mucho tiempo.

Por último lo hacemos notar: las nuevas generaciones gustan de aprender el lenguaje Python, para muestra un botón (gracias al sr. “Tauceti” de @Conatel por la foto).

 

“¡Hola mundo!” con lenguaje python.

Modo interactivo.

Comenzaremos por invocar el intérprete de comandos que nos permitirá trabajar de manera interactiva con Python. Comenzaremos por abrir una ventana terminal (si usted no sabe cómo, puede estudiar primero nuestro tutorial sobre “bash” o línea de comandos). Debemos hacer la salvedad de que debemos escribir simplemente el comando “python3” para que nos ejecute la última versión que tengamos instalada. De no ser así por favor revise de nuevo arriba donde describimos cómo instalar Python en nuestros ordenadores.

Una vez que introduzcamos el comando y presionar la tecla Intro o Enter veremos el entorno interactivo del que tanto hemos hablado (y dado loas). Apreciamos entonces la versión que tenemos, así como unos comandos adicionales para mayor información. Lo que no nos dice es que para volver a la línea de comandos shell: debemos escribir “quit()” y presionar la tecla Intro o Enter. De ahora en adelante damos por sentado que cuando nos referimos a introducir un comando con o sin opciones adicionales, debemos presionar la tecla Intro o Enter.

python3 quit()
python3 quit()

Ya aprendimos el comando, pero para mayor velocidad con el teclado recomendadmos utilizar la combinación de teclas CTRL+D (es decir, con la mano derecha presionamos y mantenemos presionada la tecla control del lado derecho MIENTRAS con la mano izquierda presionamos una sola vez la letra “D” -mayúscula o minúscula, no importa- y luego soltamos ambas). Una vez que estemos de nuevo en la línea de comandos shell podemos verificar de nuevo  cual versión de Python tenemos instalado, para lo ello debemos ingresar el siguiente comando, tal cual:

python3 --version

En el ambiente GNU/Linux se acostumbra “pasar” los opciones de comando con dos guiones más una palabra clave única, en este caso “–version“, ésta es la versión larga, la que consideramos nemotécnica (evidentemente en este caso en inglés coincide con nuestro idioma castellano… O CASI ¡porque le falta el acento!). Para rematar esta idea, que en realidad son dos, acotamos lo siguiente:

  • Las opciones “cortas” de los comandos de terminal (fuera del interpréte interactivo) solo llevan un guión y 1, 2 ó 3 letras como máximo haciendo hincapié en que se distingue de mayúsculas y minúsculas. Por ello, si queremos saber la versión del Python que tenemos con la opción corta debemos escribir “Python -V” ya que si utilizamos “-v” lo que veremos son todos los módulos que tenemos instalados, y la lista es larga. Probad y volved por favor 😉 .
  • La otra idea, ya que hablamos de minúsculas y mayúsculas, debemos tocar el tema de nuestro idioma, en particular la letra “ñ” y los acentos graves (y en francés e italiano los acentos agudos). Ya en una entrada anterior explicamos como lidiar con ellos en el lenguaje HTML y allá es bastante más complicado que acá en Python.

Lo que debemos hacer en nuestros archivos con nuestras líneas de programación para que soporten todos los lenguajes a nivel mundial (UNICODE) es colocar la siguiente línea al principio de cada fichero:

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

Recordad que os hablamos en párrafos anteriores acerca de las PEP: en este caso es la PEP263 la que especifica y acota el tema. Por supuesto, hay más detalles al respecto, y para ello podemos leer (en inglés) las recomendaciones de un ingeniero de software, el señor Evan Jones en su blog personal. Pero no os preocupéis, por ahora esto que os explico es más que suficiente para expresar correctemente nuestros mensajes a nuestros usuarios con nuestras aplicaciones escritas en Python.

“¡Hola mundo!”

Pues ya estamos casi listos para escribir nuestro primer programa en lenguaje Python. Dijimos que vamos a utilizarlo de manera interactiva para aprender los comandos uno a uno de manera práctica pero primero escribamos uno y lo guardaremos como archivo de texto pero con la extensión .py

Se acostumbra nombrar los archivos con esta extensión para nosotros saber rápidamente qué contiene e incluso algunos sistemas operativos lo utilizan para ejecutar una aplicación que es capaz de leer y mostrar dicho archivo. Luego veremos que en GNU/Linux esto no es necesariamente así, esperad por favor.

Vamos entonces a usar nuestro editor de texto favorito y escribamos estas líneas y guardemos el archivo con el nombre “que_hubo_mundo.py”:

# -*- coding: utf-8 -*-
def hola():
  print('¡Qué hubo mundo!')
hola()
  • La primera línea declara que vamos a trabajar con UTF8 para soportar caracteres de lenguajes humanos a nivel mundial.
  • La segunda línea DEFine una función, la cual no necesita argumento o parámetro seguido de “:” lo cual indica que las líneas que vienen pertenecen a la función declarada.
  • Debemos indentar la tercera línea, con un espacio al menos. Si hubieran más líneas, deberán tambien tener el mismo número de espacios. Tened cuidado con vuestro procesador de texto: no es lo mismo pulsar la tecla TABULADOR (TAB) que presionar la barra espaciadora para ingresar espacios en blanco. Nosotros recomendamos, si el editor de texto lo permite, configurarlo para que cada vez que presionemos TAB nos inserte 3 espacios en blanco (o incluso 2 si os parece).
  • Observad también que la tercera línea tiene un acento, todo este trabajo que hicimos fue no sólamente para que se mostrara correctamente el caracter: es que Python se niega a compilar si no hacemos esto.
  • En este punto os tenemos que confesar algo: esto no es necesario para Python versión 3.X. Esto lo hicimos totalmente a propósito porque consideramos que es importante para propósitos a nivel de sistema operativo y es una de las características que vale la pena conservar de la versión 2.X
  • Con la cuarta línea llamamos la función declarada, la cual tiene la instrucción de imprimir el mensaje deseado.
  • Otra línea que consideramos debe contener todos nuestros archivos en Python es la siguiente especificación:
#!/usr/bin/python3

Esto le indica al sistema operativo, por si quedare alguna duda, con cuál programa abriremos el archivo en cuestión; recordemos el punto 2 de la PEP20: “Explícito es mejor que implícito”.

Nuestro primer archivo quedaría de la siguiente manera:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
def hola():
print('¡Qué hubo mundo!')
hola()

Por último llamamos al archivo con el siguiente comando:

python3 que_hubo_mundo.py

“¡Qué hubo, mundo!” en modo interactivo.

Ya tenemos todas las intrucciones para trabajar en modo interactivo, podemos ahora ejecutar nuestro primer programa en modo interactivo, aquí veréis lo que debemos escribir, (si tenéis algún error revisad los pasos anteriores que describimos en sumo detalle):

¡Qué hubo mundo! en Python interactivo
¡Qué hubo mundo! en Python interactivo

Nota: en la imagen olvidamos escribir “#!usr/bin/python3”, fe de errata.

Trabajando con cadenas de texto en modo interactivo.

Ya vimos rápidamente como declarar una función para imprimir por pantalla un mensaje e nuestros usuarios. Tal vez vamos muy rápido. Por ello veremos cómo trabajar con texto y caracteres y pasamos a considerar varios puntos:

  • Podemos utilizar pares de comillas simples o pares de comillas dobles para encerrar nuestro texto uno que abre y otro que cierra, y si utilizamos ambos pues debemos anidarlos debidamente.
  • En el caso de nuestra habla coloquial (gracias al comediante Joselo que popularizó la contracción de la palabra “para”) no podemos escribir una sola comilla simple sin su correspondiente par.
  • Es entonces que pasamos a considerar los caracteres especiales: deben ser precedidos por una barra “\”, lo cual trae una reminiscencia con el lenguaje C.
  • Como vimos el caracter de numeral o almohadilla “#” es utilizado para indicarle ciertas configuraciones especiales a Python, siempre y cuando estén al inicio del fichero contentivo de instrucciones. Pero también es utilizado para poder colocar comentarios, todo lo que está a la derecha de “#” y hasta el final de la línea es mostrado más no compilado (excepto si están al inicio del archivo, repetimos).

Con la ayuda de la tecla numeral (como mejor la conocemos aquí en América) os publicamos unos cuantos ejemplos comentados y hechos en la cónsola interactiva de Python3:

python3 uso de cadenas de texto
Python3 uso de cadenas de texto.

Para que no se impriman por pantalla la comilla inicial ni la comilla final haremos uso de la función que usamos en nuestro programa que_hubo_mundo.py: la función nativa o integrada print(). Decimos que es nativa porque no es necesario definirla ni llamarla, ya Python “sabe” a que nos referimos con ella. Dicha función, además hace un retorno de carro, es decir, el “cursor” baja una línea y se ubica a la parte izquierda de la línea. Por ello, mediante ejemplos en modo interactivo, aprenderemos en detalle el uso de la función print().

python función print() linea nueva
Python función print() linea nueva.

¿Véis qué bonita quedó la frase de Don Vicente Ignacio Antonio Ramón de Emparan y Orbe? Fue bonita en 1810 y quedó bonita hoy también gracias a la línea nueva que insertamos dentro de la función print(“\n”), el cual es un “caracter de escape”. Debemos hacer la salvedad de que si queremos mostrarle a nuestros usuarios una ruta de archivo o carpeta debemos indicarle a print() que imprima en modo raw “r” para que se muestre correctamente la vía:

print(r'\home\jimmy\python3\nombres')

A lo anterior le decimos “nueva línea” para que se asocie en nuestra memoria con “\n”, pero en realidad se llama retorno de carro, como arriba explicamos. Bien podemos usar tantas nuevas líneas como queramos o bien podemos usar otra figura: el entrecomillado triple por pares:

python entrecomillado triple
Python entrecomillado triple.

Observemos que para prevenir un retorno de carro en cada línea podemos finalizarla con una barra “\” de esta manera incluso aunque escribamos múltiples líneas se mostrará como una sola (por supuesto si usamos varias barras “\”):

python entrecomillado triple con barra al final de cada línea
Python entrecomillado triple con barra al final de cada línea.

Consideraciones al trabajar en modo interactivo.

Para mostraros los ejemplos didácticos hemos cerrado y abierto varias veces el modo interactivo de cónsola, a fin de hacer claro y diáfano el código, valga la redundancia. Más adelante veremos el cómo limpiar la cónsola, lo cual es un poquito avanzado pero por lo pronto recopilaremos algunos detalles para ahorrarnos trabajo en el teclado.

  • Con tecla FLECHA ARRIBA del teclado podemos ver la última línea introducida.
  • Si seguimos pulsando flecha arriba podremos ver las líneas anteriores, con la flecha abajo podremos a volver a nuestra posición original hasta alcanzar una línea en blanco, osea la línea nueva de comando.
  • El cerrar y abrir no influye para que Python recuerde estas líneas, siempre las “recordará”.
  • En general se comporta como la línea de comandos o “shell” en ventana terminal de nuestro sistema operativo GNU/Linux.

Operaciones con cadenas de texto en modo interactivo.

Ya conocemos cómo mostrar nuestros resultados por cónsola, ahora vamos a realizar unas cuantas operaciones con cadenas de texto, ¡preparados y preparadas que esto se pone interesante! -o sería la taza de café que me tomé 😉 -.

Lo que vamos a practicar es el colocar una cadena de texto en una variable y haremos operaciones de concatenado con ella:

python print() uso de coma como separador
Python función print() con uso de coma como separador.

La técnica de indexado de Python nos permitirá practicar nuestra programación, tal vez el ejemplo es tonto pero es ilustrativo de las capacidades de Python, veamos:

  • Cuando almacenamos una cadena de texto en una variable, automáticamente Python le asigna una “posición” en memoria para cada una de sus letras (¿otro parecido con el lenguaje C, qué piensan ustedes?).
  • Debemos tener siempre presente que el primer caracter siempre será el número cero (0), esto es así para la mayoría de las matrices en computación (una cadena de texto es una matriz de una fila por “ene” columnas, es decir, la cantidad de caracteres que contenga)

Podemos hacer una “chuleta” mental con la palabra “murciélago” para ayudarnos a recordar, esto NO es código para Python, es para nosotros los humanos con propósitos educativos:

 +---+---+---+---+---+---+---+---+---+---+
 | m | u | r | c | i | é | l | a | g | o |
 +---+---+---+---+---+---+---+---+---+---+
   0   1   2   3   4   5   6   7   8   9
 -10  -9  -8  -7  -6  -5  -4  -3  -2  -1

Recordando lo anterior podemos volver a trabajar con nuestra frase “nagua” y seremos auxiliados por la estructura de programación “mientras que” (while condición :), pongan atención:

python indexado de una cadena de texto
Python indexado de una cadena de texto

Podemos evitar que la palabra quede “en modo vertical” agregando un argumento clave a la función print() llamado end al cual le podemos asignar una cadena none (o nula) o el caracter que deseemos y además nos evita el retorno de carro. La línea cuatro quedaría de la siguiente manera:

>>>  print(texto[k], end='')
>>>  k = k + 1
>>> print()

Pruebenlo en su cónsola interactiva y regresen, por favor. ¿Notaron para qué es la última linea agregada?

Si no incrementaramos la variable auxiliar entraríamos en un ciclo sin fin, lo que comúnmente la gente llama “quedó colgada la computadora“. De una vez vamos trabajando con números como introducción a la siguiente sección pero antes veamos un ejercicio para separar en sílabas esta esdrújula que nos ocupa:

python indexado de texto práctica para separar en sílabas
Python indexado de texto práctica para separar en sílabas

Nota: Si denotamos texto[:3] , es decir , obviamos desde dónde comienza el trozo que queremos, Python asume que desde el principio; y si denomatos texto[8:] asume que es hasta el final de la cadena de texto. Por ello la línea de práctica de la figura quedaría escrita de una manera más elegante (punto #7 de la PEP20) y así “no vemos” el elemento 10, que no existe:

>>> print(texto[:3]+texto[3:6]+texto[6:8]+texto[8:])
murciélago
>>> # Podemos referirnos con índices negativos
...
>>> print(texto[-7]+texto[-6]+texto[-5])
cié

Una cosa es el índice de un elemento y otra cosa muy distinta la función que devuelve un rango de elementos, de hecho existe una función numérica que nos devuelve un rango específico: range() y la utilizaremos en otra sección importante denominada “listas”. Por ahora podemos volver a nuestro ejemplo con la cadena de texto “nagua” para practicar sobre nuestros propios pasos:

python no soporta modificaciones a una variable indexada las listas sí
Python no soporta modificaciones a una variable indexada, las listas sí.

Como vemos la variable completa la podemos sustituir por cualquier otra cadena de texto, pero toda completa, cada uno de los elementos indexados son de “sólo lectura”. Las listas, en cambio, sí que soportan modificaciones de sus elementos pero se deben declarar de manera diferente, antes de pasar a ello terminemos primero de aprender sobre los números en Python.

Trabajando con números en modo interactivo.

Con Python podemos hacer operaciones matemáticas dignas del quinto grado de educación primaria: sumas, restas, multiplicaciones y divisiones (exactas, inexactas, cociente y resto), mirad el ejemplo práctico, pensamos no necesita mayores explicaciones que las mínimas necesarias:

python operaciones numéricas (incluyen uso de variables) en modo interactivo
Python operaciones numéricas (incluyen uso de variables) en modo interactivo

Otra operación numéricas BÁSICAS, es decir,  soportadas sin llamar ninguna librería o modulo es la potenciación:

>>> 7 ** 2 # Area de un cuadrado de 7 unidades de lado.
49
>>> 2**10  # Dos elevado a la décima potencia
1024

Trabajando con listas en modo interactivo.

Las listas se diferencian de los indexados en dos aspectos: como se declaran y que es posible no solo modificar su contenido, sino también agregar o quitar elementos. Otra ventaja es poder formar listas anidadas, pero veamos unos ejemplos prácticos por cónsola:

python listas en modo interactivo visualización con ciclo for~in: y print()
Python listas en modo interactivo visualización con ciclo for~in: y print()

En esta imagen presentamos un nuevo elemento de programación: el ciclo for. Dicho ciclo sustituye al que aprendimos primero, el ciclo while que necesita una instrucción o evento para poder salir del mismo. En cambio el ciclo for recorre la lista automáticamente, uno a uno, cada uno de los elementos (recordar que cada lista tiene implícito sus índices numéricos) esto nos ahorra el uso de una variable numérica auxiliar que usamos en el ciclo while.

Sin embargo, si queremos imprimir solamente los elementos 1 y 2 sí que debemos usar una variable numérica auxiliar con la función range() que avizoramos en la sección de elementos indexados -cadenas de texto-. Lo que debemos escribir es lo siguiente:

>>> for k in range(1,3): # Utilizamos un ciclo 'for' con 'range'
...  print(ciudades[k], end=",")
... 
Maturín,Cumaná,>>> print()
>>>

Observen el último print() y que labor cumple, pronto lo revisaremos de nuevo. Otro elemento que volvimos a utilizar es el argumento especial end=”,” para la función print() la cual omite el retorno de carro e inserta el caracter que le asignemos entre comillas por medio del símbolo de igualdad. En este caso es una coma, así la lista  impresa termine en una coma sin ningún otro elemento (esto es así para que tengamos en mente el concepto de los delimitadores: por ejemplo los archivos CSV “Comma Separated Values”)

Analizemos este código, mejorado, de la última imagen -captura de pantalla- de la cónsola interactiva de Python:

python ciclo for con else
python ciclo for con else

En seguida aprendemos que podemos agregar elementos a la lista mediante el comando .append(elemento) tantas veces como necesitemos. También el ciclo for recibe los datos de la función range: serían 3, 4, 5 y 6 pero ¡un momento! si le metemos seis como índice a la lista nos dará error, ya que va de solamente va de 0 a 5 ¿y el 6? Pues el seis si que se ejecuta por medio del comando else el cual nos permite imprimir un retorno de carro al final de la lista -de nuevo repetimos que finaliza cada línea impresa sin retorno de carro más coma por el argumento end de la función print()-.

Para no perder el hilo de aprendizaje seguimos agregando ciudades de Venezuela a la lista, pero con una variante: hemos nombrado solamente capitales de estado (y de municipio, implícitamente) pero ahora vamos a agregar otras ciudades del estado Carabobo, capitales de municipio. El chiste del asunto es que queremos esas tres ciudades (Valencia, Naguanagua y San Diego) “aparte” dentro de la lista de capitales de estado. Aprendamos a hacer eso:

python listas sublistas y elementos indexados
python listas sublistas y elementos indexados

Como pueden ver, una lista puede estar contenida otra lista (si os gusta utilizad el término sublista) y podemos nombrar con un segundo índice (juntos pero separados por paréntesis rectos o corchetes) a la ciudad deseada, pero ¿Qué pasa si un elemento con contiene una sublista? Aquí es cuando muchos programadores se frustran por la respuesta que da Python: muchos esperarían un error (no existe) sin embargo devuelve el elemento en sí de manera indexada y ya sabemos lo que esto significa, su contenido es de solo lectura, algo contradictorio proque estamos trabajando con listas. Abran su mente a Python y mantenganse siempre alerta y receptivos.

El ciclo condicional y los comandos de interrupción y continuación.

Ya está en nuestra mente el concepto de else para el ciclo for y ahora vamos a ver el ciclo condicional. Como era de esperarse, el condicional corresponde a la palabra “if” en inglés, seguido de una condición a evaluar, que de ser cierta ejecutara una serie de órdenes perfectamente indentadas y si la condición no se cumple ejecutara otra serie de órdenes, también perfectamente indentadas. Para ello haremos un muy sencillo ejemplo que ilustra lo aquí expresado:

python ciclo condicional if else
python ciclo condicional if else

OJO aquí nos volvimos repetitivos y la idea es escribir menos código, no más, si tenemos varios pares de números que comparar no vamos a estar repitiendo y repitiendo la estructura. Para ello usaremos las funciones a fondo en una próxima entrada, pero no teman, ya en nuestro programa que_hubo_mundo.py definimos una pequeña función, así que ya hemos adelantado (ver inicio de este artículo).

Por lo pronto vamos a escribir un ciclo for asumiendo que conocemos el número de pares de cifras que vamos a comparar y conoceremos una nueva función nativa: input(), que como podréis imaginar acepta los número que ingresemos por nuestro teclado y los asigna a una variable. Además, como trabajamos con números necesitaremos la función int() que convierte los caracteres ingresados a números enteros. Veamos:

python condicional if else con input() para comparar varios pares de números
python condicional if else con input() para comparar varios pares de números

A estas alturas hemos de comprobar que ya se queda corto el modo interactivo para nuestros propósitos: el más mínimo error y hay que comenzar de nuevo la estructura. Por ello a aprtir de la próxima entrada (funciones del usuario, osea, nosotros, ¡EJEM! programadores) volveremos a como empezamos: escribiendo en un editor de texto. Nosotros preferimos gedit pero usad el que más os parezca sencillo y accesible. Como tarea os dejamos un ejemplo tomado de la propia página web tutorial de Python y que sirve para hallar números primos y combina varias cosas que hemos aprendido, NOTAD los espacios indentados, trascribidlo a vuestra cónsola y probadlo, por favor:

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         # loop fell through without finding a factor
...         print(n, 'is a prime number')
...

<Eso es todo, por ahora>.

Fuentes consultadas.

Enlaces web en idioma inglés:

Enlaces web en idioma castellano:

python-easy-ftp-sync

Introducción.

El objetivo de escribir python-easy-ftp-sync persigue como fin último la creación de un programa por línea de comandos escrito en lenguaje Python versión 3.4.3 para sincronizar dos carpetas (y sus subcarpetas) por medio de FTP (File Transfer Protocol), así de sencillo, por ello lo de parte del nombre “easy” (fácil -o tranquilo- en idioma inglés). Por supuesto que no vamos a descubrir el agua tibia, antes que nosotros muchos autores han escrito sobre el tema, y lo grandioso del software libre -y la ciencia moderna en sí misma- es que no tenemos que partir desde cero (aunque sería un muy buen ejercicio) sino que podemos estudiar esos trabajos anteriores y sobre ellos construir nuestra herramienta.

Antecedentes.

Hemos incluido para su estudio los más variopintos proyectos, e incluso algunas preguntas con propuestas incluídas. También hemos descartado muchísima información que consideramos no conducen a nada relevante, así que se preguntarán ¿qué hace eso publicado en internet? Las razones son dos, al menos:

  1. “O inventamos o erramos”: evidentemente errar es lo más común, y aunque parecen inútiles esos datos (inútil no es igual que irrelevante) igual nos aporta información sobre por donde no encaminar nuestros pasos.
  2. Los buscadores o arañas web (insultando la inteligencia salvaje de las arañas) van por ahí recolectando y guardando bytes, y toman todo sin mayor discriminación, por ello podemos nosotros acceder a esos resultados fallidos. Las arañas, por otra parte, tejen su red, trepan por sus hilos y allí cae todo tipo de presa, pero ellas saben cuál víctima comer y cual bocado soltar y desechar y luego reparar su propia telaraña para alimentar sus crías y tener descendencia evolucionada; ¡menuda diferencia!

 

Fuentes consultadas.

Enlaces web en idioma castellano:

Enlaces web en idioma inglés:

SENIAT glosario tributario

SENIAT glosario tributario.

SENIAT glosario tributario.

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

Impuesto progresivo:

Impuesto progresivo

Impuesto progresivo: Se entiende como tal, el impuesto cuya tarifa, determinada conforme a una escala establecida por la Ley, la cual va en aumentando a medida que van creciendo los ingresos gravables del sujeto pasivo.

 

Impuesto proporcional:

Impuesto proporcional
Impuesto proporcional:
Es aquel impuesto determinado, mediante la aplicación de un porcentaje fijo, es decir que
no varía en relación con la base imponible, de acuerdo con lo establecido en la Ley que lo regula.

Impresora fiscal:

Impresora fiscal
Impresora fiscal: Unidad que tiene los elementos propios de una máquina fiscal, con la excepción de no poseer un dispositivo integrado para la introducción de las operaciones de venta.

Imprentas autorizadas:

Imprentas autorizadas
Imprentas autorizadas:
Son las personas naturales constituidas bajo la figura de sociedades cooperativas y las sociedades mercantiles, domiciliadas en el país, cuya actividad principal sea la elaboración de facturas y otros documentos regulados por la Administración Aduanera y Tributaria, en virtud de la autorización otorgada por ésta.

 

GacetaOficial N° 38.458 (sumario)

Ley Orgánica de Identificación

Introducción.

Lo hemos comentado en varias entradas anteriores: nosotros los progamadores no podemos ir así al garete, ignorando las leyes como si nada. Es peligroso. No lo recomendamos. Por eso es que hoy les traemos nuestra “Ley Orgánica de Identificación”, pilar fundamental que permite identificar unívocamente a nosotros los seres humanos con todo el sistema legal -y por ende informático- de nuestra República Bolivariana.

Antecedentes.

Ya en nuestra Constitución se hace referencia a nuestro derecho a tener nuestra identidad propia, y al respeto a los derechos de los demás compatriotas, por eso arrancamos con el artículo 21:

  • Constitución Nacional, artículo 21: “Todas las personas somos iguales ante la ley; …” (de hecho, el artículo 34 de esta ley especifica taxativamente que el venezolano o venezolana poseedor o poseedora de un pasaporte diplómatico o de servicio no otorga privilegio alguno en territorio nacional).
  • Constitución Nacional, artículo 28: “Toda persona tiene el derecho de acceder a la información y a los datos que sobre sí misma o sobre sus bienes consten en registros oficiales o privados, con las excepciones que establezca la ley, …”.
  • Constitución Nacional, artículo 56: “Toda persona tiene derecho a un nombre propio, al apellido del padre y al de la madre, y a conocer la identidad de los mismos. El Estado garantizará el derecho a investigar la maternidad y la paternidad.

    Toda persona tienen derecho a ser inscrita gratuitamente en el registro civil después de su nacimiento y a obtener documentos públicos que comprueben su identidad biológica, de conformidad con la ley. Éstos no contendrán mención alguna que califique la filiación.”

Y es así que nos detenemos en dicho artículo 56, donde observamos de dónde viene la costumbre de que tengamos dos apellidos: primero el de nuestro padre (biológico o adoptivo) y luego el de nuestra madre, de igual manera. Parece una cuestión baladí pero nosotros llevamos esto así desde la existencia del Imperio Romano, para evitar que cualquier funcionario haga de su libre albedrío, pues no, que para eso existe la ley. Y cualquiera podrá refutar “ah, es que en otros países te puedes llamar como quieras y  como te de la gana” y allí es que hacemos la observación que eso en realidad depende de un juez que te lo apruebe; y que está mal visto por esas sociedades que nosotros tengamos “nombres largos” -lo cual a nuestro parecer evita o mitiga confusiones de identidad a lo largo de los años y generaciones-. Y ni hablar de las mujeres, que aquí toman el apellido del esposo (con el consabido “de”) o peor aún en otros países, cuando eliminan totalmente su apellido y usan el de su esposo como si fueran hermanos (aberrante a nuestro parecer).

Para evitar esto, y muchas otras cosas más, de nuevo debemos ver y leer nuestra “Ley Orgánica de identidad”.

Promulgación.

La “Ley Orgánica de Identificación” entró en vigencia al ser publicada en Gaceta Oficial de la República Bolivariana de Venezuela el día miércoles 14 de junio de 2006 en el ejemplar ordinario N° 38.458.

Explícitamente deroga el anterior Decreto N° 1.454 con Fuerza de Ley Orgánica de Identificación,  publicado en Gaceta Oficial de la República Bolivariana de Venezuela Nº 37.320, de fecha jueves 08 de noviembre del año 2001. Asimismo hace la salvedad de que hasta tanto no se legisle sobre el Reglamento correspondiente, seguirá vigente el Reglamento Parcial de la Ley Orgánica de Identificación, para la identificación de los indígenas, creado mediante decreto Nº 2.686, publicado en Gaceta Oficial de la República
Bolivariana de Venezuela Nº 37.817, de fecha 13 de noviembre de 2003.

Entes encargados de su ejecútese.

El principal ente encargado de la aplicación, registro y observación, ni para más ni para menos, es el Poder Electoral a través del “Consejo Nacional Electoral” quienes mantienen en línea el documento, en formato pdf, con la ley íntegramente publicada. No obstante, nosotros apostamos por su divulgación publicando un “espejo”, dado que incluso contempla penas de prisión a quienes no observaren debidamente al pie de la letra las intenciones de los legisladores electos por nosotros, el pueblo de Venezuela. En la sección anterior tenéis los enlaces a la página web del Tribunal Supremo de Justicia, donde publican también en formato gif con calidad fotográfica los ejemplares de las gacetas, “gacetas certificadas” de facto.


LA ASAMBLEA NACIONAL

DE LA REPÚBLICA BOLIVARIANA DE VENEZUELA

DECRETA

la siguiente,

LEY ORGÁNICA DE IDENTIFICACIÓN

Capítulo I

Disposiciones Generales

Objeto

Artículo 1.

La presente Ley tiene por objeto regular y garantizar la identificación de todos los venezolanos y venezolanas que se encuentren dentro y fuera del territorio nacional, de conformidad con lo establecido en la Constitución de la República Bolivariana de Venezuela.

Definición de Identificación

Artículo 2.

Se endiente por identificación, el conjunto de datos básicos que individualizan y diferencian a una persona con respecto a otros individuos y que sirve de fuente de información para su reconocimiento.

Medios de identificación

Artículo 3.

A los efectos de esta Ley, se entenderá por medios de identificación: la partida de nacimiento, cédula de identidad y pasaporte.

Implantación de Tecnología

Artículo 4.

El Estado garantizará la incorporación de tecnologías que permitan desarrollar un sistema de identificación seguro, eficiente y coordinado con los órganos del Poder Público.
El Ejecutivo Nacional por órgano del ministerio con competencia en materia de identificación de los habitantes de la República, vigilará el mantenimiento y la actualización permanente y progresiva del sistema de identificación, con el objeto de lograr un sistema de avanzada tecnología, que facilite a la ciudadanía el acceso a los servicios públicos, el intercambio de información y el apoyo a las funciones de los órganos del Estado.

Capítulo II

De la identificación de los ciudadanos y ciudadanas

Derechos

Artículo 5.

Los venezolanos y venezolanas desde el momento de su nacimiento tienen derecho a  poseer un medio de identificación otorgado por el Estado a través del organismo competente. El Estado otorgará un medio de identificación a los venezolanos y a las venezolanas por naturalización o a los extranjeros o las extranjeras que obtengan una visa o condición de permanencia, que lo autorice para permanecer en el país, por un término de uno o más años. Su otorgamiento estará limitado sólo por las disposiciones previstas en la Ley.

Identificación de venezolanos y venezolanas

Artículo 6.

La identificación de todos los venezolanos y venezolanas, menores de nueve años  de  edad,  se  hará  mediante  la  presentación  de  su  partida  de  nacimiento.  Cumplidos los nueve años de edad, se le otorgará la cédula de identidad sin más limitaciones que las establecidas en esta Ley.
Los niños, niñas y adolescentes tendrán derecho a tramitar el otorgamiento de una cédula de  identidad  u  otro  documento  de  identificación  de  forma  gratuita,  en  los  casos  de
expedición,  pérdida,  deterioro  o  cualquier  otra  modificación  de  los  elementos  de identificación.

Identificación de extranjeros o extranjeras

Artículo  7.

Los  extranjeros  y  extranjeras  se  identificarán  mediante  su  pasaporte,  sin embargo, aquellos  que  sean  titulares  de  una  visa  o  condición  de  permanencia  en  el  país, correspondientes a las categorías Migrante Temporal o Migrante Permanente, que establece la Ley de Extranjería y Migración, y su Reglamento, están obligados a solicitar y el  Estado  otorgarles,  su  cédula  de  identidad, previo  el  cumplimiento de los  requisitos exigidos por la Ley.
Los  miembros  del  personal  de  las  misiones  diplomáticas  y  consulares acreditados  en  el país, se identificarán conforme a las normas legales respectivas y las prácticas internacionales.

Elementos de la identificación

Artículo 8.

Son elementos básicos de la identificación de los ciudadanos y ciudadanas: sus nombres, apellidos,  sexo,  fecha  de  nacimiento,  lugar  de  nacimiento,  los  dibujos  de  sus crestas dactilares y cualquier otro medio de identificación.

Órganos competentes para expedir documentos de identificación

Artículo  9.

Órganos  competentes  para  expedir  documentos  de  identificación.  Los órganos competentes para expedir documentos de identificación son los siguientes:

  1. El Consejo Nacional Electoral, por órgano de la Comisión de Registro Civil y Electoral.
  2. El Ejecutivo Nacional por órgano del Ministerio con competencia en materia de identificación de los habitantes de la República, y sus dependencias destinadas para tal fin.
  3. Las alcaldías, conforme a las atribuciones que les asigne el Consejo Nacional Electoral, por órgano de la Comisión de Registro Civil y Electoral.
  4. El Servicio de Identificación Indígena.
  5. El ministerio con competencia en relaciones exteriores.

Tramitación y otorgamiento

Artículo 10.

La materia de identificación es de orden público, su tramitación y otorgamiento será de carácter personalísimo. A tal efecto, el ministerio con competencia en materia de identificación de los habitantes de la República, a través de la unidad administrativa correspondiente, no podrá tramitar documentos de identificación, sin la presencia de su titular.

Capítulo III

De la identificación indígena

Del otorgamiento de los documentos de identificación a los indígenas

Artículo 11.

El Ejecutivo Nacional, por órgano del ministerio con competencia en materia de identificación de los habitantes de la República, tomando en cuenta la organización sociocultural de los diferentes pueblos y comunidades indígenas, garantizará la obtención de la cédula de identidad a los indígenas bajo los principios de simplicidad, gratuidad, transparencia, igualdad, celeridad, responsabilidad social, publicidad, no discriminación y eficacia. En el caso de expedición de pasaporte, éste deberá estar exento de pago alguno para su emisión.

Inscripción en el Registro Civil de niños, niñas y adolescentes indígenas

Artículo 12.

Los niños, niñas y adolescentes indígenas serán inscritos ante el Registro Civil por sus padres, sus representantes o responsables. En caso que el niño, niña o adolescente indígena no hubiere nacido en una institución hospitalaria, el presentante podrá realizar la inscripción en el Registro Civil prescindiendo del certificado de nacimiento expedido por los centros hospitalarios, pero deberá realizar la inscripción conjuntamente con dos testigos mayores de edad y miembros de la comunidad indígena a la cual representen, indicando expresamente lugar de nacimiento, hora, día, año y cualquier otra circunstancia relevante a los fines de la inscripción.

Inscripciones de mayores de edad indígena

Artículo 13.

Los indígenas mayores de edad, serán inscritos en el Registro Civil, a solicitud del interesado, quien se hará acompañar en el acto de presentación con la autoridad legítima o la persona que según los usos y costumbres represente a el pueblo o comunidad indígena a la cual pertenezca y dos miembros de la misma, quienes como testigos del acto darán fe de la filiación declarada, indicando expresamente lugar de nacimiento, hora, día, año y cualquier otra circunstancia relevante a los fines de la inscripción.

Respeto a los idiomas y atuendos indígenas

Artículo 14.

Se expedirá la Partida de Nacimiento y la Cédula de Identidad, en el idioma castellano y en el idioma del pueblo o comunidad a la cual corresponda, así como cualquier otro documento de identificación de las personas pertenecientes a los pueblos y comunidades indígenas, respetando los nombres y apellidos propios de sus idiomas. Asimismo, no se les obligará a fotografiarse con una vestimenta distinta a la que corresponde a sus usos, costumbres y tradiciones.

Del servicio de identificación indígena

Artículo 15.

Con el objeto de optimizar el proceso de identificación de la población indígena, el Ejecutivo Nacional, por órgano del ministerio con competencia en materia de identificación de los habitantes de la República, implementara un servicio de identificación con carácter permanente, orientado a facilitar la cedulación masiva de estas comunidades, en coordinación con el órgano competente en materia de registro civil.

Capítulo IV

De la Cédula de Identidad

Definición

Artículo 16.

La Cédula de Identidad constituye el documento principal de identificación, para los actos civiles, mercantiles, administrativos, judiciales y para todos aquellos casos en los cuales su presentación sea exigida por la ley. Su expedición será de carácter gratuito y de uso personal e intransferible.

Número de la Cédula de Identidad

Artículo 17.

El Ejecutivo Nacional, por órgano del ministerio con competencia en materia de identificación de los habitantes de la República, otorgará a cada cédula de identidad que expida un número, que será llevado en serie y se le asignará a cada persona de por vida. Dicho número será inherente a la identificación de la persona titular del mismo.El numero de la cédula de identidad de los venezolanos o venezolanas estará precedido por la letra V, y el de los extranjeros o extranjeras por la letra E.

Excepción

Artículo 18.

Solo podrá asignarse a una misma persona un número de cédula de identidad, que sustituya al asignado originalmente, cuando sea declarada nula la cédula de identidad en los términos establecidos en esta Ley.

Contenido

Artículo 19.

La República Bolivariana de Venezuela, por órgano del ministerio con competencia en materia de identificación de los habitantes de la República, otorgará las cédulas de identidad. Estas contendrán las especificaciones siguientes:

  1. Apellidos y nombres.
  2. Fecha de nacimiento.
  3. Estado Civil.
  4. Fotografía a color.
  5. Firma e impresión dactilar del pulgar derecho de su titular y, en su defecto, del pulgar izquierdo.
  6. Firma del funcionario autorizado.
  7. Numero que se le asigne.
  8. Nacionalidad y término de permanencia autorizada a su titular en el país, cuando se trate de extranjero o extranjera.
  9. En el caso de la cedulación indígena, incluir en la cédula de identidad, el pueblo o comunidad indígena a la cual pertenece.
  10. Fecha de expedición y de vencimiento.
  11. Cualquier otra disposición aprobada por el Ejecutivo Nacional por órgano del ministerio con competencia en materia de identificación de los habitantes de la República, que garantice el otorgamiento de un documento de identificación seguro, eficiente y que facilite la identificación del ciudadano y el ejercicio de sus derechos y garantías constitucionales.

De existir el impedimento para firmar o estampar las impresiones dactilares del titular se hará constar en este documento.

Otorgamiento de la Cédula

Artículo 20.

El Ejecutivo Nacional, por órgano del ministerio con competencia en materia de identificación de los habitantes de la República, otorgará a los venezolanos y venezolanas por nacimiento, la cédula de identidad con la sola presentación de la partida de nacimiento; a los venezolanos y venezolanas por naturalización con la presentación de la Gaceta Oficial de la República Bolivariana de Venezuela, en la cual conste haber adquirido la nacionalidad venezolana y a los extranjeros o extranjeras titulares de la visa o condición de permanencia perteneciente a las categorías migrante temporal o migrante permanente, mediante la presentación del instrumento que acredite su condición en el país, otorgado por la autoridad competente.

Vigencia

Artículo 21.

La cédula de identidad tendrá una vigencia de diez años, contados a partir de la fecha de expedición. En el caso de los extranjeros o extranjeras, la vigencia será determinada por el término establecido en el visado correspondiente.

Renovación

Artículo 22.

Los venezolanos, venezolanas, extranjeros y extranjeras, tendrán derecho a tramitar el otorgamiento de una nueva cédula de identidad, por motivo de vencimiento, pérdida, deterioro, cambio de estado civil o cualquier otra modificación de los elementos de identificación.

Documento Supletorio

Artículo 23.

El otorgamiento de la cédula de identidad a los venezolanos y venezolanas por nacimiento que no posean partida de nacimiento, se realizará con la presentación de la sentencia definitivamente firme del tribunal competente que supla dicho documento, previa inserción en el Registro Civil, salvo los casos previstos en el Capítulo III de esta Ley, relativo a la identificación indígena.

Formación del Expediente

Artículo 24.

Con los documentos requeridos y presentados para la obtención de la cédula de identidad, el ministerio con competencia en materia de identificación de los habitantes de la República, formará un expediente, a los fines de garantizar la veracidad y unificación de la información relativa a la identificación de los ciudadanos y ciudadanas. El mismo reposará en la dependencia que a tal efecto se destinen.

Participación

Artículo 25.

El Ejecutivo Nacional por órgano del ministerio con competencia en materia de identificación de los habitantes de la República, el ministerio con competencia en materia de educación y deportes y el ministerio con competencia en materia de participación popular y desarrollo social, promoverá campañas de cedulación con la participación de organizaciones de la sociedad civil, tendientes a facilitar la obtención de los documentos de identificación.
El Poder Electoral, a través de la unidad correspondiente, colaborará en las campañas de cedulación con el fin de garantizar a los ciudadanos y a las ciudadanas el disfrute de los derechos civiles y políticos.

Inhabilitación e insubsistencia del número de la cedula de identidad

Artículo 26.

En los casos de adquisición, pérdida o recuperación de la nacionalidad, los números de cédula de identidad se inhabilitarán de inmediato, no podrán ser asignados a otras personas y serán mantenidos en el archivo del órgano principal de identificación hasta el fallecimiento de la persona titular del mismo, en cuyo caso, el número en cuestión será declarado insubsistente. Igual procedimiento se aplicará a las cédulas de identidad de los extranjeros y extranjeras, a quienes la autoridad competente en materia de extranjería y migración, les revoquen las visas o condición de permanencia en el país. El incumplimiento de esta disposición acarreará la aplicación de sanciones administrativas, civiles y penales.

Declaración de nulidad, inhabilitación e insubsistencia

Artículo 27.

Corresponde al ministerio con competencia en materia de identificación de los habitantes de la República, a través de la dependencia correspondiente, declarar mediante acto administrativo la nulidad de las cédulas de identidad obtenidas con fraude a la ley; la suspensión de las cédulas de identidad de aquellas personas que perdieron la nacionalidad venezolana, así como las pertenecientes a extranjeros o extranjeras, a quienes se les revocó la visa o condición de permanencia en el país, y la insubsistencia de las cédulas de identidad pertenecientes a personas fallecidas. Los números de cédulas de identidad declarados nulos, inhabilitados o insubsistentes, no podrán asignarse a otra persona.
A los fines de la actualización del Registro Electoral Permanente, el ministerio con competencia en materia de identificación de los habitantes de la República, deberá informar en un lapso no mayor de quince días al Consejo Nacional Electoral, de todo acto de declaratoria de nulidad, inhabilitación e insubsistencia de las cédulas de identidad. Dicho lapso comenzará a contarse a partir del día siguiente de aquel en que tenga lugar la notificación o publicación.

Responsabilidades penales

Artículo 28.

En los casos de nulidad de cédula de identidad, el ministerio con competencia en materia de identificación de los habitantes de la República remitirá las actuaciones realizadas al Ministerio Público, a fin de que proceda a la investigación y determinación de las responsabilidades penales a que hubiere lugar.

Capítulo V

Del Pasaporte

El Pasaporte

Artículo 29.

El pasaporte es el documento de identificación de los venezolanos y venezolanas en el extranjero, expedido por el Estado a través del ministerio con competencia en materia de identificación de los habitantes de la República o aquel que por acuerdos, convenios y tratados internacionales suscritos y ratificados por la República Bolivariana de Venezuela, cumpla la misma función.
Los requisitos, características y elementos de identificación serán los establecidos en el Reglamentos de esta Ley y los que se encuentren contenidos en los tratados, acuerdos y convenios internacionales, suscritos y ratificados por la República Bolivariana de Venezuela.

Clasificación

Artículo 30.

Los pasaportes venezolanos se clasifican en: ordinario, diplomático, de servicio, de emergencia, colectivo y provisional.

Pasaporte Ordinario

Artículo 31.

Es el documento de identificación personal que expide el ministerio con competencia en materia de identificación de los habitantes de la República, a los venezolanos y venezolanas que deseen trasladarse al extranjero y que cumplan los requisitos establecidos en el Reglamento de esta Ley. El pasaporte ordinario tendrá una validez de cinco años.

Tramitación en el extranjero

Artículo 32.

En el exterior, el pasaporte ordinario será tramitado por los venezolanos y venezolanas, a través de las secciones consulares de las embajadas y oficinas consulares de la República Bolivariana de Venezuela.
El Reglamento de esta Ley determinará sus características identificatorias, condiciones, requisitos y procedimientos aplicables para su otorgamiento, así como para la inhabilitación y términos de vigencia.

Pasaporte diplomático y de servicio

Artículo 33.

El pasaporte diplomático y de servicios es el documento de identificación en el extranjero que el ministerio con competencia en relaciones exteriores otorga, con el objeto de acreditar la posición oficial o representativa de sus titulares ante las autoridades en el exterior.
El reglamento respectivo determinará los sujetos a quienes se les otorgará, características identificatorias, condiciones, requisitos y procedimientos aplicables para su otorgamiento, así como para la inhabilitación y términos de vigencia.

Sujeción a las disposiciones legales

Artículo 34.

Los pasaportes diplomáticos y de los servicios no comportan privilegios en el territorio nacional a favor de sus titulares, quienes continuarán sometidos a las disposiciones legales en materia aduanera y fiscal y, en general, a todas las normas del procedimiento jurídico que les sean aplicables.

Pasaporte de Emergencia

Artículo 35.

Es el documento de identificación que el ministerio con competencia en materia de identificación de los habitantes de la República expide a los extranjeros y extranjeras, cuyos países no tengan representación diplomática en la República Bolivariana de Venezuela o que no puedan obtenerlo por cualquier otro motivo justificado. El pasaporte de emergencia tendrá un año de validez.
El Reglamento respectivo establecerá los sujetos a quienes se les otorgará, características identificatorias, condiciones, requisitos y procedimientos aplicables para su otorgamiento, así como para la inhabilitación y términos de vigencia.

Pasaporte Colectivo

Artículo 36.

Por motivos culturales, científicos, religiosos, deportivos, y turísticos y otros previstos en tratados y en convenios internacionales, suscritos y ratificados por la República Bolivariana de Venezuela, el ministerio con competencia en materia de identificación de los habitantes de la República, podrá otorgar pasaporte colectivo a grupos organizados, mediante el sistema de listado, válido únicamente para el viaje al cual se refiera.
El Reglamento respectivo establecerá los sujetos a quienes se les otorgará, características identificatorias, condiciones, requisitos y procedimientos aplicables para su otorgamiento, así como para la inhabilitación y términos de vigencia.

Pasaporte Provisional

Artículo 37.

Es el documento de identificación que expide excepcionalmente el ministerio con competencia en materia de identificación de los habitantes de la República, a los ciudadanos y ciudadanas que tengan que viajar al exterior por razones de enfermedad u otras causas debidamente justificadas. Su expedición está sujeta a exención fiscal.
El Reglamento respectivo establecerá los sujetos a quienes se les otorgará, características identificatorias, condiciones, requisitos y procedimientos aplicables para su otorgamiento, así como para la inhabilitación y términos de vigencia.

Relación de Pasaportes

Artículo 38.

El ministerio con competencia en relaciones exteriores llevará un registro de los pasaportes ordinarios, expedidos a los venezolanos y venezolanas en el extranjeros, así como del diplomáticos y de servicio que expida, del cual remitirá mensualmente una relación al ministerio con competencia en materia de identificación de los habitantes de la República, a los fines de la correspondiente anotación en el Registro Nacional de Pasaportes.

Registro Nacional de Pasaportes

Artículo 39.

El ministerio con competencia en materia de identificación de los habitantes de la República llevará el Registro Nacional de Pasaportes, donde se centralizaran los datos relativos a los pasaportes expedidos y renovados, tanto en la República como en el exterior.

Renovación

Artículo 40.

Los venezolanos y las venezolanas tendrán derecho a tramitar el otorgamiento de un nuevo pasaporte, por motivo de vencimiento, perdida, deterioro o cualquier otra modificación de los elementos de identificación.

Capítulo VI

De la supervisión de los documentos de identificación

Supervisión

Artículo 41.

El Consejo Nacional Electoral, a través de la Oficina Nacional de Supervisión de Registro Civil e Identificación, tendrá facultades de supervisión y verificación de la información, suministrada por el ministerio con competencia en materia de identificación de los habitantes de la República, conforme a lo establecido en la Constitución de la República Bolivariana de Venezuela, en la Ley Orgánica del Poder Electoral y el Reglamento de la presente Ley.

Objeto de la Supervisión

Artículo 42.

El Consejo Nacional Electoral, realizará la supervisión de los documentos de identificación, con el objeto de verificar y certificar:

  1. La veracidad de la información contenida en el respectivo expediente.
  2. La correspondencia entre la información contenida en el expediente y la expresada en el documento de identificación.
  3. La conformidad de la expedición u otorgamiento de los documentos de identificación con arreglo a los trámites y procedimientos administrativos correspondientes.

Asimismo, el Consejo Nacional Electoral, podrá, mediante supervisión, determinar la actualidad de la información contenida en los expedientes llevados por el ministerio con competencia en materia de identificación de los habitantes de la República.

Desactualización de la Información Identificatoria

Artículo 43.

En caso que el Consejo Nacional Electoral, determine mediante supervisión, que la información contenida en el expediente se encuentra desactualizada o la misma corresponde a una persona fallecida, notificará al ministerio con competencia en materia de identificación de los habitantes de la República a fin de que éste proceda, según corresponda a:

  1. Corregir la información del expediente y la del documento de identificación.
  2. Declarar la insubsistencia del documento de identificación correspondiente.
  3. Notificar y remitir el resultado de la supervisión al Ministerio Público, para que éste ejerza las acciones judiciales a que haya lugar.

Capítulo VII

De las Sanciones Penales

Otorgamiento irregular de documentos de identificación

Artículo 44.

La persona que, intencionalmente, otorgue o facilite una tarjeta de nacimiento hospitalaria, partida de nacimiento, cédula de identidad, pasaporte o cualquier otro documento de identificación, sin cumplir con los requisitos previamente establecidos en el Reglamento de esta Ley o con trasgresión o prescindencia del procedimiento administrativo correspondiente, será penada con prisión de dos a seis meses.

Documento Falso

Artículo 45.

La persona que intencionalmente haga uso de una tarjeta de nacimiento hospitalaria, partida de nacimiento, cédula de identidad, pasaporte o cualquier otro documento de identificación, cuyos datos sean falsos o estén adulterados, de modo que pueda resultar perjuicio al público o a los particulares, será penada con prisión de uno a tres años.

Certificación de documentos de identidad falsos

Artículo 46.

El funcionario o funcionaria que actuando dolosamente certifique total o parcialmente cualquier documento de identificación con conocimiento de que los datos contenidos en éste son falsos, de modo que pueda resultar perjuicio al público o a los particulares, será penado con prisión de uno a tres años.

Usurpación de Identidad o Nacionalidad

Artículo 47.

La persona que obtenga la partida de nacimiento, cédula de identidad o pasaporte, mediante el suministro de datos falsos o mediante la presentación de documentos de otra persona, atribuyéndose identidad o nacionalidad distinta a la verdadera, será penada con prisión de quince a treinta meses.

Disposición Transitoria

Única:

Hasta tanto se dicte el Reglamento de esta Ley, se mantendrá vigente el Reglamento Parcial de la Ley Orgánica de Identificación, para la identificación de los indígenas, creado mediante decreto No 2.686, publicado en Gaceta Oficial de la República Bolivariana de Venezuela No 37.817, de fecha 13 de noviembre de 2003, salvo que contradiga esta Ley.

Disposición Derogatoria

Única:

Se deroga el Decreto N° 1.454 con Fuerza de Ley Orgánica de Identificación, publicado en Gaceta Oficial de la República Bolivariana de Venezuela No 37.320, de fecha 08 de noviembre del año 2001.

Disposición Final

Única:

Esta ley entrará en vigencia a partir de su publicación en la Gaceta Oficial de la República Bolivariana de Venezuela.

Dada, firmada y sellada en el Palacio Federal Legislativo, sede de la Asamblea Nacional, en Caracas a los site días del mes de abril de dos mil seis. Año 195° de la independencia y 147° de la Federación.

Ejecútese

(L.S.)


Imágenes de la Gaceta Oficial contentiva de la Ley Orgánica de Identificación.

Gaceta Oficial N° 38.458, 14 junio 2006, página 346.339
Gaceta Oficial N° 38.458, 14 junio 2006, página 346.339
Gaceta Oficial N° 38.458, 14 junio 2006, página 346.340
Gaceta Oficial N° 38.458, 14 junio 2006, página 346.340
Gaceta Oficial N° 38.458, 14 junio 2006, página 346.341
Gaceta Oficial N° 38.458, 14 junio 2006, página 346.341
Gaceta Oficial N° 38.458, 14 junio 2006, página 346.342
Gaceta Oficial N° 38.458, 14 junio 2006, página 346.342

Día de nuestra Independencia

Día de la Independencia.

Bandera de Venezuela animada
Bandera de Venezuela animada

Hoy martes 5 de julio de 2016 publicamos un fragmento del desfile militar del Glorioso Ejército Bolivariano que dió su sangre para liberarnos del yugo del Rey de España. Generales muy brillantes en las artes militares, como Pablo Morillo (quien hasta cosntruyó el primer puente sobre nuestro río Cabriales aquí en Valencia) trataron de recuperar la colonia para seguirnos explotando, sin embargo no lo pudieron evitar: somos libres e independientes.

Desde 1811 hasta 1830 fueron diecinueve años de lucha continua donde perdimos nuestras tres primera repúblicas y luego hasta La Gran Colombia, cuando nos dividieron los oligarcas (y los que se convirtieron a la oligarquía, como el Admirable General José Antonio Páez).

Aunque hemos avanzado en nuestra independencia tecnológica (y por lo tanto económica) da vergüenza admitirlo pero seguimos como -parafraseando- a nuestro Libetador en su famosa Carta de Jamaica: nos han dominado más por la ignorancia que por la fuerza.

A continuación la sociedad civil de Venezuela expresa su opnión sobre este magnífico día, nuestro ducentésimo quinto aniversario de nuestra independencia.