Manual Programacio II - Plan Nuevo - 2024
Manual Programacio II - Plan Nuevo - 2024
Python es un lenguaje de programación interpretado cuya filosofía hace hincapié en una sintaxis
que favorezca un código legible. Y define este como un lenguaje multiparadigma, debido a que
soporta orientación a objetos, programación imperativa y en menor medida programación
funcional. Es interpretado de tipado dinámico y multiplataforma. Vamos a tratar de explicar cada
característica del lenguaje de la manera más simple posible.
CARACTERISTICAS DE PYTHON
Interpretado
Normalmente los lenguajes de programación se pueden agrupar en Interpretados y Compilados
según la forma en la que son traducidos. Los lenguajes se inventaron para facilitar al programador
el desarrollo aplicaciones, imagina que nuestro computador trabaja en código binario y sería muy
difícil programar todo en unos y ceros, además del tiempo que eso llevaría. Por eso al escribir un
código en realidad lo que estamos haciendo es hablar un lenguaje más fácil de comprender para
nosotros y que luego será traducido a lenguaje de máquina que es lo que puede entender el
procesador. Entonces, cómo se realiza esta “traducción” es lo que los agrupa en Interpretados o
Compilados:
Los lenguajes Compilados son aquellos en los que el código del programador es traducido por
completo de una sola vez mediante un proceso llamado “Compilado” para ser ejecutado por un
sistema predeterminado. Entre los más comunes encontramos “C”, “C++”, Java, etc.
Y los lenguajes Interpretados son aquellos en los que el código del programador es traducido
mediante un intérprete a medida que es necesario. Entre los más comunes encontramos
“Python“, “Ruby”, “Javascript”, etc.
El que Python sea interpretado nos presenta ventajas:
VARIABLES
Las variables son uno de los componentes básicos de cualquier programa. En su esencia, un
programa está compuesto por datos e instrucciones que manipulan esos datos. Normalmente,
los datos se almacenan en memoria (RAM) para que podamos acceder a ellos.
Una variable es una forma de identificar, de forma sencilla, un dato que se encuentra almacenado
en la memoria del ordenador. Es un contenedor en el que se almacena un dato, el cuál, puede
cambiar durante el flujo del programa. Una variable nos permite acceder fácilmente a dicho dato
para ser manipulado y transformado.
Por ejemplo, si queremos mostrar el resultado de sumar 1 + 2 debemos indicarle al programa
dónde se encuentra dicho dato en memoria y, para ello, hacemos uso de una
variable:
Como vimos en el ejemplo anterior, para asignar un valor (un dato) a una variable se utiliza el
operador de asignación =.
En la operación de asignación se ven involucradas tres partes:
El operador de asignación =
Un identificador o nombre de variable, a la izquierda del operador
Un literal, una expresión, una llamada a una función o una combinación de todos ellos a
la derecha del operador de asignación
Para modificar el valor de una variable en Python, basta con asignarle un nuevo valor en cualquier
momento y lugar después de la definición.
Números, como pueden ser 3 (entero), 15.57 (de coma flotante) o 7 + 5j (complejos)
Cadenas de texto, como “Hola Mundo”
Valores booleanos: True (cierto) y False (falso).
Vamos a crear un par de variables a modo de ejemplo. Una de tipo cadena y una de tipo
entero:
También podemos representar los números enteros en formato binario, octal o hexadecimal.
Los números octales se crean anteponiendo el valor 0o a una secuencia de dígitos octales (del
0 al 7). Para crear un número entero en hexadecimal, hay que anteponer 0x a una secuencia de
dígitos en hexadecimal (del 0 al 9 y de la A la F). En cuanto a los números en binario, se antepone
0b a una secuencia de dígitos en binario (0 y 1).
Instituto Superior Del Milagro Nº 8207 (Salta)
Alvarado 951 y 1.164 – Tel. (087) 4311519 – Sitio Web: www.institutodelmilagro.com
Números de punto flotante
Los números de punto flotante representan al conjunto de los números reales. Hay que tener en
cuenta algunos detalles. Veamos un ejemplo:
Al igual que ocurre con los números enteros, los números reales son infinitos y, por tanto, es
imposible representar todo el conjunto de números reales con un ordenador.
Para representar el mayor número posible de los números reales con las limitaciones de memoria
(tamaños de palabra de 32 y 64 bits), se adaptó la notación científica de representación de
números reales al sistema binario (que es el sistema que se utiliza en programación para
representar los datos e instrucciones).
El caso es que la suma de la representación en punto flotante en binario del número 1,1 y de la
representación en punto flotante en binario del número 2,2, dan como resultado
3,3000000000000003
Pero hay más casos, como por ejemplo la representación del número 1/3. En algún momento, el
ordenador tiene que truncar el número periódico resultante.
Números Complejos
El último tipo de dato numérico básico que tiene Python es el de los números complejos, complex.
Los números complejos tienen una parte real y otra imaginaria y cada una de ellas se representa
como un float. Para crear un número complejo, se sigue la siguiente estructura
<parte_real>+<parte_imaginaria>j. Y se puede acceder a la parte real e imaginaria a través de
los atributos real e imag:
Tipo booleano
En Python la clase que representa los valores booleanos es bool. Esta clase solo se puede
instanciar con dos valores/objetos: True para representar verdadero y False para representar
falso.
Una particularidad del lenguaje es que cualquier objeto puede ser usado en un contexto donde
se requiera comprobar si algo es verdadero o falso. Por tanto, cualquier objeto se puede usar en
la condición de un if o un while (son estructuras de control que veremos en tutoriales posteriores)
o como operando de una operación booleana.
Por defecto, cualquier objeto es considerado como verdadero con dos excepciones:
None
False
El valor cero de cualquier tipo numérico: 0, 0.0, 0j, …
Secuencias y colecciones vacías : '', (), [], {}, set(), range(0)
Más adelante desarrollaremos el significado de métodos y de otros tipos de datos.
OPERADORES
Los operadores son símbolos reservados por el lenguaje que se utilizan para llevar a cabo
operaciones sobre uno o más operandos. Los operandos pueden ser variables, literales, el valor
devuelto por una expresión o el valor devuelto por una función.
Operadores Aritméticos
Los operadores aritméticos permiten realizar las diferentes operaciones aritméticas del álgebra.
Estos operadores Python son de los más utilizados:
Operadores de Asignación
El operador de asignación se utiliza para asignar un valor a una variable. Existe el operador
simple “=” y otros de asignación compuestos que realizan una operación básica sobre la variable
a la que se le asigna el valor.
ENTRADAS
Los programas serían de muy poca utilidad si no fueran capaces de interactuar con el usuario,
incluso podrían no cumplir con el objetivo de encontrar la solución a un problema.
La entrada de datos en Python es bastante simple por medio de la función input(). En este módulo
conoceremos una de las funciones para leer datos por teclado y asignar ese valor recibido a una
variable. Además algunas consideraciones a tener en cuenta al momento de usarla.
La forma general de mostrar información por pantalla es mediante una consola de comando,
generalmente podemos mostrar texto y variables separándolos con comas, para esto se usa la
sentencia print().
Entrada de datos por consola
Para pedir al usuario que introduzca algún dato a través del teclado, usaremos el método input().
Este método, recibe como parámetro un str con el mensaje a mostrar al usuario:
En el código anterior se usó la función predefinida int() para convertir el dato ingresado de cadena
de texto a valor numérico, por lo tanto la operación para obtener su consecutivo está permitida.
Además de la entrada por consola, es posible obtener datos desde un archivo de texto de
diversas extensiones o desde una página web. El primero de los ítems lo desarrollaremos más
adelante estudiando el uso de ficheros JSON y CSV, el segundo tema conocido como Web
Scraping lo dejaremos para un curso más avanzado y como objeto de investigación de los
estudiantes.
SALIDAS Y FORMATOS
Mostrar datos por pantalla no solo es sencillo sino además flexible. En general, es cuestión de
una sola línea de código con una sola función llamada print().
La función print() de Python, recibe entre los paréntesis lo que sea que quieras mostrar y además
permite indicar algunos detalles adicionales.
Mostrar mensajes de texto
Se realiza colocando como argumento un texto encerrado entre comillas (ya sean dobles "" o
simples '')
Tratemos de dividirlo en varias llamadas a print para que el código sea más legible:
Sin embargo el resultado obtenido es completamente diferente al esperado, pues, Python puso
cada mensaje en una línea diferente en la pantalla. Esto sucede, debido a que, por defecto,
Python crea saltos de línea al final de cada llamado a print().
Esto puede resolverse usando parámetros especiales de print(), indicando que queremos poner
un espacio en blanco, en lugar de un salto de línea, de modo que todo quede en una sola línea
en pantalla y con sus debidos espacios. Lo que haremos es cambiar el final de línea de print() en
Python indicándolo en un parámetro llamado end:
Por supuesto que una salida es más clara o explícita cuando se combinan los valores que se
desean mostrar con mensajes de texto que describen esos valores.
Otro ejemplo:
Por defecto el separador de print es un espacio en blanco, es decir, separa fin de cadena de texto
o valor de variable. Es posible modificarlo usando el parámetro sep.
Tenemos una línea más corta, más legible ofreciendo la oportunidad de invocar funciones, por
ejemplo si quisiéramos colocar el valor de materia en mayúsculas.
Ya que las f-strings son evaluadas al momento de la ejecución tenemos la posibilidad de colocar
cualquier expresión válida.
Si necesitamos dividir nuestro mensaje en múltiple líneas podemos hacerlo de esta forma.
SENTENCIA IF
La sentencia if se utiliza para ejecutar un bloque de código si, y sólo si, se cumple una
determinada condición. La estructura básica es la siguiente:
Es decir, solo si condición se evalúa a True, se ejecutarán las sentencias que forman parte de
bloque de código. En caso de que se evalúe a False no se ejecutará ninguna sentencia
perteneciente a bloque de código.
Condición puede ser un literal, el valor de una variable, el resultado de una expresión o el valor
devuelto por una función.
En las expresiones es muy común usar los operadores booleanos y de comparación.
IMPORTANTE: El cuerpo del bloque está indicado con una sangría o identación mayor. Dicho
bloque termina cuando se encuentre la primera línea con un sangrado menor.
Sangría, identación y sangrado se usan como sinónimos y representa el espacio en blanco
que dejamos desde el margen izquierdo al comenzar una sentencia.
Por ejemplo:
SENTENCIA IF-ELIF-ELSE
También es posible que haya situaciones en que una decisión dependa de más de una condición.
En estos casos se usa una sentencia if compuesta, cuya estructura es como se indica a
continuación:
Aquí, elem es la variable que toma el valor del elemento dentro del iterador en cada paso del
bucle. Este finaliza su ejecución cuando se recorren todos los elementos.
La clase range
Una de las iteraciones más comunes que se realizan, es la de iterar un número, por ejemplo,
entre 0 y N. Supongamos que queremos iterar una variable i de 0 a 3.
La clase range se usa para implementar y/o simular el ciclo for basado en una secuencia
numérica. El constructor de esta clase, range(max), devuelve un iterable cuyos valores van desde
0 hasta max - 1.
En la primera parte del código se puede ver que creamos el ciclo debajo, en el cuerpo del mismo
colocamos un input para mostrarle al usuario las opciones y permitirle elegir una para
almacenarla en la variable “opcion”.
EXPRESIONES ANIDADAS
Las estructuras o flujos de control pueden anidarse, es decir, la ejecución de alguna de ellas se
encuentra dentro del bloque o cuerpo de código de otra y por lo tanto su ejecución dependerá de
la ejecución de esa otra.
Desarrollaremos el siguiente ejemplo: “Determinar cuáles son los 5 primeros números primos de
2 cifras”
Además de los tipos básicos, otros tipos fundamentales de Python son los tipos compuestos y
se utilizan para agrupar juntos varios valores. Entre ellos tenemos:
Listas: son secuencias mutables de valores.
Tuplas: son secuencias inmutables de valores.
Conjuntos: se utilizan para representar conjuntos donde no pueden existir dos objetos
iguales dentro de él.
Diccionarios: son tipos especiales de contenedores en los que se puede acceder a sus
elementos a partir de una clave única.
LISTAS
Las listas en Python son un tipo contenedor, compuesto, que se usan para almacenar conjuntos
de elementos relacionados del mismo tipo o de tipos distintos.Tienen la particularidad de ser
mutables, es decir, que su contenido se puede modificar después de haber sido creada.
Para crear una lista en Python, simplemente hay que encerrar una secuencia de elementos
separados por comas entre corchetes [].
Ejemplos de creación de listas:
Las listas también se pueden crear usando el constructor de la clase, list(iterable). En este caso,
el constructor crea una lista cuyos elementos son los mismos y están en el mismo orden que los
ítems del iterable. El objeto iterable puede ser o una secuencia, un contenedor que soporte la
iteración o un objeto iterador (más adelante explicaremos los conceptos de clase y de objeto
iterador).
Por ejemplo, el tipo str también es un tipo secuencia. Si pasamos un string al constructor list()
creará una lista cuyos elementos son cada uno de los caracteres de la cadena:
INDICES Y SLICING
Para acceder a un elemento de una lista se utilizan los índices. Un índice es un número entero
que indica la posición de un elemento en una lista. El primer elemento se encuentra en el índice
0. Por ejemplo, en una lista con 4 elementos, los índices de cada uno de los ítems serían 0, 1, 2
y 3.
Como hemos visto, las listas pueden contener otros elementos de tipo secuencia de forma
anidada. Por ejemplo, una lista donde uno de sus ítems es otra lista. Del mismo modo, se puede
acceder a los elementos de estos tipos usando índices compuestos o anidados:
Al igual que con Listas, si se intenta acceder a un índice que está fuera del rango de la tupla, el
intérprete lanzará la excepción IndexError. Sii se utiliza un índice que no es un número entero,
se lanzará la excepción TypeError:
También es posible acceder a un subconjunto de elementos de una tupla utilizando el operador
[:].
Los ejemplos de estas tareas son idénticos a los mostrados en la sección de listas, usando tuple
en vez de list.
MODIFICAR UNA TUPLA
Como ya se indicó, las tuplas son objetos inmutables. No obstante, las tuplas pueden contener
objetos u otros elementos de tipo secuencia, por ejemplo, una lista. Estos objetos, si son
mutables, sí se pueden modificar:
Recorrer la tupla
Determinar la longitud de la tupla
Determinar si un elemento pertenece a una tupla
Recuerda que las tuplas son un tipo secuencial que no se puede modificar. Se usan cuando no
quieres que los elementos de una lista se deban modificar o para almacenar las claves de un
diccionario.
CONJUNTOS
El tipo set en Python es utilizado para trabajar con conjuntos de elementos. La principal
característica de este tipo de datos es que es una colección cuyos elementos no guardan ningún
orden y que además son únicos.
Estas características hacen que los principales usos de esta clase sean conocer si un elemento
pertenece o no a una colección y eliminar duplicados de un tipo secuencial (list, tuple o str).
Además, esta clase también implementa las típicas operaciones matemáticas sobre conjuntos:
unión, intersección, diferencia, etc.
Para crear un conjunto, basta con encerrar una serie de elementos entre llaves {}, o bien usar el
constructor de la clase set() y pasarle como argumento un objeto iterable (como una lista, una
tupla, una cadena).
Añadir/Eliminar un elemento
Determinar el número de elementos
Comprobar si un elemento está en un conjunto
En particular podemos agregar las operaciones del álgebra de conjuntos:
Unión
Intersección
Diferencia
Diferencia Simétrica
Inclusión de conjuntos
Conjuntos disjuntos
Igualdad
RECORRER LOS ELEMENTOS DE UN OBJETO ITERABLE
El bucle for se utiliza para recorrer los elementos de un objeto iterable (lista, tupla, conjunto,
diccionario) y ejecutar un bloque de código. En cada paso de la iteración se tiene en cuenta a un
único elemento del objeto iterable, sobre el cuál se pueden aplicar una serie de operaciones.
Su sintaxis es la siguiente:
Aquí, elem es la variable que toma el valor del elemento dentro del iterador en cada paso del
bucle. Este finaliza su ejecución cuando se recorren todos los elementos.
Si tenemos una lista de números y queremos mostrarlos por consola podríamos hacer:
ITERACIÓN EN LISTAS
En el siguiente ejemplo definiremos una lista de palabras y un ciclo para iterarla, luego a cada
ítem le calculamos su longitud, es decir la cantidad de caracteres de cada palabra, usando la
función len, además mostramos esta información.
FUNSIONES
Para definir una función se utiliza la palabra reservada def. A continuación el nombre o
identificador de la función que es el que se utiliza para invocarla. Después del nombre hay que
incluir los paréntesis y una lista opcional de parámetros. La cabecera o definición de la función
termina con dos puntos.
Tras los dos puntos se incluye el cuerpo de la función (identado) que es el conjunto de
instrucciones que se encapsulan en dicha función y que le dan significado.
En último lugar y de manera opcional, se añade la instrucción con la palabra reservada return
para devolver un resultado.
Instituto Superior Del Milagro Nº 8207 (Salta)
Alvarado 951 y 1.164 – Tel. (087) 4311519 – Sitio Web: www.institutodelmilagro.com
Para usar o invocar a una función, simplemente hay que escribir su nombre pasando los
argumentos necesarios según los parámetros que defina la función.
Por lo tanto, los identificadores que se colocan al DEFINIR la función se denominan
PARÁMETROS y los identificadores que se utilizan en la INVOCACIÓN de la función se llaman
ARGUMENTOS. Es decir que los argumentos son los valores que se actualizan en el cuerpo de
la función a través de los parámetros.
Veamos un ejemplo, donde simulamos una calculadora que realiza las operaciones básicas, el
usuario ingresa dos operandos y puede elegir cuál operación realizar y además decidir si quiere
realizar otro cálculo o no.
ARGUMENTOS
ARGUMENTO DE ENTRADA
Empecemos por una función sencilla sin parámetros de entrada ni salida.
Por defecto, los valores de los argumentos se asignan a los parámetros en el mismo orden en el
que se los pasa al llamar a la función. Luego veremos que esto puede cambiar. Veamos un
ejemplo de en qué afecta el orden de los parámetros.
ARGS vs KWARGS
Python nos permite crear funciones que acepten un número indefinido de parámetros sin
necesidad de que todos ellos aparezcan en la cabecera de la función. Los operadores * y ** son
los que se utilizan para esta funcionalidad.
*Args
El parámetro especial *args en una función se usa para pasar, de forma opcional, un número
variable de argumentos posicionales.
Quien indica que el parámetro es de este tipo es el símbolo ‘*’, el nombre args se usa por
convención.
El parámetro recibe los argumentos como una tupla.
Es un parámetro opcional.
El número de argumentos al invocar a la función es variable.
Son parámetros posicionales, es decir, su valor depende de la posición en la que se pasen
a la función.
La siguiente función toma dos parámetros y devuelve la suma de los mismos:
Lo que indica que el parámetro es de este tipo es el símbolo ‘**’, el nombre kwargs se usa
por convención.
El parámetro recibe los argumentos como un diccionario.
Al tratarse de un diccionario, el orden de los parámetros no importa. Los parámetros se
asocian en función de las claves del diccionario.
Este tipo de parámetros es muy útil al realizar consultas sobre una base de datos, tema que
veremos y ejemplificaremos más adelante.
Al combinar parámetros en la definición de una función hay que tener muy en cuenta el orden.
Tanto *args como **kwargs pueden aparecer de forma conjunta o individual, pero siempre al final
y de la siguiente manera:
def ejemplo(arg1, arg2, *args, **kwargs)
En resumen:
Utiliza *args para pasar de forma opcional a una función un número variable de
argumentos posicionales.
Instituto Superior Del Milagro Nº 8207 (Salta)
Alvarado 951 y 1.164 – Tel. (087) 4311519 – Sitio Web: www.institutodelmilagro.com
El parámetro *args recibe los argumentos como una tupla.
Emplea **kwargs para pasar de forma opcional a una función un número variable de
argumentos con nombre.
El parámetro **kwargs recibe los argumentos como un diccionario.
Por último, utilizar *args y **kwargs ahorra tiempo y esfuerzo en cuanto a análisis e
implementación dado que flexibiliza el diseño de funciones, pero su uso indiscriminado puede
originar resultados inesperados cuya revisión y arreglo nos podría llevar más tiempo aún que el
diseño estratégico original.
La clase dict de Python es un tipo mapa que asocia claves a valores. A diferencia de los tipos
secuenciales como list, tuple o str, que son indexados por un índice numérico, los diccionarios
son indexados por claves. Estas claves siempre deben ser de un tipo inmutable, concretamente
un tipo hashable (un objeto es hashable si tiene un valor de hash que no cambia durante todo su
ciclo de vida).
Piensa en un diccionario como un contenedor de pares clave:valor, en el que la clave puede ser
de cualquier tipo hashable y es única en el diccionario que la contiene. Generalmente, se suelen
usar como claves los tipos int y str.
Las principales operaciones con diccionarios son:
En el diccionario anterior, los enteros 1 y 89 y las cadenas 'a' y 'c' son las claves. Es posible
mezclar claves y valores de distinto tipo sin problema.
Para crear un diccionario vacío, simplemente asigna a una variable el valor {}.
La clase dict también ofrece el método get(clave[, valor por defecto]). Este método devuelve el
valor correspondiente a la clave clave. En caso de que la clave no exista no lanza ningún error,
sino que devuelve el segundo argumento valor por defecto. Si no se proporciona este argumento,
se devuelve el valor None.
Recorrer el diccionario
Añadir/Modificar/Eliminar un elemento
Determinar el número de elementos
Comprobar si un elemento está en un diccionario
Comparar/Anidar diccionarios
Obtener listado de clave de un diccionario
FICHEROS.
Prácticamente todo lo que hemos hecho hasta aquí fue crear pequeños scripts que manejan
información sobre la marcha, es decir, se definen variables asignando valores, o se ingresa por
teclado para luego manipularla, sin embargo imaginemos que debemos trabajar con un gran
caudal de datos, por ejemplo llevar un registro de asistencia a clases y notas de alumnos que
rindieron exámenes para determinar su condición de “regular” o “libre”, para ello podríamos crear
variables en el programa y asignar valores, pero tenemos al menos dos inconvenientes, simular
la situación nos consumiría el uso de demasiadas variables y aun así hay situaciones que no
podríamos reflejar, también podríamos pedir el ingreso estos valores por teclado pero luego de
cerrar el programa los perderíamos.
Lo que necesitamos es que nuestra información sea persistente y nos permita seguir trabajando
la próxima vez que abramos el programa. Existen dos maneras de trabajar con datos
persistentes, organizados en ficheros o almacenados en una base de datos.
LECTURA
Podemos usar el método readlines() del fichero para generar una lista con las líneas:
También se puede leer un fichero utilizando la instrucción estándar with de la siguiente forma:
La variante 'a+' permite crear el fichero si no existe, usaremos otro archivo que no fue creado
antes:
Para posicionar el puntero justo al inicio de la segunda línea, podríamos ponerlo justo en la
longitud de la primera:
Se puede abrir un fichero en modo lectura con escritura, pero éste debe existir previamente.
Además por defecto el puntero estará al principio y si escribimos algo sobre escribiremos el
contenido actual.
El siguiente ejemplo muestra detalladamente cómo hacerlo, tengan en cuenta los saltos de línea
y los caracteres especiales:
FICHEROS CSV
El formato CSV (Comma Separated Values) es uno de los más comunes y sencillos para
almacenar una serie de valores como si de una tabla se tratara.
Archivo generado:
Archivo generado:
FICHEROS JSON
El formato JSON se ha convertido en uno de los más populares para la serialización e intercambio
de datos, sobre todo en aplicaciones web que utilizan AJAX. Recordemos que esta técnica
permite intercambiar datos entre el navegador cliente y el servidor sin necesidad de recargar la
página.
JSON son las siglas en inglés de JavaScript Object Notation y fue definido dentro de uno de
los estándares (ECMA- 262) en los que está basado el lenguaje JavaScript. Es en este lenguaje
donde, a través de una simple función (eval()), podemos crear un objeto directamente a través
de una cadena de texto en formato JSON. Este factor ha contribuido significativamente a que
sean muchos los servicios web que utilizan JSON para intercambiar datos a través de AJAX, ya
que el análisis y procesamiento de datos es muy rápido. Incluso, son muchas las que han
sustituido el XML por el JSON a la hora de intercambiar datos entre cliente y servidor.
Para estructurar la información que contiene el formato, se utilizan las llaves ({}) y se definen
pares de nombres y valor separados entre ellos por dos puntos. De esta forma, un sencillo
ejemplo en formato JSON, para almacenar la información de un empleado, sería el siguiente:
{"apellidos": "Fernández Rojas", "nombre": "José Luis", "departamento": "Finanzas",
"ciudad": "Madrid"}
JSON puede trabajar con varios tipos de datos como valores; admite cadenas de caracteres,
números, booleanos, listas y null. La mayoría de los lenguajes modernos de programación
incluyen API y/o librerías que permiten trabajar con datos en formato JSON.
En Python disponemos de un módulo llamado json que forma parte de la librería estándar del
lenguaje. Básicamente, este método cuenta con dos funciones principales, una para codificar y
otra para descodificar. El objetivo de ambas funciones es traducir entre una cadena de texto con
formato JSON y objetos de Python.
Obviamente, utilizando las funciones de ficheros de Python podemos leer y escribir ficheros que
contengan datos en este formato. No obstante, debemos tener en cuenta que las funciones
contenidas en json no permiten trabajar directamente con ficheros, sino con cadenas de texto.
Instituto Superior Del Milagro Nº 8207 (Salta)
Alvarado 951 y 1.164 – Tel. (087) 4311519 – Sitio Web: www.institutodelmilagro.com
ESCRITURA DE DATOS EN JSON
Los pasos a seguir para conectar y usar una Base de Datos son:
Abrir/Crear la conexión
1. Crear puntero
2. Ejecutar una consulta SQL (query)
3. Administrar los resultados de la consulta
a. Insertar (Create)
b. Leer (Read)
c. Actualizar (Update)
d. Borrar (Delete)
4. Cerrar puntero
5. Cerrar conexión
CONEXIÓN A LA BASE DE DATOS, CREACIÓN Y DESCONEXIÓN
Al realizar la conexión, si la base de datos no existe, entonces la crea. Siempre debe cerrarse la
conexión al finalizar el uso, sino luego no se podrá seguir manipulándola.
Programación Estructurada.
Usando programación estructurada, de cierto modo, los programas son más fáciles de entender.
Un programa estructurado puede ser leído en secuencia, de arriba hacia abajo, sin necesidad de
estar saltando de un sitio a otro en la lógica. La estructura del programa es más clara puesto que
las instrucciones están más relacionadas entre sí, por lo que es más fácil comprender lo que
hace cada función. Algunas de sus ventajas son:
Reducción del esfuerzo en las pruebas. El programa se puede tener listo para producción
normal en un tiempo menor del tradicional; por otro lado, el seguimiento de las fallas se
facilita debido a la lógica más visible, de tal forma que los errores se pueden detectar y
corregir más fácilmente. Programas más sencillos y rápidos.
Aumento de la productividad del programador. Los programas quedan mejor
documentados internamente. La programación estructurada permite la escritura de
programas fáciles de leer y modificar. En un programa estructurado el flujo lógico se
gobierna por tres estructuras de control básico: secuenciales, repetitivas y selectivas.
Programación Orientada a Objetos (POO).
La Programación Orientada a Objetos (POO) es una forma especial de programar, más cercana
a la forma de expresar las cosas en la vida real que otros tipos de programación.
Con la POO tenemos que aprender a pensar las cosas de una manera distinta, para escribir
nuestros programas en términos de objetos, propiedades, métodos y otros conceptos nuevos.
Algunas de sus ventajas son:
Dentro del contexto de la POO, un objeto es un componente que tiene un rol específico y que
puede interactuar con otros. Se trata de establecer una equivalencia entre un objeto del mundo
real con un componente software. De esta forma, el modelado para la representación y resolución
de problemas del mundo real a través de la programación es más sencillo e intuitivo.
Si miramos a nuestro alrededor, todos los objetos presentan dos componentes principales: un
conjunto de características y propiedades y un comportamiento determinado. Por ejemplo,
pensemos en un auto. Esta tiene características como color, marca y modelo. Asimismo, su
comportamiento puede ser descrito en función de las operaciones que puede realizar, por
ejemplo, frenar, acelerar o girar. De la misma forma, en programación, un objeto puede tener
Instituto Superior Del Milagro Nº 8207 (Salta)
Alvarado 951 y 1.164 – Tel. (087) 4311519 – Sitio Web: www.institutodelmilagro.com
atributos y se pueden definir operaciones que puede realizar. Los atributos equivaldrían a las
características de los objetos del mundo real y las operaciones se relacionan con su
comportamiento.
Es importante distinguir entre clase y objeto. Para ello, introduciremos un nuevo concepto: la
instancia. La definición de los atributos y operaciones de un objeto se lleva a cabo a través de
una clase. La instanciación es un mecanismo que nos permite crear un objeto que pertenece a
una determinada clase. De esta forma, podemos tener diferentes objetos que pertenezcan a la
misma clase.
Definir Clases.
Lo primero es crear una clase, para ello usaremos el ejemplo del auto.
Class auto:
Pass
Se trata de una clase vacía y sin mucha utilidad práctica, pero es la mínima clase que podemos
crear. En realidad, el uso del “pass” no hace realmente nada, pero se generaría un error si
después de los “:” no tenemos contenido. Ahora que tenemos la clase, podemos crear un objeto
de la misma. Podemos hacerlo como si se tratase de una variable normal. Nombre de la variable
igual a la clase con los (). Dentro de los paréntesis irían los parámetros de entrada si los hubiera.
Mi_auto = auto()
Definir Atributos.
Empecemos creando un par de atributos para nuestro auto, recordemos que los atributos son las
características de los objetos, como bien podrían ser la marca y el modelo. Para ello podemos
hacer lo siguiente
Si bien esta es una forma sencilla de definir y establecer atributos a una clase, lo correcto seria
dejar que el usuario ingrese sus datos, esto puede realizarse colocando un input() en los campos
que deseamos que el usuario ingrese sus propios datos.
De esta forma el usuario puede ingresar sus datos, haciendo que el programa sea más útil.
Instituto Superior Del Milagro Nº 8207 (Salta)
Alvarado 951 y 1.164 – Tel. (087) 4311519 – Sitio Web: www.institutodelmilagro.com
En este punto, los atributos que definimos anteriormente se denominan atributos de clase,
existen otro tipo de atributo, como los de instancia que veremos cuando desarrollemos el termino
de métodos.
MÉTODOS.
Los métodos son como la función o el comportamiento de los objetos, por ejemplo en el caso de
una mesa, los atributos serian sus características como ser el color, la cantidad de patas, etc. Y
sus métodos seria su funcionalidad como sostener objetos.
Para el caso de nuestro auto su funcionalidad o métodos podrían ser arrancar, girar, detenerse,
etc.
Otra característica que presentan los objetos, o más bien otra funcionalidad es la capacidad de
“presentarse”, es decir mostrar sus características o sea sus atributos.
Para ejemplificar lo anteriormente dicho, supongamos que necesitamos crear un programa que
gestione alumnos, los alumnos son personas, por lo tanto podríamos hacer una clase llamada
persona.
Ahora estas personas tiene características diferentes como por ejemplo apellido, nombre y DNI,
estas características serian los atributos de la clase.
Como dijimos anteriormente estas personas son capaces de “presentarse”, esto es una acción o
una funcionalidad de la clase, por lo que se lo conoce como método.
Los métodos pueden ser vistos como funciones o procedimientos que solo pertenece a una clase
y solo esta puede utilizarlo, se lo define de la siguiente manera.
Para poder saber si el método esta funcionando correctamente, debemos crear una instancia de
la clase Persona y luego “invocar” o “llamar” al método “decir_nombre”
Para poder “llamar” al método se debe colocar el nombre de la instancia, en este caso “persona1”
seguido de un punto y recién el nombre del método a invocar.
Ahora que hemos conocidos que son los métodos a grandes rasgos, debemos saber que existe
una variedad de tipos de métodos, algunos son “especiales” como por ejemplo los métodos
“mágicos” y otros más comunes como los métodos de clase e instancia.
Método Constructor.
Dentro de los métodos mágicos existe uno llamado método constructor, este método es muy
importante ya que se ejecuta cuando se esta creando el objeto y como su nombre lo indica, se
encarga de construir al objeto según las especificaciones que nosotros establezcamos.
Los atributos pueden definirse y establecerse con el método constructor, de esta manera los
atributos se convierten en atributos de instancia.
HERENCIA.
La herencia permite a los programadores crear clases que se basan en clases existentes, y esto
permite que una clase creada a través de la herencia herede los atributos y métodos de la clase
principal. Esto significa que la herencia admite la reutilización del código.
La clase de la que hereda una clase se llama padre o superclase. Una clase que hereda de una
superclase se llama subclase, también llamada clase heredera o clase hija.
Desarrollaremos el ejemplo de una tienda que vende 3 tipos de productos: adornos, alimentos y
libros. Todos los productos de la tienda tenían una serie de atributos comunes, como la
referencia, el nombre, el precio, pero algunos son específicos de cada tipo.
La idea de la herencia es identificar una clase base (la superclase) con los atributos comunes y
luego crear las demás clases heredando de ella (las subclases) y extendiendo sus campos
específicos. En nuestro caso esa clase sería el Producto en sí mismo:
En el código de ejemplo, creamos una clase llamada Alimento que hereda de la clase padre
llamada Producto, ya que un Alimento es un Producto.
Además de heredar todos sus atributos y métodos de la clase padre, también debemos crear los
atributos y métodos particulares de la clase hijo. Para ello primero debemos crear un método
constructor donde le pasaremos todos los atributos requeridos por la clase padre, en el ejemplo
serian referencia, nombre, precio y descripción. También debes agregar el parámetro necesario
para el atributo propio de la clase hija.
Una vez definido el método constructor, debemos llamar al método constructor pero de la clase
padre, esto se hace con la función super().
Dentro de dicha función, se pasan los parámetros particulares de la clase padre, como los son
referencia, nombre, precio y descripción.
Por último, solo queda crear los atributos particulares de la clase hijo y asignarles datos como lo
hacíamos de forma habitual.