Python Programming (EIT) - Filminas
Python Programming (EIT) - Filminas
Python Programming
Python Programming
Python Programming
● P thon: len uaje multiplata o ma puede co e sin
modificaciones en dive sos sistemas ope ativos , de códi o
abie to, es deci , totalmente atuito cual uie a puede
accede a su códi o de uente, modifica lo dist ibui lo
lib emente.
Python Programming
● Colecciones: pe miten a upa datos en est uctu as de
di e entes tipos.
Python Programming
● Ope ado es de asignación: atajos pa a esc ibi de mane a más
co ta asi na su esultado a la va iable inicial.
● Ope ado de Wal us: se t ata de un ope ado de asi nación con
una uncionalidad e t a.
Python Programming
● Ope ado a ni el bit, bit ise: actúa sob e núme os ente os
usando su ep esentación bina ia.
Python Programming
¡Ya estás listo!
Python Programming
P1thon Programming
Módulo 1
Python Programming
Acerca de P1thon
Python Programming
Acerca de P1thon
Python fue creado a principios de los años 90s, Es multiparadigma pues soporta tres tipos de
por el holandés Guido van Rossum. Muchos paradigmas: programación imperativa (típica
creen que Python, es reciente. Pero en realidad en lenguajes tradicionales como C), orientada
lleva unos cuantos años entre nosotros, y en un a objetos (el paradigma por antonomasia en
lenguaje de programación trascender tanto lenguajes como Java) y funcional (Haskell, Elixir,
tiempo, es buen síntoma. entre otros). El modelo predominante es el de
orientación a objetos.
Python es multiplataforma, un programa escrito
en este lenguaje puede correr sin modificaciones Se trata de un lenguaje interpretado, de modo
en diversos sistemas operativos: Microsoft que un programa no es compilado y ejecutado
Windows, distribuciones de Linux y Mac OS. Es directamente por el procesador, sino por el
de código abierto, es decir, totalmente gratuito y denominado intérprete (que no es más que un
cualquiera puede acceder a su código de fuente, programa escrito en C). Por esta razón, a los
modificarlo y distribuirlo libremente. programas de Python se los conoce en la jerga
más bien como scripts.
Python Programming
Python es ampliamente utilizado en la comunidad
de programadores y el lenguaje con mayor
proyección para los próximos años, ya que, entre
otras cosas, protagoniza el auge de la inteligencia
artificial y del machine learning. Además, es ideal
para el desarrollo de aplicaciones web y de
escritorio multiplataforma.
Grandes empresas desarrollan con Python desde
hace tiempo, como: Google, YouTube, Netflix,
Amazon, NASA e Instagram, entre otras.
Python Programming
Este gráfico representa las consultas por lenguaje
de programación, en el sitio Stack Overflow. Vemos
que Python es uno de los más consultados por los
programadores.
Actualmente, la evolución del lenguaje Python es
gestionada por la Python Software Foundation,
una sociedad sin ánimo de lucro dedicada a dar
difusión al lenguaje y apoyar su evolución. Guido
sigue totalmente involucrado en el desarrollo y en
la toma de decisiones de diseño.
Python está licenciado bajo licencia PSFL, derivada
de BSD y compatible con GPL. Muchas empresas y su evolución, pero ninguna ejerce un control
organizaciones, como Google, Microsoft o Red Hat, sobre el mismo. Esto diferencia a Python de
hacen un gran uso de Python y tienen influencia en otros lenguajes.
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 1
Python Programming
¡Hola, Mundo!
Python Programming
Descargas e instalaciones
Para descargar Python(el intérprete), nos dirigimos a la página oficial (python.org) y en
la sección de descargas (“Downloads”) seleccionamos “Python 3.x.x”
Python Programming
Descargas e instalaciones
Python Programming
Descargas e instalaciones
Python Programming
Descargas e instalaciones
Lo que vemos en pantalla se conoce con el nombre Resulta una herramienta sumamente útil para
de consola interactiva. Allí podemos escribir código realizar pruebas y desarrollar prototipos
Python que se ejecutará instantáneamente al rápidos. Volveremos sobre esto más adelante.
presionar la tecla ENTER.
Python Programming
Necesitamos un editor
Python se distribuye con un editor de código llamado IDLE,
bastante primitivo, que podrás encontrar en la carpeta de
instalación. Además de un editor, incluye una consola
interactiva como la anterior con resaltado de sintaxis y
completado automático.
Existen infinidad de editores de código para Python. En este
curso haremos uso de Visual Studio Code, con bastantes
prestaciones y con la capacidad de poder configurarlo como
más nos guste. VSCode es multiplataforma. Podés descargarlo
desde https://code.visualstudio.com/
Python Programming
Necesitamos un editor
Python Programming
Necesitamos un editor
Python Programming
¡Estamos listos!
En cualquier introducción, no puede faltar el famoso Hola
Mundo, si ejecutas el siguiente código, habrás logrado
hacerlo en Python.
print("Hola mundo!")
Python Programming
¡Estamos listos!
1. Explorador de archivos.
2. Botón de ejecución.
3. Área de código.
4. Terminal que se despliega al
ejecutar código.
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 1
Python Programming
Tipos de datos
1 Colecciones
Python Programming
Tipos de datos
Python es un lenguaje de “tipado” dinámico. Esto Python tiene los tipos de dato entero(int),
quiere decir que las variables, como se las conoce flotante(float), complejo(complex), booleanos(bool)
en otros lenguajes, no son una suerte de cajas y strings(str).
que aceptan únicamente un tipo de datos, sino
más bien etiquetas que se le asignan a un objeto Podemos asignar el nombre que queramos,
de cualquier tipo. No es necesario ahondar en respetando no usar las palabras reservadas
cómo el intérprete maneja internamente las (lista de palabras reservadas) de Python ni
variables, simplemente tener en cuenta que no espacios, guiones o números al principio.
están ligadas a un tipo de dato en específico, y
que acostumbramos a llamarlas objetos” (ya
veremos por qué).
Python Programming
Tipos de datos
Comencemos por abrir la consola interactiva La función type(), nos permite averiguar el
de Python y escribir lo siguiente. tipo de dato de una variable.
(A partir de ahora, siempre que veas los caracteres >>> type(dato)
“>>>” da por sentado que estamos trabajando sobre <class 'int'>
la consola interactiva).
>>> dato (En Python las cadenas se construyen con comillas dobles
1 o simples).
Python Programming
Tipos de datos
Ya hemos visto dos tipos de datos: un Y por último no tan utilizados los complejos:
número entero (int) y una cadena (str).
>>> z = 5 + 3j
Continuemos creando un número de coma
flotante y un booleano. (Este ejemplo tiene parte real con valor 5 y parte imaginaria 3)
Python Programming
Casting
Cast o Casting significa convertir un tipo de dato a otro. Vimos tipos de datos como los
int, string o float. Pues bien, es posible convertir de un tipo a otro.
Python Programming
Casting
>>> b = 50
>>> str(b)
>>> '50'
>>> edad = "45"
>>> int(edad)
>>> 45
Python Programming
Colecciones
Python tiene una variedad de colecciones para agrupar
datos en estructuras de diferentes tipos. Tenemos
colecciones ordenadas o no ordenadas y colecciones
mutables o inmutables.
Las colecciones ordenadas son aquellas que pueden ser
indexadas, es decir, que se pueden usar números enteros
para acceder a sus elementos. Son colecciones ordenadas
(o secuencias) las listas y las tuplas. Como colecciones no
ordenadas tenemos los diccionarios. También existen los
sets y los frozensets, estos últimos no tan empleados.
Python Programming
Listas
Las listas son objetos mutables (es decir, su Los índices pueden ser negativos, para indicar
contenido puede variar) y ordenados. En otros que se debe empezar a contar desde el último
lenguajes existen estructuras similares. Podemos elemento:
acceder a sus elementos a partir de su posición,
>>> datos[-1]
indicando un índice entre corchetes, comenzando
3
desde el 0. >>> datos[-2]
>>> datos = [1, 2, 3] 2
>>> datos[0]
1
>>> datos[1]
2
>>> datos[2]
3
Python Programming
Listas
>>> animales[0:5:2]
['Gato', 'Gallo', 'Tiburon']
Python Programming
Listas
Los elementos dentro de una lista no Como las listas son objetos mutables, podemos
necesariamente tienen que ser del mismo tipo. cambiar el objeto en una posición determinada
Incluso pueden contener otras listas. con una simple asignación.
>>> b = [3.14, True, ["Hola mundo", False]] >>> a = [1, 2, 3, 4]
>>> b[0] >>> a[2] = "Hola mundo"
3.14 >>> a
>>> b[1] [1, 2, 'Hola mundo', 4]
True
>>> b[2]
['Hola mundo', False]
>>> b[2][0]
'Hola mundo'
>>> b[2][1]
False
Python Programming
Listas
Las listas poseen funciones propias, métodos, Y para insertar un elemento en una posición
con los cuales podemos trabajarlas de forma específica, la función insert() toma como
más óptima. primer argumento un índice de base 0 seguido
del objeto a insertar.
Para añadir un elemento al final de una lista,
utilizamos el append(). >>> a.insert(2, -1)
>>> a
>>> a = [1, 2, 3, 4] [ 1, 2, -1, 3, 4, 5]
>>> a.append(5)
>>> a
[1, 2, 3, 4, 5] Existen otros métodos que poseen las listas,
para más información podemos ver la
documentación oficial que habla sobre el tema:
más sobre listas.
Python Programming
Tuplas
Las tuplas son similares a las listas, pero son Es importante aclarar que, para crear una tupla
objetos inmutables. Una vez creada una tupla, con un único elemento, se debe usar (nótese la
no pueden añadirse ni removerse elementos. coma):
>>> t = (1, 2, 3, 4) >>> x = (1,)
Se crean indicando sus elementos entre Ya que los paréntesis son también utilizados para
paréntesis (aunque también pueden omitirse) y, agrupar expresiones y, de lo contrario, Python no
al igual que las listas, pueden contener objetos podría distinguir si se trata de una expresión o de
de distintos tipos, incluso otras tuplas. Se accede una tupla con un único elemento.
a sus elementos indicando su posición entre
corchetes. Siempre que requieras de un conjunto
ordenado de objetos, pensá si su contenido será
modificado en el transcurso del programa. En
caso afirmativo, creá una lista. De lo contrario,
una tupla.
Python Programming
Diccionarios
El último tipo de colección que veremos se Los valores en un diccionario pueden ser de
llama diccionario. Es lo que en otros lenguajes cualquier tipo, también otros diccionarios. Las
se conoce como vector o lista asociativa. Está claves solo pueden ser objetos inmutables (por
constituido por pares de una clave y un valor. ejemplo, cadenas, enteros, números de coma
flotante, tuplas; no así listas) y no pueden
>>> d = {"a": 1, "b": 2}
repetirse dentro de un mismo diccionario.
>>> d = {123: "Hola, mundo", True: 3.14,
En este caso, las claves son las cadenas “a” y (1, 2): False}
“b”, que están asociadas a los números 1 y 2, >>> d[123]
respectivamente. Así, accedemos a los valores 'Hola, mundo'
a partir de su respectiva clave. >>> d[True]
3.14
>>> d["a"] >>> d[(1, 2)]
1 False
>>> d["b"]
2
Python Programming
Diccionarios
Los pares clave-valor de un diccionario no Lo cual también sirve para añadir elementos:
pueden ser accedidos a partir de un índice
>>> d["c"] = "Hola mundo"
porque no es una colección ordenada.
>>> d
Para cambiar el valor de una clave mantenemos {'a': 1, 'c': 'Hola mundo', 'b': 3.14}
la misma sintaxis que en las listas:
>>> d = {"a": 1, "b": 2}
Y para remover un par clave-valor:
>>> d["b"] = 3.14
>>> d >>> del d["b"]
{'a': 1, 'b': 3.14} >>> d
{'a': 1, 'c': 'Hola mundo'}
Python Programming
len 1 del
Para conocer la cantidad de elementos de una colección
indistintamente del tipo, utilizamos la función len(). El len()
es una función propia del lenguaje, NO es un método puntual
de alguna colección.
>>> len([1, 2, 3])
3
>>> len((True, False))
2
>>> len({"a": 1})
1
>>> len("Hola mundo")
10
Python Programming
len 1 del
Python Programming
Unpacking
Las listas y tuplas soportan un método llamado La operación a, b, c = t equivale a:
unpacking (cuya traducción podría ser
>>> a = t[0]
desempaquetamiento”). Veámos en un ejemplo:
>>> b = t[1]
>>> t = (1, 2, 3) >>> c = t[2]
>>> a, b, c = t
>>> a
1 Es importante que la cantidad de objetos a la
>>> b izquierda coincida con el número de elementos
2 en la colección a la derecha.
>>> c
3
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 1
Python Programming
Operadores
Python Programming
Operadores aritméticos
Los operadores aritméticos son los más comunes Operador Nombre Ejemplo Resultado
que nos podemos encontrar, y nos permiten + Suma 5 + 6 11
realizar operaciones matemáticas sencillas.
- Resta 10 - 2 8
Los operadores aritméticos tienen orden de 3 * 10
* Multiplicación 30
prioridad, primero se respeta el () paréntesis,
/ División 5 / 2 2.5
luego los de mayor prioridad en orden:
% Módulo(Resto) 9 % 2 1
● Exponente
** Exponente 10 ** 2 100
● Multiplicación, División, División Entera, Módulo // División Entera 9 // 2 4
● Suma, Resta
Python Programming
Operadores asignación
Los operadores de asignación nos permiten realizar Operador Ejemplo si x = 7 Equivalente Resultado
una operación y almacenar su resultado en la = x = 7 x = 7 7
variable inicial.
+= x += 2 x = x + 2 9
Podemos ver cómo realmente el más importante -= x -= 2 x = x - 2 5
es el = igual. El resto son abreviaciones de otros *= x *= 2 x = x * 2 14
operadores que habíamos visto con anterioridad. /= x /= 2 x = x / 2 3.5
%= x %= 2 x = x % 2 1
Los operadores de asignación no son más que
atajos para escribir de manera más corta, y asignar //= x //= 2 x = x // 2 3
su resultado a la variable inicial. El operador += en **= x **= 2 x = x ** 2 49
x+=1 es equivalente a x = x + 1.
NO existe el operador ++ como existe en otros
lenguajes.
Python Programming
Operadores relacionales
Los operadores relacionales, o también llamados Operador Nombre Ejemplo si x=5 Resultado
de comparación nos permiten saber la relación == Igual x == 6 False
existente entre dos variables. Se usan para saber
!= Distinto x != 8 True
si por ejemplo un número es mayor o menor que
> Mayor x > 4 True
otro. Dado que estos operadores indican si se
cumple o no una operación, el valor que devuelven < Menor x < 3 False
Python Programming
Operadores lógicos
Los operadores relacionales, o también llamados Operador Acción
de comparación nos permiten saber la relación and Devuelve True si ambos elementos son True
existente entre dos variables. Se usan para saber
si por ejemplo un número es mayor o menor que or Devuelve True si al menos un elemento es True
otro. Dado que estos operadores indican si se
cumple o no una operación, el valor que devuelven
es True o False.
not Devuelve el contrario, True si es Falso y viceversa
Python Programming
Operadores especiales
Operador identidad
El operador de identidad nos indica si dos variables Esto es debido a que Python reutiliza el mismo
hacen referencia al mismo objeto. Esto implica que objeto que almacena el valor 10 para ambas
si dos variables distintas tienen el mismo id(), variables. De hecho, si usamos la función id(),
misma dirección de memoria, el resultado de podemos ver que el objeto es el mismo.
aplicar el operador is sobre ellas será True.
>>> id(a)
>>> a = 10 2618946775632
>>> id(b)
>>> b = 10
2618946775632
>>> a is b
True Definido el operador is, es trivial definir is not
porque es exactamente lo contrario.
Python Programming
Operador de pertenencia (membresía)
El operador de pertenencia in permite saber si un Por último, el operador not in realiza lo
elemento está contenido en una secuencia. Por contrario al operador in. Verifica que un
ejemplo, si un número está contenido en una lista elemento no está contenido en la secuencia.
de números. O una key(clave) en un diccionario.
>>> datos = [1,2,3]
>>> 3 in datos
True
>>> 10 in datos
False
Python Programming
Operador de Walrus
El operador walrus se introdujo en la versión Con walrus podemos simplificar las dos
Python 3.8, y se trata de un operador líneas de código anterior en tan solo una.
de asignación con una funcionalidad extra. Se
representa con dos puntos seguidos de un igual :=, (Asignación y salida por pantalla en una
lo que tiene un parecido a una morsa, siendo ”:” los sola línea)
ojos y ”=” los colmillos, por lo que de ahí viene su >>> print(dato:="Hola")
nombre (walrus significa morsa en inglés). Hola
Ejemplo:
>>> dato = "Hola"
>>> print(dato)
Hola
Python Programming
Operador a nivel bit , bitwise
Los operadores a nivel de bit son operadores que actúan Operador Acción
sobre números enteros, pero usando su representación | OR bit a bit
binaria. Si no sabes cómo se representa un número en & AND bit a bit
forma binaria, no hace falta que te hagas mucho problema,
~ NOT bit a bit
ya que estos operadores no se usan tan frecuentemente
como los otros. Su uso puede ser más empleado en ^ XOR bit a bit
lenguajes de bajo nivel, y Python no es un lenguaje de esas >> Desplazamiento bit a la derecha
características. Pero no está de más conocerlos. << Desplazamiento bit a la izquierda
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 1
Python Programming
Sentencias
de control
Python Programming
Condicional IF
Un código no deja de ser un conjunto de IF - ELSE
instrucciones que son ejecutadas unas tras otra.
Gracias a las estructuras de control IF, Es posible que no solo queramos hacer algo si
podemos cambiar el flujo de ejecución de un una determinada condición se cumple, sino que
programa, haciendo que ciertas partes del código además queramos hacer algo, en caso contrario.
se ejecuten si se dan condiciones particulares. Por eso usamos la cláusula else.
edad = 30
if edad < 18:
IF print("Sos menor de edad.")
Es muy importante tener en cuenta que la else:
print("Sos mayor de edad.")
sentencia IF debe ir terminada por : y el bloque
de código a ejecutar debe estar indentado. Notar que ambos bloques de código son excluyentes, se hace uno u
edad = 16
otro, pero nunca se ejecutarán los dos.
Python Programming
Condicional IF
IF - ELIF - ELSE
Hasta ahora hemos visto como ejecutar un bloque Cuando ninguna de las condiciones se cumple
de código si se cumple una condición, o ejecutar (es decir, todas retornan False), se ejecuta el
otro bloque si no se cumple, pero hay veces que bloque de código luego de else.
no es suficiente. En muchos casos, podemos tener
varias condiciones con diferentes posibilidades y Este lenguaje no tiene la sentencia de control
para cada una queremos un código distinto. switch, con lo antes visto podemos reemplazar
sin problema.
edad = 70
Python Programming
Condicional IF
Operador Ternario
El operador ternario es una herramienta muy potente que
muchos lenguajes de programación emplean. Se trata de
una cláusula if-else que se define en una sola línea y puede
ser usado dentro de un print().
valor = 10
print("Valor es 10" if valor==10 else "Valor no es 10")
out: Valor es 10
Python Programming
Condicional IF
Python Programming
Bucle WHILE
While nos permite ejecutar una sección de código El código imprime en pantalla los números del 1
repetidas veces. El código se ejecutará mientras una al 9 ya que, según la condición, el bucle debe
condición se cumpla. Cuando se deje de cumplir, se ejecutarse siempre que a sea menor a 10. En
sale del bucle y se continuará la ejecución normal. cada ejecución utiliza la función incorporada
print() para enviar un mensaje a la pantalla y
Suele llamarse iteración a una ejecución completa la sentencia a += 1 para incrementar el valor
del bloque de código. de a en 1 (es equivalente a a = a + 1). Si
a = 1 hubiésemos omitido esta última línea, el código
while a < 10: imprimiría 1 en pantalla infinitamente.
print(a)
a += 1
Python Programming
Bucle FOR
A diferencia de otros lenguajes, en Python el bucle Ejemplo:
“for” se utiliza para recorrer una colección de
datos = [10, 20, 30, 40]
objetos (una lista, tupla, diccionario, etc.). Se dice
for aux in datos:
que un objeto es “iterable” cuando puede ser print(aux)
“recorrido” (estrictamente hablando el concepto de
objeto iterable es un tanto más complejo, pero para Este código imprime en pantalla cada uno de
nuestro propósito vamos a obviar los detalles). los elementos en la lista datos. Le estamos
En el for no existe condición, sino un iterable que indicando a Python que “para cada elemento
define las veces que se ejecutará el código. En el de la lista datos, ejecute el siguiente código
siguiente ejemplo vemos un bucle for que se (print(aux)), luego de haber colocado el
ejecuta 4 veces. valor de dicho elemento en aux.
Python Programming
Break 1 Continue
Break Continue
La sentencia break nos permite alterar el El uso de continue nos permite modificar el
comportamiento de los bucles while y for. comportamiento de de los bucles while y for.
Concretamente, permite terminar con la
ejecución del bucle. Concretamente el continue saltea todo el
código restante en la iteración actual y vuelve
Esto significa que una vez se encuentra la al principio en el caso de que aún queden
palabra break, el bucle será terminado iteraciones por completar.
independientemente si la condición es
verdadera o falsa. La diferencia entre el break y continue es que
el continue no rompe el bucle, si no que pasa
a la siguiente iteración saltando el código
pendiente para terminar la vuelta actual.
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 1 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Sumatoria
Crear un bucle que almacene en una variable la
suma de todos los elementos numéricos de una
lista, con excepción del último.
Python Programming
¡Sigamos trabajando!
Python Programming
# Ejercicio 1. numeros = [1, 2, 3, 4, 5, 6] suma = 0 # Evitar sumar el último número de la lista.
for n in numeros[:-1]: suma = suma + n print(suma)
P1thon Programming
Módulo 1 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Mostrar 1 eliminar
Utilizando un bucle “while”, elaborar un código
que imprima en pantalla cada uno de los
elementos de una lista y simultáneamente los
elimine, hasta quedar vacía.
Python Programming
¡Sigamos trabajando!
Python Programming
# Ejercicio 2. numeros = [1, 2, 3, 4, 5, 6] print(numeros) while len(numeros) > 0: # Imprimir el
primer elemento. print(numeros[0]) # Eliminarlo. del numeros[0] #confirmamos que quedo vacia
la lista print(numeros)
P1thon Programming
Módulo 1
Python Programming
Funciones built-in
integradas
Python Programming
Funciones built-in
El intérprete de Python tiene un número de >>> input()
funciones integradas (built-in), las cuales están
siempre disponibles. Algunas las usamos La función input() permite a los usuarios
cotidianamente programando en Python, como, introducir datos desde la entrada estándar
por ejemplo: (normalmente se corresponde con la entrada de
un teclado). Los datos son tomados como str’ ,
>>> print() aunque los ingresos fueran números, son
tomados como string, luego hay que
Una de las acciones básicas e imprescindibles que convertirlos.
tiene que realizar un programa es la de mostrar
información por pantalla: texto, números,
resultado. La función print() es la que nos
permite mostrar por pantalla.
Python Programming
>>> range()
La “función” range() es algo un poco más Con tres argumentos se escribe range(m, n, p)
complejo que una función, pero se utiliza como si y crea una secuencia inmutable de enteros que
fuera una función. empieza en m y acaba n-1, aumentando los
valores de p en p. Si p es negativo, los valores
El range() con un único argumento se van disminuyendo de p en p.
escribe range(n) y crea una secuencia inmutable
de n números enteros consecutivos que empiezan El range() es fácil de iterar o recorrer con un
en 0 y acaba en n - 1. for y también sirve para crear listas con la
función incorporada list().
Con dos argumentos se escribe range(m, n) y
crea una secuencia inmutable de enteros
consecutivos que empieza en m y acaba en n - 1.
Python Programming
>>> int() >>> len()
>>> float()
Retorna el tamaño (el número de elementos) de
>>> str() un objeto. El argumento puede ser una secuencia
Hacer un cast o casting significa convertir un tipo (como una cadena, un objeto byte, una tupla, lista
de dato a otro. Anteriormente hemos visto tipos o un rango) o una colección (como un diccionario,
como los int, string o float. Pues bien, es posible un set o un frozen set).
convertir de un tipo a otro con las funciones
correspondientes, siempre y cuando se pueda
realizar la conversión.
Inclusive se puede convertir diferentes conjuntos Para ver más funciones built-in podés ver la
a listas, con list(), o a tuplas con tuple(). documentación oficial de funciones built-in
Python Programming
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 1
Python Programming
Funciones propias
Python Programming
Funciones en P1thon
Anteriormente hemos usado funciones nativas La palabra reservada pass no solo se emplea
que vienen con Python, como len() para calcular para completar código de bloques vacíos en
la longitud de una lista, o type() para saber el tipo funciones, también se la emplea para completar
de dato. Pero al igual que en otros lenguajes de bloques vacíos de sentencias de control. Y para
programación, también podemos definir nuestras completar clases vacías en orientación a objetos.
propias funciones. Para ello hacemos uso de la
palabra reservada def.
def funcion():
pass
La función anterior no hace nada. La palabra
reservada pass sirve para rellenar un bloque de
código requerido sintácticamente (no podría estar
vacío porque lanzaría un error de sintaxis).
Python Programming
Anatomía de una función
def nombre_funcion(argumentos):
# código
return retorno
Las funciones que definimos permiten agrupar un bloque
de código o conjunto de instrucciones. Opcionalmente,
reciben uno o más argumentos y retornan un valor.
En Python, para crear una función empleamos la palabra
reservada def seguido de su nombre y sus parámetros
entre paréntesis, en caso de tener. A continuación, se
coloca su contenido utilizando una indentación.
Python Programming
Vamos a crear un ejemplo de nombre sumar con Ejemplo:
dos parámetros cuyos nombres son a y b, y que
retorne el resultado de la suma de ambos. def sumar(a, b):
print( a + b)
def sumar(a, b):
c = a + b print(sumar(10,20))
return c
out: 30
El uso del return permite salir de la función out: None
(terminarla) y transferir la ejecución de vuelta a
donde se realizó la llamada. Se puede devolver Los nombres de las funciones en Python
uno o varios parámetros, pero una vez que se siguen las mismas reglas que los nombres
llama al return se detiene la ejecución de la de las variables, se escriben en minúscula y
función y se vuelve o retorna al punto donde fue con guiones bajos en lugar de espacios vacíos.
llamada. Cuando una función no retorna ningún
valor (es decir, no incluye la palabra reservada
return), por defecto retorna None.
Python Programming
Argumentos por defecto
Para indicar parámetros opcionales, indicamos su
valor por defecto con el signo de igual (=).
def imprimir_mensaje(mensaje="No has escrito nada."):
print(mensaje)
imprimir_mensaje("Hola mundo")
imprimir_mensaje()
Python Programming
Los argumentos con valores por defecto siempre def sumar(a=5, b=10):
deben ir al final de la función. Por ejemplo, el return a + b
siguiente código es inválido: sumar()
out: 15
def sumar(a=5, b):
return a + b sumar(b=50)
out: 55
A los argumentos con valores por defecto se los
sumar(7, 5)
conoce como keyword arguments o argumentos
out: 12
por nombre , ya que al llamar a la función se
puede especificar su valor indicando su nombre, sumar(a=7, b=5)
como se ve en el ejemplo a continuación. out: 12
Python Programming
Documentación en funciones
Ahora que ya tenemos nuestras propias funciones
creadas, muchas veces en algún proyecto debamos
compartirlas con otros programadores, para que sean
parte de un programa complejo.
Leer código ajeno no es tarea fácil, por eso es
importante documentar las funciones.
def sumar(a, b):
"""
Descripción de la función. Como debe ser usada,
que parámetros acepta y que devuelve
"""
return a+b
Python Programming
Para crear un texto que nos diga qué hace la
función podemos crear un comentario del tipo
párrafo usando la triple comilla """ al principio de
la función. Es únicamente al principio no en otro
lado. Esto no forma parte del código, es un simple
comentario un tanto especial, conocido
como docstring.
Ahora cualquier persona que haga uso de nuestra
función, podrá acceder a la ayuda de la función
con help() y obtener las recomendaciones
nuestras de cómo debe ser usada.
help(sumar)
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 1 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Sucesión de Fibonacci
En matemática, se conoce a la sucesión de Fibonacci
como una sucesión infinita de números naturales en
la que cada término está determinado por la suma de
los dos términos anteriores.
Por ejemplo, empezando con el 0 y el 1, los primeros
20 términos son los siguientes:
Python Programming
Crear una función en Python que tome como argumento
un entero que indique la cantidad de términos y retorne
una lista como la anterior. Por ejemplo:
>>> fib(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> fib(1)
La cantidad debe ser mayor a 2.
Python Programming
¡Sigamos trabajando!
Python Programming
def fibo(cantidad):
# Chequear que la cantidad sea un valor válido.
if cantidad <= 2:
# Terminar la función.
return "La cantidad de terminos debe ser mayor que 2"
# Esta es la lista que vamos a retornar. Por definición empieza
# con los términos 0 y 1.
f = [0, 1]
# Añadir elementos hasta haber alcanzado la cantidad indicada.
while len(f) < cantidad:
# Agregamos al final de la lista un elemento que es la suma
# de los dos anteriores.
f.append(f[-1] + f[-2])
return f
print(fibo(1))
print(fibo(10))
P1thon Programming
Módulo 1
Python Programming
Ámbito de
las variables
Python Programming
Ámbito de las variables
Las variables en Python son locales por defecto. En Python NO es aconsejable hacer uso de
Esto quiere decir que las variables definidas y variables globales, ya que disminuye la
utilizadas en el bloque de código de una función, legibilidad de código (fundamental). Su uso
sólo existen dentro de la misma, y no interfieren puede producir efectos colaterales, produciendo
con otras variables del resto del código. alteraciones no previstas en una parte del
programa y, por lo tanto, pueden afectar el uso
A su vez, las variables existentes fuera de del valor en otra zona. Entonces, concluimos que
una función, no son visibles dentro de la misma. dificultan la forma del trabajo modular del
En caso de que sea conveniente o necesario, una código.
variable local puede convertirse en una variable
global declarándola explícitamente como tal con la
sentencia global.
Python Programming
Ejemplo de uso de una variable global: La palabra reservada “global” es la que termina
avisándole al interprete que esa variable es la
variable = 10
variable que está fuera de la función. Si no se
def funcion(): usa, el comportamiento de la variable dentro y
global variable fuera de la función es independiente.
variable = 5
Recordamos que es totalmente desaconsejable
print(variable) el uso de variables globales.
funcion()
print(variable)
out: 10
out: 5
Python Programming
Paso por valor 1 por referencia
En muchos lenguajes de programación existen los En Python las cosas son un poco distintas, y el
conceptos de paso por valor y por referencia que comportamiento estará definido por el tipo de
aplican a la hora de cómo trata una función a los variable con la que estamos tratando.
parámetros que se le pasan como entrada.
Veamos un ejemplo de paso por valor.
Si usamos un parámetro pasado por valor, se
def funcion(entrada):
creará una copia local de la variable, lo que implica
entrada = 0
que cualquier modificación sobre la misma no
tendrá efecto sobre la original. dato = 5
funcion(dato)
Con una variable pasada como referencia, se
print(dato)
actuará directamente sobre la variable pasada,
por lo que las modificaciones afectarán a la out: 5
variable original.
Python Programming
En el ejemplo anterior iniciamos “dato” con 5 y se El ejemplo anterior nos podría llevar a pensar
lo pasamos a funcion(). Dentro de la función que si en vez de añadir un elemento a “dato”,
hacemos que la variable valga 0. Dado que Python hacemos entrada=[], estaríamos destruyendo
trata a los int como pasados por valor, dentro de la lista original. Sin embargo, esto no sucede.
la función se crea una copia local de x, por lo que
def funcion(entrada):
la variable original no es modificada. entrada = []
No pasa lo mismo si por ejemplo “dato” es una
x = [10, 20, 30]
lista. En este caso Python lo trata como si estuviese funcion(x)
pasada por referencia, lo que hace que se modifi- print(x)
que la variable original. La variable original “dato”
ha sido modificada. out: [10, 20, 30]
def funcion(entrada):
entrada.append(40)
dato = [10, 20, 30]
funcion(dato)
print(dato)
out: [10, 20, 30, 40]
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 1
Python Programming
Argumentos de
longitud variable
Python Programming
Argumentos de longitud variable
Imaginemos que queremos una función sumar() La propuesta es válida, cumple con nuestro
como la de los ejemplos, pero en este caso requisito, pero realmente no estamos trabajan-
necesitamos que sume todos los números de do con argumentos de longitud variable. En
entrada que se le pasen, sin importar si son 3, 100 realidad, tenemos un solo argumento, una lista.
o 1000. Una primera forma de hacerlo sería con
una lista: Por suerte para nosotros, Python tiene una
solución muy potente y sencilla a la vez. Si
def sumar(numeros): declaramos un argumento con * (asterisco
parcial = 0 típicamente acompañado con el nombre args,
for n in numeros:
pero no es obligatorio usar ese nombre).
parcial += n
return parcial
sumar([10,0,5,4])
out: 19
Python Programming
Al declarar la función con un parámetro *, hará que los
argumentos, sean la cantidad que fueran, lleguen
individualmente y que una vez recibido la función lo
empaquete en una tupla de manera automática.
Atención: No confundir * con los punteros en otros lenguajes de
programación, no tiene nada que ver ¡En Python existen los punteros
a memoria!
def sumar(*args):
print(type(args))
print(args)
total = 0
for n in args:
total += n
return total
sumar(10,0,5,4)
out: <class 'tuple'>
out: (10,0,5,4)
out: 19
Python Programming
Usando doble ** es posible también tener como Ejemplo:
parámetro de entrada una cantidad arbitraria de
def sumar(**kwargs):
elementos almacenados en forma de clave y valor print(type(kwargs))
(diccionario). print(kwargs)
total = 0
El doble asterisco ** (usualmente acompañado por for n in kwargs:
el nombre kwargs) captura cualquier keyword total+= kwargs[n]
argument que no haya sido definido junto con la print(total)
función. Los argumentos capturados por este
operador son almacenados, como dijimos, en un sumar(a=5, b=20, c=23)
diccionario que tiene como claves los strings que
out: <class 'dict'>
representan los nombres de los argumentos, y out: {'a': 5, 'b': 20, 'c': 23}
como valor, el valor del argumento. Este operador out: 48
debe ir al final de la definición de otros
parámetros, si los hubiera.
Python Programming
Orden para usar diferentes argumentos
Si tuviéramos una función que hiciera uso de Ejemplo:
diferentes tipos de argumentos; deberíamos
def funcion(a,b,*args,c=100,**kwargs):
usarlos con un cierto orden.
print(a)
Primero argumentos posicionales (argumentos print(b)
comunes), después los argumentos arbitrarios print(args)
print(c)
posicionales (*args), a continuación, los keywords
print(kwargs)
arguments (argumentos por defecto), y por último
número arbitrario de keywords arguments
(**kwargs).
En caso de usarlos de otra manera el resultado
puede ser un error, o no poder hacer uso correcto
del argumento por defecto.
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 1 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Promedio variable
Construir una función que se llame “promedio_variable”.
Esta función debe tomar un número arbitrario de
argumentos numéricos y devolver el promedio.
Python Programming
¡Sigamos trabajando!
Python Programming
# Si se desea para hacer la suma se puede usar la funcion built-in
sum()
# de esa manera evitas el uso del for
def promedio_variable(*args):
suma = 0
for n in args:
suma += n
promedio = suma / len(args)
return promedio
#############################
print(promedio_variable(10,8,9))
print(promedio_variable(6,6,9,9))
P1thon Programming
Módulo 01 - Desafío
Python Programming
¿Qué son los desafíos?
● Son ejercicios complementarios a los realizados en clase.
● Permiten practicar y consolidar los conocimientos adquiridos.
● Es recomendable que los realices antes de rendir el
examen de la clase.
Python Programming
Ejercicio 1: ¿Estás ahí?
Dada 2 listas con números enteros, crear una tercera con los
números que pertenecen a ambas. Pero con la salvedad que
en esta tercera no debe tener elementos repetidos.
primera = [7, 5, 10, 9, 8, 1, 3, 5, 6, 3, 8, 0, 10, 9, 2]
segunda = [6, 9, 3, 7, 9, 10, 5, 10, 7, 4, 5, 3, 2, 10, 2]
Python Programming
Ejercicio 2: Contador de ingresos
Tenemos una lista donde se registran los ingresos del
personal a un sistema:
personas = ["Susana","Tamara","Ana","Susana","Susana","Tomas","Ana"]
Python Programming
Ejercicio 3: Tic Toc
Crear una función que reciba un número como
argumento, ese número representará los segundos
que se quieren convertir a horas, minutos y segundos.
Por ejemplo, conversion(3600) retornaría el texto
“01:00:00” , en cambio si recibe 1000, devolverá
“00:16:40”
No se puede usar ninguna función built-in, ni
tampoco ningún módulo que haga la conversión.
Python Programming
En la sección de Descargas encontrarás los recursos
necesarios para realizar los ejercicios y su resolución
para que verifiques cómo te fue.
Python Programming
¡Terminaste el módulo!
Estás listo para rendir el examen
Python Programming
def conversion(segundos):
minutos = int(segundos / 60)
horas = int(minutos / 60)
minutos_resto = minutos - (horas*60)
segundos_resto = segundos - (horas*60*60) - (minutos_resto *60)
if horas<10:
horast = "0" + str(horas)
else:
horast = str(horas)
if minutos_resto < 10:
minutost = "0" + str(minutos_resto)
else:
minutost = str(minutos_resto)
if segundos_resto < 10:
segundost = "0" + str(segundos_resto)
else:
segundost = str(segundos_resto)
#####################################################
print(conversion(1000))
personas =
["Susana","Tamara","Ana","Susana","Susana","Tomas","Ana"]
ingresos = {}
for n in personas:
if n not in ingresos:
ingresos[n] = 1
else:
ingresos[n] += 1
print(ingresos)
tercera = []
for n in primera:
if n in segunda and n not in tercera:
tercera.append(n)
print(tercera)
P1thon Programming
Módulo 2
Python Programming
Funciones de orden
superior 1 anónimas
Python Programming
Funciones de orden superior
Podemos crear funciones que pueden tomar def sumar(x):
funciones como parámetros y también retornar return x+100
(devolver) funciones como resultado. Una función def cuadrado(x):
que hace ambas cosas, o alguna de ellas, se la return x**2
llama función de orden superior. En el ejemplo def superior(funcion,lista):
genérico de la derecha se pasa una función y una resultado = []
lista para que la función superior() trabaje. for n in lista:
resultado.append(funcion(n))
Existen algunas funciones de orden superior return resultado
incorporadas (built-in) en Python como map() y numeros = [2,5,10]
filter(). Te recomendamos leer la documenta-
ción oficial del lenguaje para que las conozcas y print(superior(sumar,numeros))
out: [102, 105, 110]
veas cuáles son sus características.
print(superior(cuadrado,numeros))
out: [4, 25, 100]
Python Programming
Funciones anónimas o lambda
Las funciones lambda son un tipo de funciones Y la de sumar(x):
que típicamente se pueden escribir en una línea y
lambda x : x+100
cuyo código a ejecutar suele ser pequeño.
Resulta complicado explicar las diferencias porque, Y con la función superior(funcion,lista)
básicamente, la diferencia es cómo se escribe, la quedaría así:
sintaxis. Para que tengas una idea, son funciones print(superior(lambda x : x**2 , numeros))
que queremos usar y descartar. Idealmente se out: [102, 105, 110]
usan como argumento en funciones de orden
superior. print(superior(lambda x : x+100 , numeros))
out: [4, 25, 100]
La función cuadrado(x) que usamos en el ejemplo
anterior la podríamos escribir como:
lambda x : x**2
Python Programming
A las funciones anónimas también se les puede
asignar un nombre como si fuera una variable (en
realidad, como si fuera un objeto). Esto último no es
muy aconsejable y no fueron pensadas para esto.
Pero si estamos en la consola interactiva haciendo
pruebas, puede ser de gran utilidad para definir
pequeñas subrutinas.
>>> cuadrado = lambda x : x**2
>>> cuadrado(10)
100
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 2 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Orden superior
Cree una función llamada superior”, que reciba por
argumento una función y una lista. La función que se
pasa por argumento a superior debe elevar al cubo un
número y retornarlo. Para que luego al aplicarla en la
de orden superior, esa operación se realice miembro
a miembro de la lista.
Para finalizar la función “superior” debe de devolver
una nueva lista.
Python Programming
¡Sigamos trabajando!
Python Programming
def superior(funcion,lista):
nueva = []
for n in lista:
nueva.append(funcion(n))
return nueva
######################################
print(superior(lambda x : x**3,[1,2,3]))
P1thon Programming
Módulo 2
Python Programming
Capturar
excepciones
Python Programming
Capturar excepciones
Python cuenta con soporte de primer nivel para Es posible hacer uso de las excepciones que
excepciones. Las excepciones son un modelo incorpora el lenguaje. Algunas de ellas son:
para el manejo de errores. ValueError, TypeError, RuntimeError,
KeyError (la convención de nombramiento
En otros lenguajes, como en C, se acostumbra a difiere de las funciones y otros objetos; en las
que las funciones retornen un valor específico excepciones cada término se escribe con su
cuando ocurre algún error. El código que llama a primera letra en mayúscula y no se emplean
dicha función chequea el valor de retorno y toma guiones bajos).
las medidas necesarias. En Python, cuando una
función falla, en lugar de retornar un valor en Por ejemplo, int() sirve para convertir
particular lanza una excepción (vía la palabra números de coma flotante y cadenas a su
reservada raise). El código que invocó a dicha respectiva representación númerica.
función puede implementar un bloque para
>>> int("3")
capturarla vía try y except.
3
Python Programming
Cuando la cadena no puede ser convertida a entero
porque no es un número, lanza la excepción ValueError.
Python Programming
Es importante aclarar que, si una excepción se propaga
sin que ningún bloque de código la capture, el programa
finaliza inmediatamente sin concluir las líneas de código
siguientes si las hubiera.
Ahora bien, int() lanzará TypeError cuando se le pase
como argumento un objeto que no pueda ser
representado como un número, por ejemplo, una lista.
Simplemente podemos agregar otra cláusula except para
capturar dicha excepción.
try:
int([1,2,3])
except ValueError:
print("Eso no es un número.")
except TypeError:
print("Eso es una colección, no se puede convertir a entero")
Python Programming
O bien si queremos capturar ambas excepciones en un
mismo bloque de código:
try:
int([1,2,3])
except (ValueError, TypeError):
print("Tipo de dato incorrecto o no puede ser convertido")
out: Tipo de dato incorrecto o no puede ser convertido
Python Programming
A los ya vistos bloques try, except y else Otra forma si no sabes qué excepción puede
podemos añadir un bloque más, el finally. lanzarse, puedes usar la clase genérica Exception,
Dicho bloque se ejecuta siempre, haya o no que controla cualquier tipo de excepción. Todas
haya habido excepción. las excepciones heredan de Exception.
try: try:
int("10") int("Hola mundo")
except Exception: except Exception:
print("Ocurrió un error.") print("Ocurrió un error.")
else:
print("Todo salió bien.")
finally:
print("Final del bloque")
out:
Todo salió bien
Final del bloque
Python Programming
Otras excepciones
La excepción KeyError es lanzada cuando se La excepción IndexError es lanzada cuando
intenta acceder a una clave de un diccionario se intenta acceder a un índice de una lista
que no existe: que no existe:
>>> d = {"a": 1} >>> numeros = [10,20,30]
>>> d["b"] >>> numeros[8]
Traceback (most recent call last): Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <module>
KeyError: 'b'
IndexError: list index out of range
Python Programming
La excepción ZeroDivisionError es lanzada cuando se
intenta dividir por cero:
>>> 10 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 2
Python Programming
Lanzar
excepciones
Python Programming
Lanzar excepciones
Ahora volvamos al ejemplo de nuestra
rudimentaria función sumar(), que se veía así:
def sumar(a, b):
return a + b
Python Programming
Utilizando la función incorporada isinstance()
podemos chequear si un objeto es de un tipo
de dato determinado.
def sumar(a, b):
if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
raise TypeError("Se requieren dos numeros.")
return a + b
print(sumar(7, 5)) #Imprime 12.
out: 12
print(sumar(2.5, 3.5)) # Imprime 6.
out: 6.0
print(sumar([1, 2], [3, 4])) # Lanza la excepción.
out:
raise TypeError("Se requieren dos numeros.")
TypeError: Se requieren dos numeros.
Python Programming
El segundo argumento de isinstance() puede ser un
tipo de dato o una tupla. Si es un tipo de dato, retorna
True si el primer argumento efectivamente coincide con
ese tipo de dato; si es una tupla, retorna True si el
primer argumento coincide con alguno de los tipos de
datos contenidos en ella.
Por convención, se estila lanzar TypeError cuando se
quiere indicar que se obtuvo un argumento de un tipo
inesperado, y ValueError cuando el tipo es correcto
pero el valor no lo es.
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 2 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Calculadora
Crear un programa que solicite dos números Teniendo en cuenta lo siguiente:
en consola e imprima el resultado de las
cuatro operaciones aritméticas aplicadas ● Si el usuario ingresa cualquier otra cosa
sobre ellos. Por ejemplo (en rojo la entrada que no sea un número, debe volver a
del usuario): preguntar, en ambos casos.
Python Programming
¡Sigamos trabajando!
Python Programming
def solicitar_numero(mensaje):
while True:
try:
return float(input(mensaje))
except ValueError:
print("Hay un error")
#################################################
print("a + b:", a + b)
print("a - b:", a - b)
print("a * b:", a * b)
try:
print("a / b:", a / b)
except ZeroDivisionError:
print("No se puede dividir por cero.")
P1thon Programming
Módulo 2 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Países
Crear un script que solicite al usuario el Si el código ingresado no se encuentra en
código de un país e imprima su nombre, el diccionario, debe imprimir un mensaje en
de acuerdo con el siguiente diccionario: pantalla y volver a preguntar. Si el usuario
escribe “salir”, el programa debe terminar.
# Diccionario código: país.
paises = {
"ar": "Argentina",
"es": "España",
"us": "Estados Unidos",
"fr": "Francia"
}
Python Programming
¡Sigamos trabajando!
Python Programming
paises = {
"ar": "Argentina",
"es": "España",
"us": "Estados Unidos",
"fr": "Francia"
}
while True:
codigo = input("Ingrese un codigo: ")
if codigo == "salir":
break
try:
print(paises[codigo])
except KeyError:
print("El código es invalido, vuelve a intentarlo.")
P1thon Programming
Módulo 2
Python Programming
Características 1
operaciones sobre
cadenas
Python Programming
Strings, conceptos básicos
Python fue creado para desarrollar scripts Este trabajo implica tareas como: buscar un
(programas para automatización de tareas). carácter, una palabra o frase en una cadena,
El tiempo lo convirtió en un lenguaje de eliminar caracteres innecesarios, reemplazar
programación multipropósito. unos caracteres por otros, etc. Las cadenas de
Python proveen de forma estándar varios
Tiene incorporando todo un conjunto de métodos (funciones propias del objeto) para
características que lo hacen ideal para tareas realizar este tipo de operaciones.
de scripting. Por ejemplo, muchas de las
herramientas de varios sistemas operativos
basados en Linux están escritas en Python,
razón por la cual las distribuciones suelen
contener uno o dos intérpretes del lenguaje.
Al realizar tareas de scripting trabajaremos
todo el tiempo con cadenas de caracteres.
Python Programming
Primero, tengamos en cuenta que las cadenas en >>> texto = "Python"
Python funcionan como las colecciones, en donde >>> texto[2]
cada uno de los elementos es un carácter que se 't'
puede ubicar por un índice. De modo que las
>>> texto[2:]
operaciones de «Slicing» y acceso a elementos a
'thon'
través de índices funciona sin diferencias
respecto de las listas y tuplas. Hagamos algunas ¿Se puede recorrer con un for? Si.
pruebas.
for n in texto:
print(n)
out:
P
y
t
h
o
n
Python Programming
Se pueden concatenar: Las cadenas son inmutables. Esto significa que
una vez creadas no pueden modificarse. En
>>> nombre = "Luke"
efecto, si intentamos modificar una cadena el
>>> apellido = "Skywalker"
>>> nombre + " " + apellido intérprete nos indica que a ésta no se pueden
'Luke Skywalker' asignar elementos.
>>> texto = "python"
Es posible la concatenación múltiple (copias): >>> texto[0] = "P"
>>> saludo = "Hola!" Traceback (most recent call last):
File "<stdin>", line 1, in <module>
>>> saludo*3
TypeError: 'str' object does not support item
'Hola!Hola!Hola!' assignment
Python Programming
Caracteres especiales
Los caracteres especiales, como el de salto Para evitar que los caracteres especiales sean
de línea (\n) o tabulación (\t), son difíciles de “traducidos” a su representación
detectar al imprimir una cadena puesto que, correspondiente, Python nos provee la función
justamente, no se imprimen literalmente sino repr().
que toman alguna forma en particular: el
carácter \n se traduce como nueva línea y el Que imprime en pantalla, en efecto, los
carácter \t como un segmento vacío de caracteres literalmente:
longitud equivalente al de cuatro espacios. >>> print(repr(dato))
Por ejemplo, este código: '\tHola\nChau’
>>> dato = "\tHola\nChau"
Esto es especialmente útil cuando obtenemos
>>> print(dato)
Hola
información de un archivo o alguna otra fuente
Chau similar y debemos trabajar con la cadena literal.
Python Programming
Métodos de los strings
Las cadenas, nos proporcionan métodos que nos facilitan su
manipulación. Por ejemplo, una tarea bastante común, es la
de querer determinar si una cadena comienza o termina con
determinados caracteres, tenemos los métodos startswith()
y endswith() que retornan un booleano.
>>> frase = "¿Caminos? a donde vamos no necesitamos caminos"
>>> frase.startswith("¿Caminos?")
True
>>> frase.startswith("¿")
True
>>> frase.endswith("caminos")
True
>>> frase.endswith(".")
False
Python Programming
Otra operación bastante común es la de Pero también .strip() nos puede ser útil para
querer eliminar los espacios iniciales y finales quitar caracteres especiales del principio o del
de una cadena. Por ejemplo, si le solicitamos final de un str.
el nombre a un usuario a través de la consola
>>> dato = "\t\nHola\nChau"
(vía la función input()) y accidentalmente
>>> print(dato.strip())
ingresa un espacio al final antes de presionar Hola
la tecla Enter. En ese caso tendríamos una Chau
cadena como la siguiente:
Borro el \t\n del principio, pero no manipulo el
>>> nombre = "Juan "
>>> nombre.strip() \n del medio. Si hubiera estado al final, lo habría
'Juan' borrado también. Esto es especialmente útil al
trabajar con los archivos texto (txt), pudiendo
eliminar el salto de línea al leer renglones.
Python Programming
Para reemplazar un (conjunto de) carácter(es) por
otro tenemos a disposición la función replace().
>>> frase = "¡Nuestro gato se llamaba Indiana!"
>>> frase.replace("gato","perro")
'¡Nuestro perro se llamaba Indiana!'
Python Programming
Cuando queremos cortar una cadena en Al finalizar los elementos de la lista resultante no
función de un delimitador (como una coma o contienen el delimitador. Si el delimitador no es
un espacio vacío), usamos la función split(), encontrado en la cadena, el resultado es una lista
que retorna una lista. de un solo elemento.
>>> nombres = "Lautaro José Sofía"
>>> nombres.split()
['Lautaro', 'José', 'Sofía']
Python Programming
El método find() toma como argumento una .upper() y .lower() convierten los
cadena y retorna la posición en la que se encuentra caracteres de la cadena a mayúsculas
dentro de la cadena desde donde fue invocada la y minúsculas, respectivamente.
función, o -1 en caso de no ser encontrada.
>>> saludo = "Hola Mundo"
>>> cita = "lo esencial es invisible a los ojos" >>> saludo.upper()
>>> cita.find("invisible") 'HOLA MUNDO'
15 >>> saludo.lower()
>>> cita.find("principio") 'hola mundo'
-1
Python Programming
Otros métodos
● str.isdecimal() devuelve True si todos ● str.capitalize() devuelve una copia de la
los caracteres de la cadena son decimales y cadena con su primer carácter en mayúscula
si hay al menos un carácter. Falso en caso y el resto en minúsculas.
contrario. Los caracteres decimales son
aquellos que se pueden usar para formar
números en base 10
● str.swapcase() devuelve una copia de
la cadena con caracteres en mayúscula
convertidos a minúsculas y viceversa.
● str.title() devuelve una versión en
formato título. Las palabras comienzan
con un carácter en mayúscula y el resto Puedes encontrar más en la documentación oficial:
de caracteres en minúsculas. “métodos de los strings”
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 2
Python Programming
Formar cadenas
Python Programming
Formar cadenas
Es bastante usual tener que incluir otros tipos de
datos dentro de una cadena, podemos usar la
función str() para poder concatenar otros tipos de
datos. Pero cuando debemos hacerlo con una gran
cantidad de datos, sobre otro string, nos resultará
conveniente utilizar el método format().
Python Programming
En el código creamos una cadena, en donde
queremos incluir los objetos nombre y edad (una
cadena y un entero, respectivamente). En su lugar,
colocamos {0} y {1} (y así sucesivamente en relación
con la cantidad de objetos que queramos incluir) y
por último llamamos a .format() pasándole como
argumentos los elementos que queremos insertar
dentro de mensaje.
Las cadenas en Python son objetos inmutables, por
lo que .format() retorna una nueva cadena con los
valores reemplazados.
Python Programming
A partir de la versión 3.6 Python introduce una
manera más legible, que consiste en poner nombres
de variables entre llaves dentro de una cadena y
anteponiendo la letra f.
>>> nombre = "Pablo"
>>> edad = 30
>>> mensaje = f"Hola, mi nombre es {nombre}. Tengo {edad} años."
>>> mensaje
'Hola, mi nombre es Pablo. Tengo 30 años.'
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 2 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Ma1úsculas
Se tiene una lista de personas como la siguiente:
["juan salvo","henry courtney","elizabeth bennet","marge simpson"]
Python Programming
¡Sigamos trabajando!
Python Programming
def mayusculas(texto):
separo = texto.split()
devolucion = f"{separo[0].capitalize()}
{separo[1].capitalize()}"
return devolucion
def aplicar(funcion,lista):
nueva = []
for n in lista:
nueva.append(funcion(n))
return nueva
###################################################################
###########
print(aplicar(mayusculas,personas))
P1thon Programming
Módulo 2
Python Programming
Trabajar con
archivos txt
Python Programming
Escribir 1 leer archivos
Al igual que en otros lenguajes de programación Para escribir y crear se usa modo="w", además en
en Python es posible crear, abrir y leer archivos. este modo si el archivo existe se sobrescribe.
Y por último el modo="a" de append para añadir
La función incorporada open() toma como contenido al final del archivo si existe el mismo.
argumento la ruta de un archivo y retorna una
instancia del tipo file.
f = open("archivo.txt", modo)
Python Programming
En cualquiera de los casos anteriores, si no se
especifica una ruta, el fichero se busca en el
directorio actual (ruta relativa). Y si vas a especificar
la ruta (ruta absoluta), la misma se escribe con doble
barra para separar los directorios o barra invertida.
"C:\\Users\\Anonimo\\Desktop\\Python Programming\\mi_archivo.txt"
"C:/Users/Anonimo/Desktop/Python Programming/mi_archivo.txt"
Python Programming
Métodos para trabajar con archivos
Cuando abrimos un archivo para leer, el Si quieres leer todas las líneas de un archivo,
método .read() retorna el contenido del puedes usar f.readlines() que crea una lista,
archivo abierto en formato string. y cada elemento de esta es un renglón del
archivo.
f = open("archivo.txt", "r")
print(f.read())
f.close()
Python Programming
Por otro lado, cuando abrimos un archivo en f = open("archivo.txt", "a")
modo escritura, usamos el método .write() f.write("Hola ")
f.write("mundo")
f = open("archivo.txt", "w") f.close()
f.write("Hola mundo")
f.close() También podemos usar el método writelines()
y pasarle una lista como argumento para que
La función write() graba una cadena en el guarde el contenido.
archivo. Si trabajamos en modo “w”
reemplazará todo el contenido del archivo, Cuando trabajamos con archivos es importante
si el archivo existe, si no existe, lo crea. cerrarlo cuando acabamos de trabajar con ellos,
vía el método close(). Aunque es verdad que los
Recordemos que para añadir datos al final ficheros normalmente son cerrados y guardados
del archivo sin borrar información previa, el automáticamente, es importante especificarlo
fichero debe abrirse en la modalidad append para evitar tener comportamientos inesperados.
("a") y también se usa .write() .
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 2
Python Programming
Sentencia with
Python Programming
Uso de ¢with£ archivos
Es una buena práctica utilizar la sentencia with
cuando se trata de archivos. La ventaja es que el
archivo se cierra correctamente después de que
finaliza su uso, incluso si se genera una excepción
en algún momento.
Python Programming
¡Si no utilizas with, debes llamar a f.close(), si o si,
para cerrar el archivo y liberar inmediatamente los
recursos del sistema.
¡Cuidado! Usar f.write() sin usar with o f.close()
puede resultar en que no se escriban completamente
los datos en el archivo. f.close
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 2 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Guardar datos
Cree un algoritmo para guarda cada una de las
personas del diccionario personas en un txt.
personas = {"Juan":20,"Romina":32,"Tamara":25,"Melanie":19}
Python Programming
¡Sigamos trabajando!
Python Programming
personas = {"Juan":20,"Romina":32,"Tamara":25,"Melanie":19}
try:
with open("personas.txt","w") as f:
for n in personas:
texto = f.write(f"{n.lower()}-{personas[n]}"+"\n")
print("Salvado")
except FileNotFoundError:
print("No se puede grabar")
P1thon Programming
Módulo 2 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Rescatar datos
Cree un algoritmo para volver al diccionario original
desde el archivo personas.txt creado en el ejercicio
anterior.
El nombre se tiene que recuperar en mayúsculas y
cada valor debe volver a ser del tipo entero.
El diccionario tendría que volver a verse como:
personas = {"Juan":20,"Romina":32,"Tamara":25,"Melanie":19}
Python Programming
¡Sigamos trabajando!
Python Programming
personas = {}
try:
with open("personas.txt","r") as f:
datos = f.readlines()
for n in datos:
p = (n.strip()).split("-")
personas[p[0].capitalize()] = int(p[1])
print("Rescatados")
print(personas)
except FileNotFoundError:
print("No se puede recuperar")
P1thon Programming
Módulo 2
Python Programming
Módulos 1
paquetes
Python Programming
Biblioteca estándar de P1thon
La biblioteca estándar contiene módulos Algunos de estos módulos están diseñados
integrados (escritos en lenguaje C) que brindan explícitamente para fomentar y mejorar la
acceso a funciones del sistema operativo, como portabilidad de los programas al abstraer los
por ejemplo, E/S de archivos que de otra manera aspectos específicos de los sistemas operativos
serían inaccesibles para los programadores, así creando una interfaz neutral a la plataforma en
como módulos escritos en Python que brindan donde corre el intérprete.
soluciones estandarizadas para muchos
problemas que ocurren en programación diaria.
Python Programming
Módulos 1 paquetes
Un módulo es un archivo de Python cuyos Módulos genéricos para el SO y Servicios
objetos (funciones, clases, variables, ● os - Interfaces para interactuar con el
constantes, etc.) pueden ser accedidos desde sistema de archivos.
otro archivo. Mientras que un paquete es una
● time - Tiempo y conversiones.
carpeta que contiene varios módulos.
● sys - Parámetros y funciones vinculadas con
Python incluye una inmensa cantidad de el intérprete / SO.
módulos y paquetes nativamente. Algunos de ● subprocess - Procesos, ejecuciones, etc.
los módulos más empleados son:
● shutil - Manipulación de alto nivel en el
Módulos Matemáticos sistema de archivos.
● math - Funciones Matemáticas
● random - Generación de números aleatorios
● statistics - Funciones de estadística básica
Python Programming
Interfaces gráficas
● tkinter - Python interfaz Tcl/Tk
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 2
Python Programming
Importar módulos
1 paquetes
Python Programming
Importar módulos 1 paquetes
Cuando importamos un módulo, estamos
indicándole a Python que queremos hacer uso de
algún objeto o funcionalidad dentro del mismo.
Para ello, se usa la palabra reservada import.
Una vez que un módulo ha sido importado, se
puede acceder a sus definiciones a través del
operador punto.
>>> import math
>>> math.sqrt(9)
3.0
Python Programming
Existe otra manera de usar una característica Podemos darle una vuelta más a la forma from
puntual de un módulo, es con la sentencia modulo import *, con asterisco al final. De esta
from. Al usar la forma from… import…, le manera estamos incorporando “todas” las
decimos a Python específicamente cuáles características del módulo sin la necesidad
objetos queremos importar de un módulo. nuevamente de usar el punto para acceder.
Luego, los objetos importados se incorporan a
from math import *
nuestro script como cualquier otro definido en
>>> sqrt(9)
él. Con este procedimiento, no es necesario 3.0
usar el nombre del módulo como prefijo. >>> pi
3.141592653589793
>>> from math import sqrt
>>> sqrt(9)
3.0 Vemos en el ejemplo anterior que pude usar la
función sqrt() y la constante pi, ambos del
Notar que de esta forma solo estamos módulo math.
trayendo a la función sqrt() y no podemos
usar otras funciones/objetos del módulo
porque solo trajimos una puntualmente.
Python Programming
También es posible importar los módulos bajo un
alias que haga más fácil referirse a ellos. Muchos
módulos se suelen importar bajo un alias standard,
que no es obligatorio, pero es el que la comunidad
usa. Por ejemplo:
import tkinter as tk
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 02 - Proyecto integrador - Etapa 1
Python Programming
¿Qué es el pro1ecto integrador?
● Se desarrollará un proyecto a lo largo de todo el curso.
● Permite reafirmar los conocimientos adquiridos.
● Los ejercicios se realizarán en la clase junto al profesor/a.
Python Programming
Etapa 1
Postre:
Python Programming
Se busca automatizar los pedidos y los cobros, almacenar
las transacciones, y agilizar el vuelto.
1. Ni bien se ingresa al programa nos debería de aparecer
el mensaje:
Bienvenido a Hamburguesas IT
Ingrese su nombre encargad@:
2. Luego cuando se ingresa un encargado:
(En rojo los ingresos, no hace falta ponerlos en rojo, es
solo a modo demostrativo).
Bienvenido a Hamburguesas IT
Ingrese su nombre encargad@ : Gerardo
Python Programming
3. Luego una vez que se ingresa correctamente el nombre
del encargad@, pasamos al menú:
Hamburguesas IT
Encargad@ -> Gerardo
Recuerda, siempre hay que recibir al
cliente con una sonrisa :)
Python Programming
4. Si el encargado elige la opción 1, hay que empezar a pedir
los ítems:
Total $15
Abona con $ 20
Vuelto $ 5
Python Programming
5. Cuando el encargado confirme el pedido se guardan los
datos (como se explica más adelante), si no se confirma no
se guarda, luego se vuelve al menú:
Hamburguesas IT
Encargad@ -> Gerardo
Recuerda, siempre hay que recibir al cliente
con una sonrisa :)
Python Programming
6. Si es momento del cambio de turno, el encargado (en
nuestro ejemplo es Gerardo) elige la opción 2, ponemos
la pantalla siguiente (volvemos a la primera parte del
programa para pedir el nombre del nuevo encargado):
Bienvenido a Hamburguesas IT
Ingrese su nombre encargad@ :
Bienvenido a Hamburguesas IT
Ingrese su nombre encargad@: Horacio
Python Programming
7. Luego, una vez que se ingresa correctamente el nombre,
pasar al menú:
Hamburguesas IT
Encargad@ -> Horacio
Recuerda, siempre hay que recibir al cliente
con una sonrisa :)
Python Programming
Archivos que va a generar nuestro sistema
Ventas:
Cuando se confirma la compra, lograr volcar Debajo, una vista de cómo se vería el
los datos del cliente / fecha / compra / total, archivo “ventas.txt” en su interior:
para guardarlas en un archivo llamado
“ventas.txt”. (Usar de separador punto y coma “;”
para cada uno de los elementos, los
Sin borrar los anteriores registros, se tendrían campos son: Cliente – Fecha – ComboS –
que ir guardando las ventas una bajo la otra, ComboD – ComboT – Flurby - Total).
en renglones siguientes.
Python Programming
Registro:
También en el mismo directorio, acompañando el
“ventas.txt”, debería quedar el registro de entrada y
salida del sistema del operario de caja, acompañando
el monto total al cerrar la caja, en un archivo llamado
“registro.txt”, sin borrar los anteriores accesos.
Una vista de cómo se vería el archivo “registro.txt” en
su interior:
IN Sat Oct 23 10:18:18 2021 Encargad@ Gerardo
OUT Sat Oct 23 11:39:15 2021 Encargad@ Gerardo $46
##################################################
IN Sat Oct 23 11:41:20 2021 Encargad@ Horacio
OUT…………………………………………………
Python Programming
8. Separar los accesos opcionalmente como se
muestra en el ejemplo anterior con una barra
formada por 50 # (cincuenta numerales).
El programa NO debe de detenerse a causa de
errores, manejar las excepciones. Usar las
herramientas vistas únicamente en el curso
hasta el momento para resolver el trabajo.
Python Programming
En la sección de Descargas encontrarás los recursos
necesarios para realizar los ejercicios y su resolución
para que verifiques cómo te fue.
Python Programming
¡Sigamos trabajando!
Python Programming
import time
def ingreso_str(mensaje,error):
dato = input(mensaje)
while dato=="":
print(error)
dato = input(mensaje)
return dato
def ingreso_int(mensaje,error):
dato = input(mensaje)
while True:
try:
dato = int(dato)
break
except ValueError:
print(error)
dato = input(mensaje)
return dato
def ingreso_float(mensaje,error):
dato = input(mensaje)
while True:
try:
dato = float(dato)
break
except ValueError:
print(error)
dato = input(mensaje)
return dato
def saludar(nombre):
print("Hamburguesas IT")
print("Encargad@ -> " + nombre )
print("Recuerda, siempre hay que recibir al cliente con una
sonrisa :) ")
def ingresar():
print("Bienvenido a Hamburguesas IT")
nombre = ingreso_str("Ingrese su nombre encargad@: ","Error,
campo vacio.")
return nombre
def calcular(precios,pedido):
total = 0
total += pedido["ComboSimple"] * precios["ComboSimple"]
total += pedido["ComboDoble"] * precios["ComboDoble"]
total += pedido["ComboTriple"] * precios["ComboTriple"]
total += pedido["Flurby"] * precios["Flurby"]
return total
def confirmar():
respuesta = ingreso_str("¿Confirma el pedido? Y/N: ","Error.
Campo vacio.")
while respuesta.lower() != "y" and respuesta.lower() != "n" and
respuesta.lower() != "yes" and respuesta.lower() != "no":
print("Ingrese únicamente Y o N")
respuesta = ingreso_str("¿Confirma el pedido? Y/N:
","Error. Campo vacio.")
if respuesta == "y" or respuesta == "yes":
return True
else:
return False
def guardarVentas(data):
renglon = ""
for n in data:
if n == "total":
renglon += str(data[n]) + "\n"
else:
renglon += str(data[n]) + ","
f = open("ventas.txt","a")
f.write(renglon)
f.close()
def guardarEncargado(data):
ingreso = "IN "+ data["ingreso"] +" Encargad@ "+
data["nombre"]+"\n"
egreso = "OUT "+ data["egreso"] +" Encargad@ "+ data["nombre"]
+" $ "+str(data["facturado"])+"\n"
separador = ("#"*50)+"\n"
f = open("registro.txt","a")
f.write(ingreso)
f.write(egreso)
f.write(separador)
f.close()
###################################################################
###
precios =
{"ComboSimple":5,"ComboDoble":6,"ComboTriple":7,"Flurby":2}
salir = True
while salir:
datosEncargado =
{"nombre":"","ingreso":"","egreso":"","facturado":0}
encargado = ingresar()
inicio = time.asctime()
datosEncargado["nombre"] = encargado
datosEncargado["ingreso"] = inicio
caja = 0
print("\n"*2)
while True:
saludar(encargado)
print("""
1 – Ingreso de nuevo pedido
2 – Cambio de turno
3 – Apagar sistema
""")
opcion = ingreso_str(">>>","Error, ingreso vacio")
if opcion == "1":
print("\n"*2)
pedido =
{"cliente":"","fecha":"","ComboSimple":0,"ComboDoble":0,"ComboTripl
e":0,"Flurby":0,"total":0}
pedido["cliente"] = ingreso_str("Ingrese el nombre del
cliente: ","Error. No deje este campo vacio")
pedido["ComboSimple"] = ingreso_int("Ingrese cantidad
Combo S: ","Error, solo números")
pedido["ComboDoble"] = ingreso_int("Ingrese cantidad
Combo D: ","Error, solo números")
pedido["ComboTriple"] = ingreso_int("Ingrese cantidad
Combo T: ","Error, solo números")
pedido["Flurby"] = ingreso_int("Ingrese cantidad
Flurby: ","Error, solo números")
costoTotal = calcular(precios,pedido)
print("Total $", costoTotal)
recibido = ingreso_float("Abona con $ ","Error, solo
números")
while costoTotal > recibido:
print("Ingrese un monto mayor, no alcanza.")
recibido = ingreso_float("Abona con $ ","Error,
solo números")
print("Vuelto $",recibido-costoTotal)
estado = confirmar()
if estado:
caja += costoTotal
pedido["fecha"] = time.asctime()
pedido["total"] = costoTotal
guardarVentas(pedido)
else:
print("Pedido cancelado")
elif opcion == "2":
datosEncargado["egreso"] = time.asctime()
datosEncargado["facturado"] = caja
guardarEncargado(datosEncargado)
break
elif opcion == "3":
datosEncargado["egreso"] = time.asctime()
datosEncargado["facturado"] = caja
guardarEncargado(datosEncargado)
print("¡Muchas gracias por usar nuestro programa!")
salir = False
break
else:
print("Opcion incorrecta, vuelva a intentarlo")
print("\n*3")
P1thon Programming
Módulo 02 - Desafío
Python Programming
¿Qué son los desafíos?
● Son ejercicios complementarios a los realizados en clase.
● Permiten practicar y consolidar los conocimientos adquiridos.
● Es recomendable que los realices antes de rendir el
examen de la clase.
Python Programming
Ejercicio 1: Entrando números
Crear una función que use lo visto de excepciones
para que tome por input() el número como str y
lo transforme directamente a float, sea entero o
decimal. Deberíamos pasar como argumento la
frase para mostrar en pantalla el pedido. Además,
deberíamos de volver a pedir, hasta que se pueda
hacer el ingreso de forma correcta.
A partir de ahora cada vez que tomemos un número
por teclado podemos hacer uso de esta función que
vamos a crear.
Python Programming
Ejercicio 2: Quedó registrado
Hacer un pequeño programa con un menú Además, es necesario registrar el horario de
muy sencillo: los eventos se podría usar el módulo time, y
la función asctime() que devuelve un str
Menú: con fecha y hora.
1 – Ingreso de empleado
2 – Egreso de empleado Cuando se quiere salir del programa se usa la
3 – Salir del sistema opción 3.
>>>
Tanto el ingreso y el egreso se registra en un
Este sistema es básico, lo utiliza el personal archivo txt. Cada renglón representa un
de seguridad que registra el nombre de la registro.
persona que ingresa (opción 1), y que egresa
del edificio (opción 2).
Python Programming
Ejemplo de lo que se ven en el archivo “registro.txt” :
Thu Oct 28 21:32:01 2025 - Ignacio - Ingreso
Thu Oct 28 21:33:01 2025 - Juan - Ingreso
Thu Oct 28 22:33:10 2025 - Tomas - Egreso
Thu Oct 28 22:35:01 2025 - Romina - Egreso
Thu Oct 28 23:36:02 2025 - Ana – Ingreso
Thu Oct 28 23:36:02 2025 - Jorge – Ingreso
Python Programming
Ejercicio 3: ¿Qué pasó?
Al programa anterior, agregarle una opción de ver los
últimos 5 registros (opción 3 y salir pasa a opción 4).
Solo los últimos 5 eventos tomarlos directamente del
txt. Si nuestro archivo está vacío, mostrar el mensaje
No hay registros”, en caso de que tengamos menos
registros que 5, solo mostrar los que se tenga en el
archivo hasta ese momento.
Menú:
1 – Ingreso de empleado
2 – Egreso de empleado
3 – Mostrar los últimos 5 registros
4 – Salir del sistema
>>>
Python Programming
Al elegir la opción 3 deberíamos de ver en la consola
algo de este estilo:
Thu Oct 28 21:33:01 2025 - Juan - Ingreso
Thu Oct 28 22:33:10 2025 - Tomas - Egreso
Thu Oct 28 22:35:01 2025 - Romina - Egreso
Thu Oct 28 23:36:02 2025 - Ana – Ingreso
Thu Oct 28 23:36:02 2025 - Jorge – Ingreso
Python Programming
En la sección de Descargas encontrarás los recursos
necesarios para realizar los ejercicios y su resolución
para que verifiques cómo te fue.
Python Programming
¡Terminaste el módulo!
Estás listo para rendir el examen
Python Programming
def numeric_input(frase):
valor = input(frase)
while True:
try:
valor = float(valor)
break
except ValueError:
print("Error, este ingreso solo permiten números")
valor = input("Intente nuevamente. " + frase)
return valor
####################################################
import time
def comprobar(dato):
while dato == "":
print("Error. ¡No debe dejar vacio este campo!")
dato = input("Ingrese dato nuevamente: ")
return dato
def guardar(persona,tipo):
fecha = time.asctime()
datos = f"{fecha} - {persona} - {tipo} \n"
f = open("registro.txt","a")
f.write(datos)
f.close()
while True:
print("""
Menú
1 - Ingreso de empleado
2 - Egreso de empleado
3 - Salir del sistema
""")
opcion = input(">>> ")
if opcion == "1":
nombre = input("Nombre del empleado que ingresa: ")
nombre = comprobar(nombre)
guardar(nombre,"Ingreso")
elif opcion == "2":
nombre = input("Nombre del empleado que egresa: ")
nombre = comprobar(nombre)
guardar(nombre,"Egreso")
elif opcion == "3":
print("¡Gracias por usar nuestro programa!")
break
else:
print("Error de opcion")
print("\n\n")
input("Toque ENTER para continuar...")
import time
def comprobar(dato):
while dato == "":
print("Error. ¡No debe dejar vacio este campo!")
dato = input("Ingrese dato nuevamente: ")
return dato
def guardar(persona,tipo):
fecha = time.asctime()
datos = f"{fecha} - {persona} - {tipo} \n"
f = open("registro.txt","a")
f.write(datos)
f.close()
def mostrar():
try:
f = open("registro.txt","r")
eventos = f.readlines()
f.close()
if len(eventos) < 5:
for r in eventos:
print("- " + r.strip())
else:
for r in eventos[-5:]:
print("- " + r.strip())
except FileNotFoundError:
print("No hay registros para mostrar")
#######################################################
while True:
print("""
Menú
1 - Ingreso de empleado
2 - Egreso de empleado
3 - Ver los últimos 5 registros
4 - Salir del sistema
""")
opcion = input(">>> ")
if opcion == "1":
nombre = input("Nombre del empleado que ingresa: ")
nombre = comprobar(nombre)
guardar(nombre,"Ingreso")
elif opcion == "2":
nombre = input("Nombre del empleado que egresa: ")
nombre = comprobar(nombre)
guardar(nombre,"Egreso")
elif opcion == "3":
print("------------ Los últimos 5 registros ------------
\n")
mostrar()
print("\n-------------------------------------------------
")
elif opcion == "4":
print("¡Gracias por usar nuestro programa!")
break
else:
print("Error de opcion")
print("\n\n")
input("Toque ENTER para continuar...")
P1thon Programming
Módulo 3 - Laboratorio 5
Python Programming
En este módulo verás:
● Clases y objetos.
● Encapsulamiento, herencia y
polimorfismo.
● Instalar módulos de terceros.
● Scripting.
● Argumentos de programa.
● Sistema de archivos.
● Ejecución de comandos.
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 3
Python Programming
Clases 1 Objetos
Python Programming
Paradigma de Objetos
La Programación Orientada a Objetos POO Las clases nos permiten agrupar un conjunto
(OOP en inglés) se trata de un paradigma de de variables y funciones, y que con las cuales
programación introducido en la década del podemos crear entidades que vivirán en
70’ del siglo pasado. nuestros programas.
Python Programming
Paradigma de Objetos
Existen diversos lenguajes que trabajan con
POO, pero los más populares son los
lenguajes basados en clases en los que los
objetos son instancias de clases.
Python Programming
Aspectos básicos de una clase
Las clases se definen vía la palabra reservada Recordá que pass no ejecuta ninguna operación,
class seguida de su nombre y, entre sino que simplemente rellena un lugar que es
paréntesis, el nombre de las clases de las requerido sintácticamente.
cuales debe heredar, en caso de haber.
Ahora bien, todas las clases necesitan que se
class MiClase:
ejecute un codigo cada vez que se haga uso de
pass
ella y en donde el programador tendrá la
posibilidad de inicializar lo que sea necesario.
La convención para nombrar una clase difiere
de las funciones y otras sentencias; en las
class MiClase:
clases cada término se escribe con su def __init__(self):
primera letra en mayúscula y no se emplean pass
guiones bajos.
Python Programming
A las funciones definidas dentro de una clase Se dice que mi_objeto es una instancia de la
se las conoce con el nombre de método. clase MiClase. Para ilustrarlo mejor, prueba el
Todas las funciones que empiezan y terminan siguiente código:
con doble guión bajo son métodos especiales
que utilizará Python y que no están class MiClase:
diseñados para ser llamados manualmente def __init__(self):
print("Has creado una instancia de
(con algunas excepciones).
MiClase.")
Python Programming
Esto se debe a que Python coloca el primer Sin embargo, en la primera línea self será
argumento de todos los métodos de una una referencia a mi_objeto, mientras que en
clase automáticamente (por convención se lo la segunda, a otro_objeto.
llama self). self es una referencia a la
instancia actual de la clase. Por lo general estarás utilizando el método
__init__() para inicializar objetos dentro de
Por ejemplo, consideremos el siguiente tu clase. Por ejemplo:
código, el cual crea dos instancias de MiClase.
class MiClase:
def __init__(self):
mi_objeto = MiClase()
self.a = 1
otro_objeto = MiClase()
mi_objeto = MiClase()
En ambos casos, para crear la instancia
print(mi_objeto.a)
Python automáticamente llama al método
__init__().
Python Programming
Se dice que a es un atributo de mi_objeto o, El método __init__() puede tener
en general, de MiClase. También podemos argumentos posicionales y por nombre
cambiar el valor de un atributo desde fuera como cualquier otra función convencional,
de la clase: que serán especificados al momento de
crear una instancia de la clase.
mi_objeto = MiClase()
mi_objeto.a += 1
print(mi_objeto.a) # Imprime 2 class MiClase:
def __init__(self, a):
self.a = a
mi_objeto = MiClase(5)
print(mi_objeto.a) # Imprime 5
Python Programming
Una clase también puede incluir funciones, Otros ejemplos:
aunque recuerda, siempre el primer
argumento debe ser self. class MiClase:
def __init__(self, a):
class MiClase: self.a = a
def __init__(self, a):
self.a = a def imprimir_a(self):
print(self.a)
def imprimir_a(self):
print(self.a) def sumar_e_imprimir(self, n):
self.a += n
print(self.a)
mi_objeto = MiClase(5)
mi_objeto.imprimir_a()
mi_objeto = MiClase(5)
mi_objeto.sumar_e_imprimir(7) # Imprime 12
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 3 - Laboratorio 1
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descarga el material necesario de la carpeta Descargas.
Python Programming
Laboratorio 1: Cumpleaños
Crea una clase “Persona”. Con atributos nombre y edad.
Además, hay que crear un método “cumpleaños”, que
aumente en 1 la edad de la persona cuando se invoque
sobre un objeto creado con “Persona”.
Tendríamos que lograr ejecutar el siguiente código con
la clase creada:
p = Persona("Juan", 21)
p.cumpleaños()
print(f"{p.nombre} cumple {p.edad} años")
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
class Persona:
def __init__(self, n, e):
self.nombre = n
self.edad = e
def cumpleaños(self):
self.edad += 1
Python Programming
Encapsulamiento
Python Programming
Encapsulamiento
El encapsulamiento es un concepto Python por defecto no oculta los atributos y
relacionado con la programación orientada a métodos de una clase al exterior.
objetos, y hace referencia al ocultamiento de
los estados internos de una clase al exterior. class Clase:
atributo_clase = "Hola"
Dicho de otra manera, encapsular consiste en
def __init__(self, valor):
hacer que los atributos o métodos internos a self.atributo_instancia = valor
una clase no se puedan acceder ni modificar
desde fuera, sino que tan solo el propio mi_clase = Clase("Que tal")
objeto pueda acceder a ellos. print(mi_clase.atributo_clase) # 'Hola'
print(mi_clase.atributo_instancia) # 'Que
Para la gente que conozca otros lenguajes, le tal'
resultará un término muy familiar, pero en
Python es algo distinto.
Python Programming
Ambos atributos son accesibles desde el Si que queremos que los atributos y
exterior. Sin embargo, esto es algo que tal vez métodos solo pertenezcan a la clase, y
no queremos que suceda con ciertos solamente puedan ser accedidos por la
métodos o atributos. mecánica interna del objeto, podemos usar
la doble __ (doble guion bajo) para
La encapsulación consiste en denegar el nombrarlos. Esto hará que Python los
acceso a los atributos y métodos internos de interprete como “privados”, de manera que
la clase desde el exterior. En Python no se no podrán ser accedidos desde el exterior.
aconseja para no complejizar el código.
Pero se puede simular.
Python Programming
class Clase:
atributo_clase = "Hola" # Accesible desde el exterior
__atributo_clase = "Hola" # No accesible
objeto = Clase()
print(objeto.atributo_clase) # Ok!
objeto.metodo_normal() # Ok!
#print(objeto.__atributo_clase) # Error! Atributo no accesible
#objeto.__mi_metodo() # Error! Método no accesible
Python Programming
Acceder a atributos privados GET-SET-DEL
Muchas veces, el público que decide Pero hay otra alternativa al uso de estos
aprender Python viene con un bagaje de métodos basada en las propiedades Python
conocimiento de otro lenguaje. Y piensan que simplifica la tarea. Las propiedades en
como si Python funcionase igual que: C, C++, Python son un tipo especial de atributo a los
Java, etc. Y eso en algunos aspectos es válido que se accede a través de llamadas a
y en otros no tanto. Python es Python. Java métodos. Con ello, es posible ocultar los
es Java. métodos "get", "set" y "del" de manera que
sólo es posible acceder mediante estas
En Python cuando queremos acceder a propiedades por ser públicas.
atributos privados podemos fabricarnos los
métodos get, set y del.
Python Programming
No es obligatorio definir métodos "get", "set" class Empleado:
def __init__(self, nombre, salario):
y "del" para todas las propiedades. Es
self.__nombre = nombre
recomendable sólo para aquellos atributos self.__salario = salario
en los que sea necesario algún tipo de
def getnombre(self):
validación anterior a establecer, obtener o return self.__nombre
borrar un valor. Para que una propiedad sea
def getsalario(self):
sólo de lectura hay que omitir las llamadas a
return self.__salario
los métodos "set" y "del".
def setnombre(self, nombre):
self.__nombre = nombre
def setsalario(self, salario):
self.__salario = salario
def delnombre(self):
del self.__nombre
def delsalario(self):
del self.__salario
Python Programming
Vemos que nombre y salario son valores que ¿Pero esto es lo que se busca en Python?
se pasan al momento de generar la instancia. No. Básicamente la filosofía del lenguaje es:
Pero luego esos valores son “privados”. “Simple es mejor que complejo”, no te
¿Entonces? compliques la vida.
Si se quieren manipular, vamos a tener que La clase empleado sin tanta parafernalia:
armarnos métodos para poder manipularlos
class Empleado:
ya que internamente vamos a poder seguir def __init__(self, nombre, salario):
trabajando con ellos. self.nombre = nombre
self.salario = salario
En este caso los métodos get” nos permiten
obtener los valores, los set” grabar valores y
los del” borrar.
Python Programming
No sólo es más corta, sino que su funcionalidad
es completamente equivalente, es más fácil de
leer porque es obvia (se puede leer de un
vistazo), y hasta es más eficiente.
Lo único diferente es que en esta última versión
los atributos son públicos y modificables sin
ningún método especial. Como vimos en la
primera parte teórica del módulo.
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 3
Python Programming
Herencia
Python Programming
Herencia
Cuando una clase B hereda de una clase A, En este código, mi_objeto es una instancia de
aquélla conserva todos los métodos y ClaseB, que no ha definido ningún atributo a.
atributos de ésta. Sin embargo, lo hereda de la ClaseA. La ClaseB
podría definir nuevos atributos y funciones, e
class ClaseA: incluso reemplazar a los de su clase padre.
def __init__(self):
self.a = 1 class ClaseB(ClaseA):
def __init__(self):
class ClaseB(ClaseA): self.b = 2
pass
mi_objeto = ClaseB()
print(mi_objeto.a)
Python Programming
En este caso, definimos el método de Como alternativa también es posible llamar a
inicialización __init__() y creamos un nuevo la función __init__() de la clase padre
atributo b. No obstante, esto reemplaza la directamente.
antigua definición de __init__() en ClaseA de
modo que, por ejemplo, self.a no se habrá class ClaseB(ClaseA):
definido. Siempre que reemplazamos un def __init__(self):
ClaseA.__init__(self)
método, para permitir que las funciones con
self.b = 2
el mismo nombre en las clases padres se
ejecuten debemos emplear la función super()
del siguiente modo.
class ClaseB(ClaseA):
def __init__(self):
super().__init__()
self.b = 2
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 3 - Laboratorio 2
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descarga el material necesario de la carpeta Descargas.
Python Programming
Laboratorio 2: Estudiante persona
Crear una clase “Persona” que sea la clase padre de otra
clase “Estudiante”.
La clase “Persona” su método __init__() debe de estar
preparado para recibir nombre y apellido. Además, esta
clase , debe tener un método para mostrar
nombre_completo() el cual debe mostrar el nombre
acompañado del apellido.
La otra clase “Estudiante”, debe de poder heredar de
“Persona”, y además recibir los argumentos nombre y
edad. También la clase “Estudiante”, recibe el valor
“carrera”, y además contar con un método
mostrar_carrera() . Las dos clases son obligatorias.
Python Programming
Ayuda:
class Persona():
def __init__(self,nom,ape):
#Completar código
class Estudiante(Persona):
def __init__(self,nom,ape,carr):
super().__init__(nom,ape)
#Completar código
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
class Persona():
def __init__(self,nom,ape):
self.nombre = nom
self.apellido = ape
def nombre_completo(self):
print(self.nombre +" "+self.apellido)
class Estudiante(Persona):
def __init__(self,nom,ape,carr):
super().__init__(nom,ape)
self.carrera = carr
def mostrar_carrera(self):
print(self.carrera)
x = Estudiante("Juan","Salvo","Ing Qumica")
print(x.apellido)
P1thon Programming
Módulo 3
Python Programming
Polimorfismo
Python Programming
Polimorfismo en P1thon
El polimorfismo nos posibilita invocar un Un ejemplo simple:
determinado método de un objeto, y que
podrá obtenerse distintos resultados según class gato():
def hablar(self):
sea el objeto. Esto se debe a que distintos
print("MIAU")
objetos(que pueden o no ser creados con la
misma clase) pueden tener un método con class perro():
un mismo nombre, pero que realicen def hablar(self):
distintas operaciones. print("GUAU")
def escucharMascota(animal):
animal.hablar()
Python Programming
Un ejemplo con el concepto de herencia: En este caso cuando, se cree un objeto
Perro”, se sustituirá el método hablar (de la
class Animal: clase padre Animal”) por el de la clase hija
def hablar(self): ( Perro”). Lo mismo ocurre con Gato”.
pass
El polimorfismo es una cuestión de
class Perro(Animal): organización y de buena práctica para el
def hablar(self): programador que trabaja con muchos
print("Guau!")
objetos y métodos. Permitiendo que el
class Gato(Animal): desarrollador no deba escribir, pensar y
def hablar(self): recordar muchos nombres de métodos
print("Miau!") diferentes, sino que pueda llamar al método
del objeto adecuado con el mismo nombre
que llamaría a otros.
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 3
Python Programming
Herencia Múltiple
Python Programming
Herencia múltiple
En Python es posible realizar herencia
múltiple. Vimos que se podía crear una clase
padre que heredaba de una clase hija,
pudiendo hacer uso de sus métodos y
atributos. La herencia múltiple es similar,
pero una clase, hereda de varias clases padre
en vez de una sola.
Entonces una clase puede heredar de una
cantidad arbitraria de clases, indicándolas en
la definición separadas por comas, tal como
se haría con los argumentos. Hay que tener
en cuenta que la herencia se resuelve de
derecha a izquierda.
Python Programming
class ClaseA: La ClaseC hereda el atributo a de sus clases
def __init__(self): padres, pero, como la resolución ocurre de
self.a = 1
derecha a izquierda, el atributo ClaseA.a (1)
reemplaza a ClaseB.a (2).
class ClaseB:
def __init__(self):
self.a = 2
mi_objeto = ClaseC()
print(mi_objeto.a) # Imprime 1
Python Programming
Lo mismo ocurre con los métodos:
class ClaseA:
def __init__(self):
self.a = 1
def mensaje(self):
print("Mensaje de la clase A.")
class ClaseB:
def __init__(self):
self.a = 2
def mensaje(self):
print("Mensaje de la clase B.")
class ClaseC(ClaseA, ClaseB):
pass
mi_objeto = ClaseC()
mi_objeto.mensaje() # Imprime "Mensaje de la
clase A."
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 3
Python Programming
Crear módulos
Python Programming
Crear módulos
Para garantizar la organización y reutilización Desde un archivo en la misma ubicación que
del código, a medida que un programa de mimodulo.py, podemos importarlo para
Python crece en volumen se lo tiende a acceder a dicha función vía la palabra
dividir en distintos archivos. A cada uno de reservada import.
estos archivos se lo llama módulo, y a un
conjunto de módulos distribuidos bajo un import mimodulo
mismo nombre se lo denomina paquete. mimodulo.mi_funcion()
def mi_funcion():
print("Hola mundo")
Python Programming
Una segunda sintaxis utilizando from permite Para importar más de un objeto, los
importar únicamente los recursos que indicamos entre comas:
necesitamos (funciones, clases, etc.), de
modo que en las subsiguientes llamadas no from mimodulo import mi_funcion, MiClase
es necesario especificar el nombre del
módulo. También es posible utilizar un asterisco
indicando que se deben importar todos los
from mimodulo import mi_funcion objetos (aunque esto es por lo general poco
mi_funcion() recomendado):
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 3
Python Programming
Instalar módulos
de terceros
Python Programming
Instalar módulos de terceros
Una de las ventajas de Python es que, Pip se usa en la terminal del sistema
además de su vasta librería estándar, tiene operativo haciendo uso del argumento install
una gigantesca colección de módulos y y escribiendo el nombre del módulo elegido a
paquetes aportados por la comunidad para instalar.
realizar diversas tareas (lo que en otros
lenguajes se conoce como librerías). Muchos pip install modulo
de ellos (la mayoría) se listan en PyPI (Python
Package Index). (módulo debería ser reemplazado por el
nombre del módulo que queremos instalar)
Python cuenta con la herramienta pip
nativamente que permite justamente Esto descarga e instala el paquete
descargar los paquetes o modulos elegidos. especificado automáticamente. En caso de
estar en Linux o en iOS usar pip3 y verificar
que pip esté instalado.
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 3 - Laboratorio 3
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descarga el material necesario de la carpeta Descargas.
Python Programming
Laboratorio 3: Uso de pip
Recomendamos para futuras explicaciones instalar con
pip los siguientes módulos:
(En la consola del sistema operativo, hacer uso de pip)
C:\Users\Anonimo>pip install “nombre_del_modulo”
Python Programming
● psutil ● openpyxl
Para recuperar información sobre los Para trabajar con archivos Excel 2010 en
procesos en ejecución y la utilización del adelante.
sistema multiplataforma. Documentación:
Documentación: https://psutil.readthedocs.io/ https://openpyxl.readthedocs.io/en/stable/
● tabulate ● pymysql
Imprimir tablas pequeñas sin problemas DB-API, es para trabajar con bases de
en aplicaciones de consola. El formato de datos motor MySQL.
la tabla se guía por los datos en sí Documentación:
mismos. https://pymysql.readthedocs.io/en/latest/
Documentación:
https://github.com/astanin/python-tabulate
Python Programming
● requests
Permite enviar solicitudes HTTP con mucha
facilidad. No es necesario agregar
manualmente cadenas de consulta a sus
URLs, ni codificar formato en sus POST. Lo
cual se vuelve muy útil para trabajar con
servicios web.
Documentación: https://docs.python-requests.org/
● flask
Flask es un framework web WSGI liviano. Está
diseñado para que la puesta en marcha de Solo instalamos.
una aplicación web sea rápida y sencilla. Más adelante, durante el curso,
Documentación: https://flask.palletsprojects.com/ emplearemos cada uno de ellos.
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
Recordar, en la consola del sistema operativo, hacer uso de pip
Mirar el apunte: "Instalar modulos de terceros"
Python Programming
Argumentos de
programa
Python Programming
Argumentos de programa
Cuando invocamos un programa a través de
la terminal (o línea de comandos o símbolo
del sistema) podemos pasarle argumentos
como si se tratase de una función, que por lo
general determinan alguna acción o
configuración inicial del script. Dichos
argumentos se especifican luego del nombre
del programa y separados por espacios.
Supongamos que tenemos un archivo
llamado saludar.py y que lo ejecutamos
desde la terminal del siguiente modo:
> python saludar.py Lautaro
Python Programming
Ya vimos que, Python es un lenguaje Entonces, si python es el programa
interpretado, los scripts que escribimos son ejecutable, los argumentos que recibirá en el
ejecutados por un programa al cual llamamos caso anterior son los siguientes:
intérprete. En lo que acabamos de escribir,
estamos haciendo referencia al intérprete ● saludar.py
con la palabra python. Podemos comprobar ● Lautaro
esto escribiendo lo siguiente (en Windows):
Para acceder a estos argumentos desde
> where python nuestro código, la librería estándar nos
C:\python37\python.exe provee la lista sys.argv en donde cada uno
de los argumentos será una cadena según el
O en alguna distribución de Linux: orden en que fueron especificados.
$which python
/usr/bin/python
Python Programming
De modo que si nuestro archivo saludar.py Todos los elementos subsiguientes habrán
contiene el siguiente código... sido pasados a través de la terminal tal como
acabamos de hacerlo. Entonces, si queremos
import sys que nuestro programa muestre un saludo al
print("Argumentos:", sys.argv) nombre que recibió como argumento a
través de la consola, haremos:
Al ejecutarlo desde la consola con python
saludar.py Lautaro veremos impreso en import sys
pantalla: nombre = sys.argv[1]
print("¡Hola" + nombre + "!")
Argumentos: ['saludar.py', 'Lautaro']
Python Programming
Puede ocurrir que el usuario se haya olvidado Ahora bien, ¿qué tal si queremos que el
de proveer su nombre. En dicho caso, por programa imprima un saludo para cada uno
tratarse de una lista convencional, de los nombres que se hayan pasado como
intentaremos capturar la excepción argumentos ─es decir, separados por
IndexError: espacios─? Bien podríamos hacer:
Python Programming
¿Cómo deberíamos invocar este programa? Así:
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 3
Python Programming
Sistema de archivos
Python Programming
Sistema de archivos, OS
La librería estándar de Python provee varias
funciones para trabajar con el sistema de archivos:
listar, copiar, mover, eliminar, renombrar, etc.
Están desperdigadas en dos módulos: os y shutil.
● os.listdir()
● os.getcwd()
● os.mkdir()
● os.path.exists()
● os.rename()
● os.remove()
● os.rmdir()
● os.system()
● os.name
Python Programming
La función os.listdir() retorna una lista con
los archivos y carpetas en una ruta en particular
que se pasa como argumento.
>>> import os
>>> os.listdir("C:\\Users\\Anonimo\\AppData\\Local\\Programs\\Python\\Python39")
['DLLs', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'python.exe',
'python3.dll', 'python37.dll', 'pythonw.exe', 'Scripts', 'tcl', 'Tools',
'vcruntime140.dll']
Python Programming
Si omitimos el argumento, se toma por
defecto la ruta desde donde se esté
ejecutando el programa. Esta ruta lleva el
nombre de current working directory
(directorio actual de trabajo) y es retornada
por la función os.getcwd(). Por ejemplo:
>>> import os
>>> os.getcwd()
'C:\Users\Usuario\Desktop'
os.listdir(os.getcwd())
os.listdir()
Python Programming
La función os.path.exists() toma como argumento
una ruta (sea una carpeta o un archivo) y retorna
un booleano indicando si la misma existe (True) o
no (False).
>>>os.path.exists("C:\\Users\\Anonimo\\AppData\\Local\\Programs\\Python\\Python39")
True
>>> os.path.exists("C:\\ruta\\inexistente.txt")
False
Python Programming
¡Atención! las experiencias de borrar Para remover archivos se utilíza os.remove().
directorios o de borrar archivos hágase sobre
archivos sin importancia y creados para estas >>> os.remove("c:\\ruta\\archivo.ext")
experiencias. Ya que una vez borrados no
terminan en la papelera. Son borrados La función os.rename() toma como primer
definitivamente. argumento la ruta a un archivo cuyo nombre
será cambiado por el segundo argumento.
Por otro lado, os.rmdir() (remove directory)
elimina una carpeta vacía, únicamente >>>
carpetas vacías. Para eliminar carpetas con os.rename("c:\\ruta\\archivo.ext","c:\\ruta\\
contenido, más adelante veremos la función nuevo_nombre.ext")
shutil.rmtree().
>>> os.rmdir("c:\\ruta\\directorio")
Python Programming
Si deseamos ejecutar alguna instrucción o
comando del sistema operativo podemos
usar os.system()
Python Programming
Sistema de archivos, SHUTIL
Por otro lado, dentro del módulo shutil nos interesan
las siguientes:
● shutil.copy()
● shutil.move()
● shutil.rmtree()
Python Programming
Del mismo modo opera shutil.move(), que mueve
un archivo de una ubicación a otra, quitándolo de
su ruta original.
>>> shutil.move("C:\\ruta\\archivo.txt",
"C:\\otra_ruta\\archivo.txt")
>>> shutil.rmtree("C:\\ruta\\carpeta_no_vacia")
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 3 - Laboratorio 4
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descarga el material necesario de la carpeta Descargas.
Python Programming
Laboratorio 4: Buscar archivos
Desarrollar un script buscar_archivos.py que reciba
como argumentos la ruta a una carpeta y una extensión
para buscar archivos dentro de ella. Luego debe
mostrar los archivos que terminen con dicha extensión
en la carpeta indicada. Por ejemplo, en el caso siguiente
se listan los archivos con extensión “.exe” en la carpeta
llamada “carpeta”:
Python Programming
Si no se pasan los dos argumentos correspondientes,
el programa debe indicar el error en la consola y
finalizar:
Python Programming
Si el segundo argumento omite el punto inicial, el programa
debe añadirlo automáticamente y seguir su curso normal:
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
import os
import sys
try:
# Acceder a los argumentos pasados al programa por el usuario.
ruta = sys.argv[1]
ext = sys.argv[2]
except IndexError:
print("Argumentos insuficientes. Indique la ruta en donde
buscar y la extensión.")
sys.exit()
try:
# Obtener la lista de archivos en la ruta especificada.
archivos = os.listdir(ruta)
except FileNotFoundError:
print("La ruta no existe.")
sys.exit()
Python Programming
Ejecución de
comandos
Python Programming
Ejecución de comandos o programas
Una tarea frecuente en el desarrollo de
scripts es la de tener que invocar un
programa o comando del sistema desde
Python, y ocasionalmente leer el resultado
que imprime en pantalla. Para ello la librería
estándar provee el módulo subprocess.
Python Programming
Si el nombre de la nueva carpeta contiene El primer argumento de run() es una lista en
espacios, entonces debemos encerrarlo entre donde el primer elemento es el nombre del
comillas: comando o programa que se quiere ejecutar,
y los subsiguientes son los argumentos para
> mkdir "Nueva carpeta" dicho comando o programa (tal como lo
vimos al comienzo de esta clase con
Para ejecutar este comandos del sistema sys.argv). El parámetro shell=True indica que
operativo desde Python usaremos la función se trata de un comando de la terminal o
subprocess.run() del siguiente modo. símbolo del sistema de Windows.
import subprocess
subprocess.run(["mkdir", "Nueva carpeta"],
shell=True)
print("¡La carpeta ha sido creada!")
Python Programming
Probemos ahora un comando que imprima Sí, de la siguiente manera:
información en la consola y queramos
p = subprocess.run("hostname",
analizar desde Python. Por ejemplo, hostname, capture_output=True, encoding="cp850")
en Windows indica el nombre del host actual, # p.stdout contiene el resultado del comando
o whoami, que imprime el nombre del host y el como una cadena.
del usuario. print(p.stdout)
> hostname
DESKTOP-JL5G5BG
> whoami
desktop-jl5g5bg\usuario
Python Programming
Este último procedimiento tiene varias ● No es relevante en este momento,
diferencias con el primer comando que simplemente recuerda usarlo tal como lo
ejecutamos: hemos hecho recién siempre que quieras
leer el resultado de un comando desde
● El primer argumento es una cadena y no Python.
una lista. Esto es válido porque el comando
no contiene espacios, entonces, se puede ● No especificamos el parámetro
pasar directamente una cadena. shell=True. Esto es porque hostname es en
realidad un programa, no un comando.
● El argumento capture_output=True le indica Podemos observar esto escribiendo where
a la función run() que debe capturar el hostname en la consola, lo cual nos revelará
resultado del comando (esto es, el nombre la ubicación del programa (por lo general,
del host). C:\Windows\System32\HOSTNAME.EXE).
Siempre que ejecutemos un programa en
● El argumento encoding="cp850" indica la lugar de un comando debemos evitar el
codificación de caracteres usada por parámetro shell.
defecto por la consola de Windows.
Python Programming
Nota. En las distribuciones de Linux la codificación de la Si ejecutamos este mismo código desde la
terminal es, por lo general, UTF-8, de modo que el
consola interactiva, veremos que p.stdout
argumento pasado a run() deberá ser
encoding="utf-8". La variable os.name contiene el contiene el resultado del comando.
nombre del sistema operativo, en el cual nos podemos
basar para determinar el valor correcto del argumento: >>> import subprocess
"cp850" si os.name == "nt" o "utf-8" si os.name == >>> p = subprocess.run("hostname",
"posix". capture_output=True, encoding="cp850")
>>> p.stdout
Una vez que el comando se ha ejecutado, 'DESKTOP-JL5G5BG\n'
Python guardará su resultado en la variable
p.stdout (cuyo nombre viene de standard Recordar que podemos eliminar el salto de
output). línea al final de la cadena vía strip():
>>> p.stdout.strip()
'DESKTOP-JL5G5BG'
Python Programming
El primer argumento de run() puede ser la
ruta completa a un programa, o directamente
el llamado al mismo, por ejemplo:
>>>datos =
subprocess.run(["python","--version"],capture
_output=True,encoding="cp850")
>>> datos.stdout
'Python 3.9.5\n'
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 3 - Laboratorio 5
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descarga el material necesario de la carpeta Descargas.
Python Programming
Laboratorio 5: Buscar procesos
A continuación de este recurso encontrarás la descarga
del programa processinfo (processinfo.py), que
imprime en pantalla una lista con el nombre, PID y
usuario de cada proceso corriendo en el sistema.
Python Programming
Por ejemplo: > processinfo.py
+-------+-------------------------------------+-------------------+
| PID | Process | User |
+-------+-------------------------------------+-------------------+
| 440 | smss.exe | - |
| 448 | cmd.exe | Lautaro |
| 484 | svchost.exe | - |
| 756 | wininit.exe | - |
| 848 | dllhost.exe | Lautaro |
| 988 | svchost.exe | - |
| 1020 | IMFsrv.exe | - |
| 1040 | svchost.exe | - |
| 4764 | firefox.exe | Lautaro |
| 9104 | IMFCore.exe | Lautaro |
| 9352 | Code.exe | Lautaro |
| 9780 | Code.exe | Lautaro |
| 9860 | notepad.exe | Lautaro |
| 9904 | Code.exe | Lautaro |
| 10436 | Code.exe | Lautaro |
| 10648 | svchost.exe | - |
| 10832 | dwm.exe | - |
| 10908 | conhost.exe | Lautaro |
| 11020 | explorer.exe | Lautaro |
| 11080 | firefox.exe | Lautaro |
+-------+-------------------------------------+-------------------+
Python Programming
Crear un script buscar_proceso.py que reciba
como argumento a través de la consola el
nombre de un proceso, ejecute vía subprocess
el programa processinfo.py e imprima su PID y
usuario. Si hay varios procesos con el mismo
nombre, debe imprimir la información de todos
ellos. Por ejemplo:
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 03 - Desafío
Python Programming
¿Qué son los desafíos?
● Son ejercicios complementarios a los realizados en clase.
● Permiten practicar y consolidar los conocimientos adquiridos.
● Es recomendable que los realices antes de rendir el
examen de la clase.
Python Programming
Ejercicio 1: Cliente
Crear una clase cliente que pida por argumento los
atributos: nombre_apellido(str) y el cuit
(str, usar guiones del medio).
Únicamente tendrá un método que sea
.mostrar_info() que muestra por pantalla el
nombre del cliente y su cuit.
Ejemplo al crear una instancia:
cliente1 = Cliente(nombreyapellido,cuit)
Python Programming
Ejercicio 2: Quedó registrado
Tomar de la sección llamada Descarga, el Si se selecciona la opción 1, se procede a
Programa Buscar Archivos. El mismo recibe pedir la ruta y la extensión por teclado.
como argumento una ruta y una extensión.
Transformar el mismo creando un menú, Tratar de usar alguna manera para borrar
donde tengamos las siguientes opciones. pantalla y que siempre volvamos al menú
recurrentemente, pero que la pantalla
Menú quede limpia.
1 - Buscar archivos con determinada
extensión
Además, podríamos implementar el uso del
2 – Salir módulo “tabulate” (investigar) que se instala
>>> con “pip”, y sirve para armar una tabla,
entonces se podría listar los archivos con un
número de costado indicando el orden que
se fueron encontrando en esa tabla.
Python Programming
El resultado en pantalla sería algo como esto:
Python Programming
Ejercicio 3: Backup
Como bien sabemos “pip” nos permite Este ejercicio trata de crear un script que use
instalar módulos de terceros. Pero además de el módulo subprocess para ejecutar “pip
pasarle el argumento “install”, podemos list” y de esa manera con
pasar otros. capture_output tomar la lista y logremos
guardar en un “txt”, sólo los nombres de los
Por ejemplo, “pip list” nos muestra una módulos.
lista de los módulos instalados. Existen más
comandos, para más información, puedes Este programa será una automatización útil
ejecutar desde la consola del sistema para tener a mano y hacer un “backup”.
operativo: “ pip -h ”.
Python Programming
En la sección de Descargas encontrarás los recursos
necesarios para realizar los ejercicios y su resolución
para que verifiques cómo te fue.
Python Programming
¡Terminaste el módulo!
Estás listo para rendir el examen
Python Programming
import os
import sys
try:
# Acceder a los argumentos pasados al programa por el usuario.
ruta = sys.argv[1]
ext = sys.argv[2]
except IndexError:
print("Argumentos insuficientes. Indique la ruta en donde
buscar y la extensión.")
sys.exit()
try:
# Obtener la lista de archivos en la ruta especificada.
archivos = os.listdir(ruta)
except FileNotFoundError:
print("La ruta no existe.")
sys.exit()
def mostrar_info(self):
print("Nombre y apellido:", self.nombre_apellido)
print("Cuit:",self.cuit)
###################################################################
######
import os
import sys
try:
from tabulate import tabulate
except ModuleNotFoundError:
print("""
-> Falta el modulo tabulate
-> Instala desde la consola del sistema operativo
pip install tabulate
(pip3 en Linux o iOS)
""")
sys.exit()
###################################################################
########
def verificar(dato,texto):
while dato == "":
print("Error, ¡Campo vacio!")
dato = input(texto)
return dato
def listar(rut,ext):
try:
# Obtener la lista de archivos en la ruta especificada.
archivos = os.listdir(rut)
except FileNotFoundError:
return False
# Si la extensión no empieza con un punto, agregárselo.
if not ext.startswith("."):
ext = "." + ext
#lista coincidencias para guardar los archivos con ext y luego
armar tabla
coincidencias =[]
# para contar los archivos coincidentes
contador = 0
# Recorrer la lista de archivos.
for archivo in archivos:
# Imprimir únicamente los que terminan con la extensión
ingresada.
if archivo.endswith(ext):
contador +=1
coincidencias.append([contador, archivo])
print(tabulate(coincidencias,headers=["ID","ARCHIVO"],tablefmt="pre
tty"))
return True
###################################################################
############
if os.name == "nt":
borrar = "cls"
else:
borrar = "clear"
os.system(borrar)
while True:
print("""
Menú
1 - Buscar archivos con determinada extensión
2 – Salir
""")
opcion = input(">>> ")
if opcion == "1":
ruta = input("Ingrese ruta: ")
ruta = verificar(ruta,"Ingrese ruta nuevamente: ")
extension = input("Ingrese extensión de archivo a buscar:
")
extension = verificar(extension,"Ingrese extensión de
archivo a buscar nuevamente: ")
if not listar(ruta,extension):
print("La ruta no existe.")
elif opcion == "2":
print("¡Gracias por usar nuestro programa!")
break
else:
print("¡Error de opción!")
input("Toque ENTER para continuar...")
os.system(borrar)
import subprocess
import time
import sys
import os
if os.name == "nt":
comando = "pip"
borrar = "cls"
else:
comando = "pip3"
borrar = "clear"
os.system(borrar)
print("Lanzando el backup...")
print("Espere un momento, por favor")
time.sleep(3)
try:
p =
subprocess.run([comando,"list"],capture_output=True,encoding="cp850
")
except Exception:
print("Revisar hay algun problema con pip, ya que no se puede
ejecutar")
print("Backup terminado sin completar el proceso")
sys.exit()
texto = p.stdout
listado = (texto.strip()).split()[4:]
listado = listado[::2]
nombres =[]
for n in listado:
nombres.append(n+"\n")
f = open("backup.txt","w")
f.writelines(nombres)
f.close()
Python Programming
En este módulo verás:
● API estándar.
● Módulo sqlite3
● Módulo PyMySQL
● Conexión a una base de datos y ejecución
de consultas.
● Obtener el resultado de una consulta.
● Inyección de código SQL y cómo prevenirla.
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 4
Python Programming
Conexión a bases
de datos
Python Programming
Conexión e interacción
con bases de datos relacionales
La conexión a bases de datos desde Python ● MySQL
se realiza a través de un módulo o paquete,
todos ellos instalables vía el comando pip, ● PostgreSQL
como hemos visto. ● SQLite
Entre los motores de bases de datos más ● SQL Server
populares y para los cuales Python provee
uno o más módulos para interactuar con ● Oracle
ellos se encuentran:
Python Programming
En este curso estaremos trabajando con tener un módulo oficial y otros desarrollados
SQLite y MySQL. La buena noticia es que en por la comunidad. A continuación, una lista
Python existe una API estándar (llamada de los principales para los motores
DB-API) que es implementada por mencionados anteriormente:
prácticamente todos los módulos y paquetes
que permiten trabajar con algún motor de ● MySQL: mysql-connector-python,
bases de datos relacionales. De modo que lo PyMySQL, MySQLdb.
que aprendamos aquí para estos dos ● PostgreSQL: psycopg, pg8000.
motores será prácticamente igual o muy
similar cuando intentes utilizar módulos para ● SQLite: sqlite3 (incluido en la librería
el resto de los motores. estándar).
Para interactuar con una base de datos desde ● SQL Server: pymssql, pyodbc.
Python es necesario, en primer lugar, tener
● Oracle: cx_Oracle.
instalado el módulo correspondiente. Cada
uno de los motores de bases de datos suele
Python Programming
Lo segundo que necesitamos es tener una
base de datos a la cual conectarnos. Si
queremos crear una base de datos local para
hacer pruebas, deberemos, además del
módulo de Python, instalar el motor de base
de datos correspondiente (es decir, descargar
e instalar MySQL, o PostgreSQL, u Oracle, etc.).
La única excepción para esto es SQLite que,
por ser muy pequeño y trabajar con archivos
en el sistema, ya está incorporado en Python.
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
Glosario básico SQL
Atención, te recordamos que este apunte es tan solo un ayuda memoria. Uno de los requisitos para
este curso es tener conocimientos o haber cursado el curso introductorio a bases de datos con
MySQL
SQL es un estándar, pero ... aunque SQL es un estándar ANSI / ISO, existen diferentes
versiones del lenguaje SQL.
Sin embargo, para cumplir con el estándar ANSI, todos admiten al menos los comandos
principales (como SELECT, UPDATE, DELETE, INSERT, WHERE) de manera similar.
CREATE
Crea una nueva tabla en la base de datos. Permite especificar el nombre de la tabla y el
nombre de cada columna en la tabla con su tipo de dato asociado.
También se puede usar para crear una nueva BD.
INSERT
Permite insertar elementos en las tablas
DROP
La instrucción DROP se utiliza para eliminar una tabla. También se puede usar para eliminar
una base de datos.
DROP TABLE table_name;
DELETE
Las sentencia DELETE se puede utilizar para eliminar filas de una tabla.
SELECT
Las sentencias SELECT se utilizan para recuperar datos de una base de datos. Cada
consulta comenzará con SELECT.
UPDATE
La instrucción UPDATE se usa para modificar los registros existentes en una tabla.
WHERE
Es una cláusula que indica que se desea filtrar el conjunto de resultados para incluir solo
filas donde la condición es verdadera.
LIKE
Para comparar porciones de cadenas, por lo general se acompaña al texto para buscar
coincidencias con el símbolo % . Por ejemplo coincidencias que empiecen con M:
OPERADOR AND
AND es un operador que combina dos condiciones. Ambas condiciones deben cumplirse
para que la fila se incluya en el conjunto de resultados.
OPERADOR OR
OR es un operador que filtra el conjunto de resultados para incluir solo las filas en las que
cualquiera de las condiciones es verdadero.
Python Programming
SQLite
Python Programming
SQLite
SQLite es un motor de bases de datos El conjunto de la base de datos (definiciones,
relacional escrita en C. Este proyecto es tablas, índices, y los propios datos), son
de dominio público creado por D. Richard guardados como un solo fichero estándar en
Hipp. la máquina host. Este diseño simple, se logra
bloqueando todo el fichero de base de datos
SQLite no funciona como la mayoría de los al principio de cada transacción.
motores BD, sistemas cliente-servidor. En
lugar de eso, la biblioteca SQLite se enlaza En su versión 3, SQLite permite bases de
con el programa pasando a ser parte integral datos de hasta 2 Terabytes de tamaño
del mismo. El programa principal utiliza la máximo.
funcionalidad de SQLite a través de llamadas
simples a subrutinas y funciones. Esto reduce
la latencia en el acceso a la base de datos.
Python Programming
Para la práctica siguiente, si deseamos
visualizar los datos o manipularlos,
podemos descargar una aplicación
de escritorio llamada DB browser for
SQlite, la cual nos va a permitir
manipular los datos desde una
interfaz gráfica.
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 4
Python Programming
SQLite3 en P1thon
Python Programming
El módulo sqlite3 en P1thon
La librería estándar de Python incluye el Para poder ejecutar una consulta, primero es
módulo sqlite3 que permite la necesario crear un cursor.
comunicación con bases de datos SQLite, así
cursor = conn.cursor()
que por el momento no tendremos que
instalar nada con pip. Hecho esto, vía el método execute()
Para crear una conexión desde un script de procedemos a correr un código SQL.
Python, utilizamos la función connect() # Ejecutar una consulta.
indicando el nombre del archivo (si no existe, cursor.execute("CREATE TABLE personas
es creado automáticamente). (nombre TEXT, edad NUMERIC)")
conn = sqlite3.connect("database.sqlite")
Python Programming
Cuando una consulta realiza una Una vez terminada de usar la conexión, debe
modificación (cláusulas como CREATE, cerrarse:
INSERT, UPDATE, DELETE , etc.) en la
conn.close()
información o estructura de alguna tabla de
la base de datos, es necesario “guardar los Para agregar algo de información, vamos a
cambios” a través de una operación llamada crear una tupla personas que contenga otras
commit y que en Python se realiza a través tuplas con la estructura (nombre, edad ), y
de la función homónima. luego para cada una de ellas ejecutaremos
# Guardar los cambios. una consulta INSERT para añadirla a la tabla.
conn.commit()
personas = (
("Pablo", 30),
Si la conexión se cierra y no se ha llamado a ("Jorge", 41),
la función commit(), toda consulta que haya ("Pedro", 27)
alterado la base de datos habrá sido )
desestimada. for nombre, edad in personas:
cursor.execute("INSERT INTO personas
VALUES (?, ?)", (nombre, edad))
conn.commit()
Python Programming
En las consultas nunca se debe utilizar Hecho esto, vamos a ejecutar una simple
ninguno de los métodos que provee Python consulta que retorne todas las filas de dicha
para incluir variables dentro de una cadena. tabla:
En su lugar, se coloca un signo de interroga-
cursor.execute("SELECT * FROM personas")
ción por cada valor que se quiera reemplazar, personas = cursor.fetchall()
y luego se pasan los objetos dentro de una print(personas)
tupla como segundo argumento. Se trata de
una medida de seguridad para evitar Esto imprime en pantalla:
inyección de código SQL (véase el apartado
[('Pablo', 30), ('Jorge', 41), ('Pedro',
sobre cómo prevenir inyecciones SQL más 27)]
abajo).
La función fetchall() retorna la
información devuelta por la consulta en una
lista que contiene tuplas, y cada una de éstas
corresponde a una fila de la tabla. La lista
puede estar vacía si la tabla está vacía o si los
criterios de la consulta no coinciden con
ninguna fila de la tabla.
Python Programming
Si se quiere retornar únicamente el primer Cuando la ejecución de una consulta falla,
resultado obtenido, puede utilizarse la excepción lanzada es:
fetchone() . sqlite3.OperationalError .
print(cursor.fetchone()) Por ejemplo, la siguiente consulta tiene un
error de sintaxis.
El valor de retorno de esta función es una
tupla, no una lista, ya que solo obtiene una cursor.execute("SELECT FROM personas")
fila de la tabla especificada. En este caso,
imprime: La excepción es la siguiente:
Traceback (most recent call last):
('Pablo', 30)
[...]
cursor.execute("SELECT FROM
Del mismo modo, el valor de retorno puede personas")
ser None si la tabla está vacía o si la consulta sqlite3.OperationalError: near "FROM":
no devolvió ningún resultado. syntax error
Python Programming
Puede ser capturada usando try/except como
cualquier otra:
try:
cursor.execute("SELECT FROM personas")
except sqlite3.OperationalError:
print("La consulta no se ejecutó correctamente.")
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 4
Python Programming
Prevención
en SQLite3
Python Programming
Prevención en SQLite3
La inyección de código SQL es un tipo de vulnerabilidad
informática que permite a un usuario no autorizado ejecutar
consultas SQL en una base de datos y que puede darse en
cualquier tipo de aplicación (de consola, web, de escritorio,
móvil). Para que un programa genere este tipo de
vulnerabilidad es necesario que le permita al usuario ingresar
algún dato y luego que este dato sea incluido dentro de una
consulta a la base de datos.
Python Programming
Por ejemplo, consideremos el siguiente programa que
solicita al usuario un nombre y una edad y luego inserta
estos datos en una base de datos SQLite.
import sqlite3
conn = sqlite3.connect("personas.sqlite")
cursor = conn.cursor()
try:
cursor.execute("CREATE TABLE personas (nombre TEXT, edad NUMERIC)")
except sqlite3.OperationalError:
pass
nombre = input("Nombre: ")
edad = int(input("Edad: "))
cursor.execute(f"INSERT INTO personas VALUES ('{nombre}', {edad})")
conn.commit()
print("¡Datos ingresados correctamente!")
conn.close()
Python Programming
En una ejecución típica de este código, la Si nombre es "Carlos" y edad es 30,
consola se vería más o menos así: entonces la consulta que se ejecuta es la
siguiente:
Nombre: Carlos
Edad: 30 INSERT INTO personas VALUES ('Carlos', 30)
¡Datos ingresados correctamente!
El problema con esto es que no se efectúa
Ahora bien, los datos ingresados por el validación alguna de los datos ingresados por
usuario son incorporados a la consulta SQL el usuario en la consola. ¿Qué ocurre si se
utilizando la sintaxis de Python de anteponer ingresan los siguientes datos?
una f a la cadena y encerrar entre llaves los
nombres de las variables cuyos valores Nombre: Carlos', 30); DELETE FROM personas;
--
queremos incluir. Más específicamente en la
Edad: 30
siguiente línea:
cursor.execute(f"INSERT INTO personas VALUES
('{nombre}', {edad})")
Python Programming
Según la lógica de nuestro programa, la El doble guión medio al final de la consulta
consulta quedaría así (nótese que hay un introduce un comentario, es decir, los últimos
espacio después de los dos guiones medios): caracteres ', 30) son ignorados por completo,
y esto es necesario para que el motor de bases
INSERT INTO personas VALUES ('Carlos', 30);
DELETE FROM personas; -- ', 30) de datos (en este caso, SQLite) no arroje
ningún error de sintaxis. Entonces, hasta
ahora, teóricamente habríamos logrado
Puesto que en SQL se pueden separar varias inyectar una consulta SQL (DELETE FROM ) a
consultas usando punto y coma, el código partir de la función input(). Pero si
anterior realiza lo siguiente: ingresamos estos datos (es decir, el nombre y
la edad tal como lo indicamos más arriba)
1. Insertar una fila con los valores “Carlos” y
veremos que el programa arroja el siguiente
30 como nombre y edad.
error.
2. Eliminar todas las filas de la tabla. Traceback (most recent call last):
[...]
cursor.execute(f"INSERT INTO personas
VALUES ('{nombre}', {edad})")
sqlite3.Warning: You can only execute one
statement at a time.
Python Programming
Nos encontramos con que el módulo SQLite, Si queremos ejecutar más de una consulta
particularmente su función execute(), solo con una misma cadena, debemos usar la
permite ejecutar una consulta a la vez, de función executescript() . Intentemos,
modo que toda cadena que le pasemos como entonces, reemplazar esta línea:
argumento y que posea más de una consulta
cursor.execute(f"INSERT INTO personas VALUES
(separadas por punto y coma) hará que el ('{nombre}', {edad})")
módulo sqlite3 excepción anterior (nótese
que esto ocurre con este módulo en particular por esta:
y puede no aplicarse a otros módulos para
cursor.executescript(f"INSERT INTO personas
interactuar con bases de datos).
VALUES ('{nombre}', {edad})")
Python Programming
Veremos que el programa no arroja ningún error y al abrir la
base de datos nuestra tabla personas estará efectivamente
vacía. ¡Hemos inyectado correctamente código SQL!
Pues bien, ¿cómo hacemos para prevenir esta vulnerabilidad?
Recordemos que su origen radica en incorporar variables
cuyos valores vienen del usuario dentro de la consulta SQL. El
método por el cual se efectúe esta operación es indistinto, es
decir, puede ser cualquiera de los siguientes:
● .execute(f"INSERT INTO personas VALUES ('{nombre}',
{edad})")
● .execute("INSERT INTO personas VALUES ('{}',
{})".format(nombre, edad))
● .execute("INSERT INTO personas VALUES ('" + nombre + "',
" + str(edad) + ")")
● .execute("INSERT INTO personas VALUES ('%s', %d)" %
(nombre, edad))
Python Programming
Estos cuatro códigos generan la vulnerabi- Nótese que, por más que nombre sea una
lidad de inyección de SQL. La única forma cadena, dentro de la consulta no usamos
de prevenirla es chequear que los valores comillas simples alrededor del signo de
de nombre y edad (o cualquier otra variable interrogación. Ahora, ejecutemos nuevamente
que sea incluida dentro de la consulta) no el programa con esta línea actualizada e
contengan código SQL. No es necesario que ingresemos los datos para inyectar código:
hagamos este trabajo manualmente, la
Nombre: Carlos', 30); DELETE FROM personas;
función execute() lo hará por nosotros si --
pasamos esos datos en una tupla como Edad: 30
segundo argumento y, en la consulta, ¡Datos ingresados correctamente!
utilizamos un signo de interrogación para
indicar los lugares en donde deben ubicarse
dichos datos.
cursor.execute("INSERT INTO personas VALUES
(?, ?)", (nombre, edad))
Python Programming
En efecto los datos se ingresaron Lo cual es totalmente lógico, puesto que
correctamente, pero no hubo inyección de hemos dicho que el nombre que queríamos
código alguna. Esto es, la consulta DELETE ingresar era Carlos', 30); DELETE FROM
FROM personas no se ejecutó. Más bien, el personas; -- (un nombre un poco raro).
resultado es el siguiente: Así hemos eliminado la posibilidad de
inyección de código SQL en nuestra
aplicación.
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 4 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Tabla de productos
Desarrollar un programa de Python que cree una base de
datos de SQLite llamada productos.sqlite y una tabla
de nombre productos con las siguientes columnas:
id Entero
nombre Texto
precio Entero
Python Programming
Luego el programa debe insertar las siguientes filas:
id nombre precio
1 Teclado 25
2 Mouse 18
3 Monitor 300
4 Parlantes 100
Python Programming
Ejercicio 2: Administrar productos
Realizar un programa que permita agregar ● La opción de agregar productos será la
nuevos productos a la base de datos anterior que despliegue la entrada de datos.
a través de la consola. Se deberá solicitar
para cada producto un id (numérico entero), ● La opción ver productos mostrara todos
un nombre (texto) y un precio (numérico los productos cargados en la tabla.
entero). En el caso de los datos numéricos, ● La opción de salir nos permite salir del
volver a preguntar si el valor ingresado por el programa.
usuario es incorrecto.
Para acompañar al programa, hacer un
menú como el siguiente:
Menú
1 – Agregar Productos
2 – Ver productos
3 – Salir
Python Programming
Recomendamos el uso de herramientas empleadas en
otras ocasiones:
● os.sytem("cls") para borrar pantalla, en caso de Linux
“clear”
● sys.exit() para salir es una buena opción. También
podés usar bucle while para el menú, y usar break
para terminar el bucle.
● El módulo “tabulate” permite generar tablas
coherentes con datos tabulados en la consola, podría
ser una opción para mostrar los datos.
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
import sqlite3
# Crear la tabla.
cursor.execute(
"CREATE TABLE productos (id INT, nombre TEXT, precio INT)")
# Cerrar la conexión.
conn.close()
import os
import sqlite3
from tabulate import tabulate
def pedir_entero(mensaje):
"""
Pide un número entero a través de la consola hasta que el
usuario ingrese un dato válido.
"""
while True:
try:
entero = int(input(mensaje))
except ValueError:
pass
else:
# Si uso "return" adentro de un bucle no es necesario
# usar "break", está implícito.
return entero
def guardar(i,n,p):
conn = sqlite3.connect("comercio.sqlite")
cursor = conn.cursor()
try:
cursor.execute( "INSERT INTO productos VALUES (?, ?,
?)",(i, n, p))
except sqlite3.OperationalError:
cursor.execute("CREATE TABLE productos (id INT,nombre TEXT,
precio INT)")
cursor.execute( "INSERT INTO productos VALUES (?, ?,
?)",(i, n, p))
conn.commit()
conn.close()
print("¡Producto guardado con exito!")
def mostrar():
conn = sqlite3.connect("comercio.sqlite")
cursor = conn.cursor()
try:
cursor.execute("SELECT * FROM productos")
datos = cursor.fetchall()
except (sqlite3.ProgrammingError,sqlite3.OperationalError):
datos = None
conn.commit()
conn.close()
return datos
###################################################################
#####
if os.name == "nt":
borrar = "cls"
else:
borrar = "clear"
os.system(borrar)
while True:
print("""
Menú
1 - Ingresar producto
2 - Mostrar productos
3 - Salir
""")
opcion = input(">>> ")
if opcion == "1":
print("Ingrese los datos del nuevo producto.")
# No uso "id" como nombre de variable porque es el nombre
de una
# función incorporada de Python.
id_producto = pedir_entero("ID: ")
nombre = input("Nombre: ")
precio = pedir_entero("Precio: u$s")
# Inserto el producto en la base de datos.
guardar(id_producto,nombre,precio)
elif opcion == "2":
r = mostrar()
if r:
# tabulate es una funcion (del modulo tabulate) para
# crear una tabla con apariencia d tabla en la consola
# Si te interesa saber como se usa podes ver la
documentacion
# https://github.com/astanin/python-tabulate
print("\n")
print(tabulate(r,headers=["ID","NOMBRE","PRECIO U$S"],
tablefmt="pretty"))
print("\n")
else:
print("No hay datos para mostrar")
elif opcion == "3":
print("¡Gracias por usar nuestro programa!")
break
else:
print("Error de opcion. Vualva a intentarlo")
input("Toque ENTER para continuar...")
os.system(borrar)
P1thon Programming
Módulo 4
Python Programming
M1SQL
Python Programming
M1SQL
MySQL es un gestor de bases de datos que Es un motor multiusuario y se ofrece bajo la
permite la interacción con los lenguajes de GNU GPL, aunque también es posible
programación web más utilizados adquirir una licencia para empresas que
actualmente. Nació como software libre y la quieran incorporarlo en productos privativos
mayor parte de su código se encuentra (la compra por Oracle se orientó a este
escrito en lenguaje C/C++. ámbito empresarial).
En 2008, MySQL fue adquirido por Sun Una de las principales características de
Microsystems, quien en 2010 fue comprado MySQL es que puede utilizarse en diferentes
por Oracle Corporation. Dicha empresa ya sistemas tales como Linux, Windows, AIX,
había adquirido cinco años antes Innobase, Solaris. También, tiene múltiples motores de
compañía que desarrollaba el motor InnoDB almacenamiento para adaptarse a las
para MySQL. necesidades concretas de cada entorno.
Python Programming
La rapidez es otro de los puntos fuertes a la Para la próxima práctica, si deseamos
hora de realizar operaciones en MySQL. visualizar los datos o manipularlos, podemos
Además de ser capaz de soportar una gran descargar XAMPP desde la web oficial:
cantidad de diversos tipos de datos. https://www.apachefriends.org/
En lo relativo a la seguridad, MySQL tiene
un sistema de contraseñas que permite
verificación basada en el host lo que hace que
sea de confianza.
Y sin duda una de las ventajas de MySQL es
que cuenta con una gran comunidad con la
que intercambiar dudas y conocimientos.
Es escalable y fácil de aprender, lo que la
convierte en uno de los motores de bases de
datos más utilizada.
Python Programming
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 4
Python Programming
M1SQL en P1thon
Python Programming
El módulo p1m1sql
PyMySQL es un módulo para comunicarse Para conectarse a MySQL, usamos la función
con bases de datos MySQL, que ya sabes connect(), indicando la dirección y el
utilizar por el simple hecho de haber leído el puerto del servidor, nombre de la base de
apartado anterior sobre el módulo sqlite3. datos, usuario y contraseña.
Ambos adhieren a la DB-API por lo que su
import pymysql
estructura es casi idéntica.
conn = pymysql.connect(
PyMySQL puede ser instalado vía pip host="localhost",
ejecutando: port=3306,
user="usuario",
pip install pymysql passwd="clave",
db="nombredb"
)
Python Programming
(Cuando llamamos a una función -y, en Nótese que esta última funciona con los
general, para cualquier expresión encerrada caracteres %s en lugar del signo de
entre paréntesis- es posible especificar los interrogación para incluir objetos de Python
argumentos en distintas líneas para mejorar en una consulta:
la legibilidad. También podemos indicarle a
for nombre, edad in personas:
Python que seguiremos un código en la cursor.execute("INSERT INTO personas
próxima línea vía el carácter \ ─una barra VALUES (%s, %s)", (nombre, edad))
invertida─).
El resto de las funciones son similares a las de En el caso de PyMySQL, la excepción lanzada
SQLite. conn.cursor() retorna un cursor ante un error de sintaxis es:
a partir del cual podemos llamar a execute() pymysql.ProgrammingError .
para ejecutar consultas.
Python Programming
Por ejemplo: No obstante, los siguientes casos arrojan otra
excepción, pymysql.err.InternalError :
cursor.execute("SELECT FROM personas")
# La fila `apellido` no existe.
provoca lo siguiente: cursor.execute("SELECT apellido FROM personas")
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 4
Python Programming
Prevención
en M1SQL
Python Programming
Prevención en p1m1sql
En todos los motores de bases de datos, en Vamos a considerarlas en este apartado para
todos los módulos para interactuar con ellos el motor de base de datos MySQL usando el
y en todos los lenguajes de programación, la módulo PyMySQL (en Python existen otros
lógica para prevenir una inyección de código módulos para acceder a bases de datos
SQL es la misma: no incluir variables cuyos MySQL, como mysql-connector-python y
valores provienen del usuario dentro de una MySQLdb).
consulta SQL sino dejar que el módulo se
encargue de ello.
No obstante, cómo se realice esto último
puede tener algunas variaciones respecto de
lo que vimos anteriormente para SQLite.
Python Programming
Un programa análogo al anterior pero usando el módulo pymysql se vería más o menos así:
import pymysql
conn = pymysql.connect(
host="localhost",
user="usuario",
passwd="clave",
db="nombredb"
)
cursor = conn.cursor()
try:
cursor.execute("CREATE TABLE personas (nombre VARCHAR(50), edad INT)")
except pymysql.err.InternalError:
pass
nombre = input("Nombre: ")
edad = int(input("Edad: "))
cursor.execute(f"INSERT INTO personas VALUES ('{nombre}', {edad})")
conn.commit()
print("¡Datos ingresados correctamente!")
conn.close()
Python Programming
Según lo que hemos dicho, aquí tenemos el Esto ocurre porque por defecto el módulo
mismo problema con la siguiente línea: PyMySQL no permite ejecutar múltiples
consultas en una misma llamada a execute().
cursor.execute(f"INSERT INTO personas VALUES
('{nombre}', {edad})") Para hacerlo, debemos pasar el parámetro
client_flag=pymysql.constants.CLIENT
No obstante, nuevamente, si ejecutamos el .MULTI_STATEMENTS a la función connect().
programa e ingresamos estos datos: conn = pymysql.connect(
host="localhost",
Nombre: Carlos', 30); DELETE FROM personas;
user="usuario",
--
passwd="clave",
Edad: 30
db="nombredb",
client_flag=pymysql.constants.CLIENT.MULTI
Veremos que obtenemos la siguiente excepción: _STATEMENTS
)
Traceback (most recent call last):
[...]
pymysql.err.ProgrammingError: (1064, "You have
an error in your SQL syntax; check the manual
that corresponds to your MySQL server version
for the right syntax to use near 'DELETE FROM
personas; -- ', 30)' at line 1")
Python Programming
Ahora repitamos los pasos y veremos que la consulta
se ejecuta correctamente:
Nombre: Carlos', 30); DELETE FROM personas; --
Edad: 30
¡Datos ingresados correctamente!
Python Programming
No confundirse con el siguiente código, que sí genera la vulnerabilidad:
cursor.execute("INSERT INTO personas VALUES ('%s', %d)" % (nombre, edad))
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 4 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 2: Administrar productos v.2
Realizar un programa que permita agregar ● La opción de agregar productos será la
nuevos productos a una base de datos del que despliegue la entrada de datos.
tipo MySQL a través de la consola. Se deberá
solicitar para cada producto un id (numérico ● La opción ver productos mostrara todos
entero), un nombre (texto) y un precio los productos cargados en la tabla.
(numérico entero). En el caso de los datos ● La opción de salir nos permite salir del
numéricos, volver a preguntar si el valor programa.
ingresado por el usuario es incorrecto.
Para acompañar al programa, hacer un
menú como el siguiente:
Menú
1 – Agregar Productos
2 – Ver productos
3 – Salir
Python Programming
Recomendamos: Datos para conectarse:
● Los mismos consejos para el ejercicio 2 ● Host = “127.0.0.1”
del laboratorio anterior, la versión 1
con sqlite, pero teniendo en cuenta ● Puerto = 3306
que ahora estamos trabajando con ● Usuario = “root”
MySQL.
● Clave = “”
● Esta vez la base de datos ya estará
creada en el servidor por nosotros. ● db = “comercio”
Python Programming
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
import os
import pymysql
from tabulate import tabulate
def pedir_entero(mensaje):
"""
Pide un número entero a través de la consola hasta que el
usuario ingrese un dato válido.
"""
while True:
try:
entero = int(input(mensaje))
except ValueError:
pass
else:
# Si uso "return" adentro de un bucle no es necesario
# usar "break", está implícito.
return entero
def guardar(i,n,p):
conn = pymysql.connect(host="127.0.0.1",port=3306, user="root",
passwd="", db="comercio")
cursor = conn.cursor()
try:
cursor.execute( "INSERT INTO productos VALUES (%s, %s,
%s)",(i, n, p))
except (pymysql.OperationalError,pymysql.err.ProgrammingError):
cursor.execute("CREATE TABLE productos (id INT,nombre TEXT,
precio INT)")
cursor.execute("INSERT INTO productos VALUES (%s, %s,
%s)",(i, n, p))
conn.commit()
conn.close()
print("¡Producto guardado con exito!")
def mostrar():
conn = pymysql.connect(host="127.0.0.1",port=3306, user="root",
passwd="", db="comercio")
cursor = conn.cursor()
try:
cursor.execute("SELECT * FROM productos")
datos = cursor.fetchall()
except (pymysql.OperationalError,pymysql.err.ProgrammingError):
datos = None
conn.commit()
conn.close()
return datos
###################################################################
#####
if os.name == "nt":
borrar = "cls"
else:
borrar = "clear"
os.system(borrar)
while True:
print("""
Menú
1 - Ingresar producto
2 - Mostrar productos
3 - Salir
""")
opcion = input(">>> ")
if opcion == "1":
print("Ingrese los datos del nuevo producto.")
# No uso "id" como nombre de variable porque es el nombre
de una
# función incorporada de Python.
id_producto = pedir_entero("ID: ")
nombre = input("Nombre: ")
precio = pedir_entero("Precio: u$s")
# Inserto el producto en la base de datos.
guardar(id_producto,nombre,precio)
elif opcion == "2":
r = mostrar()
if r:
# tabulate es una funcion (del modulo tabulate) para
# crear una tabla con apariencia d tabla en la consola
# Si te interesa saber como se usa podes ver la
documentacion
# https://github.com/astanin/python-tabulate
print("\n")
print(tabulate(r,headers=["ID","NOMBRE","PRECIO U$S"],
tablefmt="pretty"))
print("\n")
else:
print("No hay datos para mostrar")
elif opcion == "3":
print("¡Gracias por usar nuestro programa!")
break
else:
print("Error de opcion. Vualva a intentarlo")
input("Toque ENTER para continuar...")
os.system(borrar)
P1thon Programming
Módulo 04 - Proyecto integrador - Etapa 2
Python Programming
Etapa 2
Introducción
Esta segunda parte trata de que
primordialmente modifiques la parte del
backup de los datos que hacíamos en 2
archivos del tipo txt.
1. Ahora vamos a querer que las ventas
sean una tabla en una base de datos
llamada “comercio.sqlite” y lo mismo
con los registros.
Ambas tablas: venta y registro, deben
estar en la misma base de datos.
Python Programming
Ventas:
Sat Oct 23
1 Juan 10:18:18 1 1 0 2 15.0
2021
Sat Oct 23
2 Tomas 10:20:10 1 1 1 1 24.0
2021
Python Programming
Registro:
Python Programming
El campo id (autoincremental) es opcional.
El programa NO debe detenerse a causa de errores,
manejar las excepciones. Usar las herramientas vistas
únicamente en el curso hasta el momento para resolver
el trabajo.
El menú debería ser el mismo que en la anterior entrega.
Se puede mejorar todo aquello que crean necesario
mejorar. Por ejemplo, limpiar la pantalla al ingresar a los
diferentes menús. Pero lo más urgente es cargar los
datos en la base y en las respectivas tablas.
Python Programming
En la sección de Descargas encontrarás los recursos
necesarios para realizar los ejercicios y su resolución
para que verifiques cómo te fue.
Python Programming
¡Sigamos trabajando!
Python Programming
import time
import sqlite3
import os
def ingreso_str(mensaje,error):
dato = input(mensaje)
while dato=="":
print(error)
dato = input(mensaje)
return dato
def ingreso_int(mensaje,error):
dato = input(mensaje)
while True:
try:
dato = int(dato)
break
except ValueError:
print(error)
dato = input(mensaje)
return dato
def ingreso_float(mensaje,error):
dato = input(mensaje)
while True:
try:
dato = float(dato)
break
except ValueError:
print(error)
dato = input(mensaje)
return dato
def saludar(nombre):
print("Hamburguesas IT")
print("Encargad@ -> " + nombre )
print("Recuerda, siempre hay que recibir al cliente con una
sonrisa :) ")
def ingresar():
print("Bienvenido a Hamburguesas IT")
nombre = ingreso_str("Ingrese su nombre encargad@: ","Error,
campo vacio.")
return nombre
def calcular(precios,pedido):
total = 0
total += pedido["ComboSimple"] * precios["ComboSimple"]
total += pedido["ComboDoble"] * precios["ComboDoble"]
total += pedido["ComboTriple"] * precios["ComboTriple"]
total += pedido["Flurby"] * precios["Flurby"]
return total
def confirmar():
respuesta = ingreso_str("¿Confirma el pedido? Y/N: ","Error.
Campo vacio.")
while respuesta.lower() != "y" and respuesta.lower() != "n" and
respuesta.lower() != "yes" and respuesta.lower() != "no":
print("Ingrese únicamente Y o N")
respuesta = ingreso_str("¿Confirma el pedido? Y/N:
","Error. Campo vacio.")
if respuesta == "y" or respuesta == "yes":
return True
else:
return False
def guardarVentas(data):
datos = tuple(data.values())
conn = sqlite3.connect("comercio.sqlite")
cursor = conn.cursor()
try:
cursor.execute("INSERT INTO ventas VALUES
(null,?,?,?,?,?,?,?)", datos)
except sqlite3.OperationalError:
cursor.execute("""CREATE TABLE ventas
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
cliente TEXT,
fecha TEXT,
ComboS INT,
ComboD INT,
ComboT INT,
Flurby INT,
total REAL
)
""")
cursor.execute("INSERT INTO ventas VALUES
(null,?,?,?,?,?,?,?)", datos)
conn.commit()
conn.close
print("¡Se salvo el nuevo contacto!")
def guardarEncargado(data):
datosIn = (data["nombre"],data["ingreso"],"IN",0)
datosOut =
(data["nombre"],data["egreso"],"OUT",data["facturado"])
conn = sqlite3.connect("comercio.sqlite")
cursor = conn.cursor()
try:
cursor.execute("INSERT INTO registro VALUES
(null,?,?,?,?)", datosIn)
cursor.execute("INSERT INTO registro VALUES
(null,?,?,?,?)", datosOut)
except sqlite3.OperationalError:
cursor.execute("""CREATE TABLE registro
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
encargado TEXT,
fecha TEXT,
evento TEXT,
caja REAL
)
""")
cursor.execute("INSERT INTO registro VALUES
(null,?,?,?,?)", datosIn)
cursor.execute("INSERT INTO registro VALUES
(null,?,?,?,?)", datosOut)
conn.commit()
conn.close
print("¡Se salvo el nuevo contacto!")
###################################################################
###
if(os.name=="nt"):
borrar = "cls"
else:
borrar = "clear"
precios =
{"ComboSimple":5,"ComboDoble":6,"ComboTriple":7,"Flurby":2}
salir = True
os.system(borrar)
while salir:
os.system(borrar)
datosEncargado =
{"nombre":"","ingreso":"","egreso":"","facturado":0}
encargado = ingresar()
inicio = time.asctime()
datosEncargado["nombre"] = encargado
datosEncargado["ingreso"] = inicio
caja = 0
os.system(borrar)
while True:
saludar(encargado)
print("""
1 – Ingreso de nuevo pedido
2 – Cambio de turno
3 – Apagar sistema
""")
opcion = ingreso_str(">>>","Error, ingreso vacio")
os.system(borrar)
if opcion == "1":
pedido =
{"cliente":"","fecha":"","ComboSimple":0,"ComboDoble":0,"ComboTripl
e":0,"Flurby":0,"total":0}
pedido["cliente"] = ingreso_str("Ingrese el nombre del
cliente: ","Error. No deje este campo vacio")
pedido["ComboSimple"] = ingreso_int("Ingrese cantidad
Combo S: ","Error, solo números")
pedido["ComboDoble"] = ingreso_int("Ingrese cantidad
Combo D: ","Error, solo números")
pedido["ComboTriple"] = ingreso_int("Ingrese cantidad
Combo T: ","Error, solo números")
pedido["Flurby"] = ingreso_int("Ingrese cantidad
Flurby: ","Error, solo números")
costoTotal = calcular(precios,pedido)
print("Total $", costoTotal)
recibido = ingreso_float("Abona con $ ","Error, solo
números")
while costoTotal > recibido:
print("Ingrese un monto mayor, no alcanza.")
recibido = ingreso_float("Abona con $ ","Error,
solo números")
print("Vuelto $",recibido-costoTotal)
estado = confirmar()
if estado:
caja += costoTotal
pedido["fecha"] = time.asctime()
pedido["total"] = costoTotal
guardarVentas(pedido)
else:
print("Pedido cancelado")
elif opcion == "2":
datosEncargado["egreso"] = time.asctime()
datosEncargado["facturado"] = caja
guardarEncargado(datosEncargado)
break
elif opcion == "3":
datosEncargado["egreso"] = time.asctime()
datosEncargado["facturado"] = caja
guardarEncargado(datosEncargado)
print("¡Muchas gracias por usar nuestro programa!")
salir = False
break
else:
print("Opcion incorrecta, vuelva a intentarlo")
print("\n*3")
os.system(borrar)
P1thon Programming
Módulo 04 - Desafío
Python Programming
¿Qué son los desafíos?
● Son ejercicios complementarios a los realizados en clase.
● Permiten practicar y consolidar los conocimientos adquiridos.
● Es recomendable que los realices antes de rendir el
examen de la clase.
Python Programming
Ejercicio 1: Contactos I
Necesitamos almacenar: Nombre, teléfono, Si eligen la opción 1, se carga un nuevo
email y dirección de proveedores de materias contacto.Los datos se cargan por teclado.
primas para una pyme.
Si, en cambio, selecciona la opción 2, salimos.
Vamos a desarrollar un programa con un
pequeño menú que nos permita almacenar Tener en cuenta que es un menú recurrente,
esos datos. tener detalles de prolijidad, como borrar la
pantalla y otras cuestiones del estilo, puede
El menú puede ser como el siguiente: resultar en una mejor presentación.
Menú:
1. Ingreso de nuevo contacto
2. Salir
>>>
Python Programming
● La base de datos será motor Sqlite3 con nombre
datos.sqlite y la tabla debería de llamarse contactos.
● Todos los campos serán del tipo “text” .
● Si deseamos podemos agregar un campo delante
de todo que sea el ID. Ese campo ID (opcional)
puede ser auto incremental.
Python Programming
Ejercicio 2: Contactos II
Al ejercicio anterior, agregar al menú de las El nuevo menú:
opciones una opción de mostrar todos los
Menú:
contactos que, haciendo uso del módulo
1. Ingreso de nuevo contacto
“tabulate”, podríamos mostrar una tabla en
la consola con todos los contactos. 2. Mostrar todos los contactos
3. Encontrar contacto por
También agregar una opción de buscar por aproximación en el nombre
nombre, con alguna coincidencia en 4. Salir
minúsculas o en mayúsculas. Al buscar “To”, >>>
buscaría los contactos que tengan en el
campo nombre el texto “to” en alguna parte,
y mostraría todos sus datos.
Python Programming
Ejercicio 3: Comma Separated Values
Antes de entrar al ejercicio, te vamos a contar
qué son los archivos csv.
Los archivos CSV son un tipo de documento
en formato abierto sencillo para representar
datos en forma de tabla, pero en texto plano.
Las columnas se separan por comas y las filas
por saltos de línea. Se emplean mucho en
análisis de datos y otras áreas.
Python Programming
Por ejemplo, esta tabla:
Python Programming
En Python podemos crear o abrir un csv, con
la función open() y adentro de la función
pasando como argumento el nombre del
archivo con extensión csv y no como txt. Los
modos son iguales a los que manejamos con
los archivos de texto(“w”, “r” y “a”). Además,
dentro del archivo debemos respetar el
delimitador (la coma) y el salto de línea para
indicar las filas.
Esta estructura se puede armar concatenan-
do textos con “comas”, y con “\n” el salto de
línea, etc. También se puede usar un módulo
de la librería estándar de Python que se llama
“csv” y hace las cosas un poco más
automáticas.
Python Programming
Ahora si… el enunciado:
Se desea hacer un script que cuando se Ejemplo:
ejecute, descargue la tabla de contactos
(incluida en la sección Descargas) a un f = open("contactos.csv","w")
archivo csv.
Al finalizar, abrir el archivo csv con algún
El script debe de estar dentro del mismo editor de código (puede ser con el mismo
directorio que la base de datos, así no VSCode) y verificar que la estructura sea
tenemos que poner ninguna ruta absoluta, la correcta.
y de esta manera se toma por defecto la ruta
relativa.
Recordar que el procedimiento es similar al
de guardar un txt pero cambiando la
extensión a csv.
Python Programming
En la sección de Descargas encontrarás los recursos
necesarios para realizar los ejercicios y su resolución
para que verifiques cómo te fue.
Python Programming
¡Terminaste el módulo!
Estás listo para rendir el examen
Python Programming
import sqlite3
import sys
import os
try:
from tabulate import tabulate
except ModuleNotFoundError:
print("Faltan modulos, verificar e instalar con pip")
sys.exit()
###################################################################
#
def ingreso_validar(texto):
dato = input(texto)
while dato == "":
print("Error. ¡Campo Vacio!")
dato = input("Intente nuevamente. "+texto)
return dato
def guardar(n,t,e,d):
try:
conn = sqlite3.connect("datos.sqlite")
cursor = conn.cursor()
cursor.execute("INSERT INTO contactos VALUES
(null,?,?,?,?)",(n,t,e,d))
conn.commit()
conn.close
except sqlite3.OperationalError:
conn = sqlite3.connect("datos.sqlite")
cursor = conn.cursor()
cursor.execute("""CREATE TABLE contactos
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
nombre TEXT,
telefono TEXT,
email TEXT,
direccion TEXT
)
""")
cursor.execute("INSERT INTO contactos VALUES
(null,?,?,?,?)",(n,t,e,d))
conn.commit()
conn.close
print("¡Se salvo el nuevo contacto!")
###################################################################
#
if os.name == "nt":
borrar = "cls"
else:
borrar = "clear"
os.system(borrar)
while True:
print("""
Menú
1 - Ingresar nuevo contacto
2 - Salir
""")
opcion = input(">>> ")
if opcion == "1":
nombre = ingreso_validar("Ingrese nombre del contacto: ")
telefono = ingreso_validar("Ingrese teléfono: ")
email = ingreso_validar("Ingrese email: ")
direccion = ingreso_validar("Ingrese dirección: ")
guardar(nombre,telefono,email,direccion)
elif opcion == "2":
print("Gracias por usar nuestro programa")
break
else:
print("Error de opción")
input("Toque ENTER para continuar...")
os.system(borrar)
import sqlite3
import sys
import os
try:
from tabulate import tabulate
except ModuleNotFoundError:
print("Faltan modulos, verificar e instalar con pip")
sys.exit()
###################################################################
#
def ingreso_validar(texto):
dato = input(texto)
while dato == "":
print("Error. ¡Campo Vacio!")
dato = input("Intente nuevamente. "+texto)
return dato
def guardar(n,t,e,d):
try:
conn = sqlite3.connect("datos.sqlite")
cursor = conn.cursor()
cursor.execute("INSERT INTO contactos VALUES
(null,?,?,?,?)",(n,t,e,d))
conn.commit()
conn.close
except sqlite3.OperationalError:
conn = sqlite3.connect("datos.sqlite")
cursor = conn.cursor()
cursor.execute("""CREATE TABLE contactos
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
nombre TEXT,
telefono TEXT,
email TEXT,
direccion TEXT
)
""")
cursor.execute("INSERT INTO contactos VALUES
(null,?,?,?,?)",(n,t,e,d))
conn.commit()
conn.close
print("¡Se salvo el nuevo contacto!")
def traer():
try:
conn = sqlite3.connect("datos.sqlite")
cursor = conn.cursor()
cursor.execute("SELECT * FROM contactos")
datos = cursor.fetchall()
conn.commit()
conn.close()
return datos
except sqlite3.OperationalError:
return None
def buscar(texto):
palabra = texto.lower()
todos = traer()
coincidencias = []
if todos:
for n in todos:
nombre = n[1].lower()
if nombre.find(palabra)>=0:
coincidencias.append(n)
if len(coincidencias) > 0:
return coincidencias
else:
print("Sin coincidencias")
return None
else:
return None
###################################################################
#
if os.name == "nt":
borrar = "cls"
else:
borrar = "clear"
os.system(borrar)
while True:
print("""
Menú
1 - Ingresar nuevo contacto
2 - Mostrar todos los contactos
3 - Encontrar contacto por aproximación en el nombre
4 - Salir
""")
opcion = input(">>> ")
if opcion == "1":
nombre = ingreso_validar("Ingrese nombre del contacto: ")
telefono = ingreso_validar("Ingrese teléfono: ")
email = ingreso_validar("Ingrese email: ")
direccion = ingreso_validar("Ingrese dirección: ")
guardar(nombre,telefono,email,direccion)
elif opcion == "2":
r = traer()
if r:
titulo = ["ID","NOMBRE","TELEFONO","EMAIL","DIRECCION"]
print("\n")
print(tabulate(r,headers=titulo,tablefmt="pretty"))
print("\n")
else:
print("No hay datos")
elif opcion == "3":
print("Las opciones de busqueda son por el nombre.")
nombre = ingreso_validar("Ingrese nombre o texto
coincidente: ")
if len(nombre) < 2:
print("Sea más preciso. Ingrese más letras para
buscar")
else:
r = buscar(nombre)
if r:
titulo =
["ID","NOMBRE","TELEFONO","EMAIL","DIRECCION"]
print("\n")
print(tabulate(r,headers=titulo,tablefmt="pretty"))
print("\n")
else:
print("No hay datos")
elif opcion == "4":
print("Gracias por usar nuestro programa")
break
else:
print("Error de opción")
import sqlite3
def traer():
try:
conn = sqlite3.connect("datos.sqlite")
cursor = conn.cursor()
cursor.execute("SELECT * FROM contactos")
datos = cursor.fetchall()
conn.commit()
conn.close()
return datos
except sqlite3.OperationalError:
return None
datos = traer()
if datos:
f = open("contactos.csv","w")
f.write(titulo)
for fila in datos:
f.write(f"{fila[0]},{fila[1]},{fila[2]},{fila[3]},{fila[4]}\n")
f.close()
else:
print("No hay datos")
P1thon Programming
Módulo 05
Python Programming
En este módulo verás:
● Qué es un servicio web.
● El protocolo HTTP.
● La arquitectura REST.
● La librería Requests.
● Interacción con un servicio web desde Python.
● Automatizar el envío de un formulario web.
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 05
Python Programming
¿Qué es un
servicio web?
Python Programming
¿Qué es un servicio web?
Un servicio web es un programa que provee Los ejemplos más comunes de un simple
una funcionalidad determinada y con el cual servicio web incluyen informes meteorológicos,
nos comunicamos a través del protocolo cotizaciones de acciones y divisas, informes
HTTP (el mismo utilizado por los navegadores empresariales y gubernamentales, comunica-
para interactuar con un sitio web). Esta ción con redes sociales, etc. Cada servicio está
funcionalidad puede ser desde un simple identificado por una dirección de URL,
servicio que recibe dos números y retorna su podemos conectarnos a ella desde Python y
producto hasta un complejo modelo de podemos interactuar con la plataforma
inteligencia artificial que recibe una imagen programáticamente como si lo estuviésemos
de un jardín y nos retorna los nombres de haciendo manualmente desde alguna de las
todas las especies de plantas que se aplicaciones móviles o web. Otras plataformas
muestran en ella. como Facebook, twitter, Instagram, WhatsApp
y MercadoLibre proveen servicios similares.
Python Programming
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 05
Python Programming
El protocolo HTTP
Python Programming
El protocolo HTTP
En programación, siempre que se realiza una Luego de haberse establecido una conexión
conexión entre dos computadoras, al entre dos programas que se comunicarán vía
iniciador de dicha conexión se lo conoce HTTP, el cliente debe hacer una petición
como cliente; y a quien recibe y acepta la exigiéndole alguna operación al servidor, y
conexión, servidor. Así, cuando visitamos un éste le devolverá una respuesta.
sitio web cualquiera, el navegador web es el
cliente y el sitio web es el servidor; o cuando Por ejemplo, cuando ingresamos a
nos conectamos a un servicio web desde un https://www.educacionit.com/, el navegador
programa de Python, éste es el cliente y aquél (cliente) realiza una petición al sitio web
el servidor. (servidor) indicándole que quiere ver la página
principal, y éste le responde enviándole
El protocolo HTTP, por su parte, está contenido correspondiente, que en este caso,
montado sobre dos conceptos principales: por tratarse de un sitio web, será un código
petición (request) y respuesta (response). HTML.
Python Programming
Cuando interactuamos con un servicio web,
los datos que éste envía como respuesta
están codificados, por lo general, en formato
JSON en lugar de HTML.
Pero en nuestro caso Python se encargará de
realizar las conversiones automáticamente:
de estructuras de Python a JSON cuando
enviemos información desde nuestro progra-
ma al servicio web, y de JSON a estructuras de
Python cuando recibamos una respuesta.
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 05
Python Programming
Arquitectura REST
Python Programming
Arquitectura REST
Dijimos que la comunicación entre un servicio La arquitectura REST se basa en que el cliente
web y un consumidor de ese servicio (en envía peticiones para recuperar o modificar
nuestro caso, una aplicación de Python) se recursos, y el servidor responde con el
realiza vía el protocolo HTTP. Pero para que resultado, que puede ser con los datos que
las cosas sean más simples, muchos servicios hemos pedido o el estado de la petición.
web tienen una estructura similar llamada
REST.
REST, REpresentational State Transfer, se trata
de una arquitectura estándar para comunica-
ciones web entre sistemas, logrando que se
entiendan mucho mejor entre ellos. A los
servicios que cumplen con este diseño se les
llama RESTful API.
Python Programming
Una petición está formada por: Utilizando este servicio podemos obtener la
lista de alumnos, la información de alguno en
● Un verbo HTTP que define la operación particular e incluso agregar nuevos y
a realizar. modificar o eliminar alumnos existentes. Pero
● Una cabecera o header que incluye también podremos realizar operaciones
información sobre la petición. similares con instructores y personal
administrativo del instituto. Así, para poder
● Una ruta o path hacia un recurso. distinguir qué tipo de información queremos
obtener, crear, modificar o eliminar, el
● El cuerpo del mensaje o body con los
servicio proveerá direcciones de URL más
datos de la petición.
específicas, tales como:
Veamos un ejemplo. Consideremos un ● http://api.educacionit.com/alumnos
servicio web ficcional a partir del cual se ● http://api.educacionit.com/instructores
gestionan los alumnos del instituto, cuya ● http://api.educacionit.com/administrativo
dirección es http://api.educacionit.com/. s
Python Programming
Cada una de estas “secciones” de un servicio Ahora bien, el protocolo HTTP define un
web, en la terminología de la arquitectura conjunto de verbos (con el nombre de
REST, se denomina recurso. Así, quitando la métodos) para identificar qué tipo de
primera parte del dominio para simplificar, operación se quiere ejecutar sobre un
tenemos tres recursos: /alumnos, recurso determinado, a saber:
/instructores y /administrativos . No
obstante, por lo general, los recursos tienen ● GET, para leer información;
nombre en singular (más adelante se verá ● POST, para agregar nueva;
más claramente por qué), de modo que
serían, más bien, los siguientes: ● PUT, para modificar información
preexistente;
● http://api.educacionit.com/alumno
● http://api.educacionit.com/instructor ● DELETE, para eliminar.
● http://api.educacionit.com/administrativo
Python Programming
De modo que toda operación que ejecutemos Cuando queremos modificar los datos de un
sobre un servicio web estará constituida, por alumno o eliminarlo, debemos indicar,
el momento, por un método (GET, POST, además, cuál es ese alumno. Por lo general,
PUT o DELETE) y la dirección de URL de un en un recurso, cada registro está identificado
recurso. Por ejemplo, si queremos obtener la por un número. Así, si queremos eliminar el
lista de alumnos del servicio web en cuestión, alumno cuyo identificador es el número 3,
la operación se enuncia de la siguiente forma: haremos:
GET /alumno DELETE /alumno/3
Python Programming
También es posible indicar un identificar usando el
método GET, en cuyo caso se retorna la información del
alumno especificado en lugar de la lista completa.
GET /alumno/3
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 05
Python Programming
Módulo requests
Python Programming
Módulo requests
Python provee en su librería estándar el módulo urllib para
interactuar con direcciones de URL y el protocolo HTTP, esto
es, lo necesario para comunicarse con un servicio web.
No obstante, la librería que ha adoptado la comunidad para
este tipo de tareas es requests, porque es más potente y fácil
de usar. Entonces, en primer lugar, vamos a instalarla
ejecutando en la consola del sistema operativo:
pip install requests
Python Programming
El primer request
Hacer una solicitud con Requests es muy El valor de retorno de la función get() es la
simple. Podemos probarlo desde la consola respuesta del servidor que opcionalmente
interactiva o desde un script, lo primero es tendrá algún contenido (un código HTML en
importar el módulo, observemos el siguiente este caso por tratarse de un sitio web), pero
código: obligatoriamente habrá un código de estado
(status code) que indicará si la operación se
>>> import requests
>>> r = requests.get("https://google.com/") ejecutó correctamente o no.
>>> print(r.status_code)
Python Programming
Si estamos conectados a internet, el código Por lo general vamos a trabajar con servicios
anterior debe imprimir lo siguiente. web, y lo típico es conseguir como devolución
(response, en nuestro caso es “r”) un JSON,
200
como bien sabemos es el formato más
Es decir, el código de estado utilizado para estas tareas.
(r.status_code ) de la respuesta del El método .json() permite convertir la
servidor es 200. El valor 200 (y también los devolución a un formato conocido por
valores 201, 202 y 204) indica que la nosotros en Python (diccionarios y listas),
operación se ejecutó correctamente. para que nos resulte fácil acceder a los datos.
Veamos otro ejemplo, con un servicio web,
>>> import requests
>>> r =
requests.get("https://api.github.com/events"
)
>>> r.json()
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 05
Python Programming
Preparando
el entorno
Python Programming
Preparación del entorno de trabajo
Ahora, en esta misma clase, estaremos servicio está activo (solo en Linux o en iOS
trabajando con un servicio de prueba que ejecutarlo desde la consola con python3).
encontrarás para descargar a continuación
de este recurso. Antes de ejecutarlo deberás El servicio debe estar abierto en todo
instalar el paquete Flask con pip desde la momento hasta el final de la clase. Los datos
consola del sistema operativo: son guardados en memoria, todas las
operaciones que ejecutemos se perderán una
pip install flask vez cerrado el programa.
Python Programming
Módulo Flask
Para esta práctica se necesita este módulo, Es muy simple, en comparación con otras
porque lo vamos a usar indirectamente. El tecnologías. Para situaciones muy puntuales
servicio web de prueba está realizado con como hacer un servicio, o una pequeña web,
Flask. Flask es un framework escrito en Python Flask puede ser una buena opción. Pero
para el desarrollo de aplicaciones web. No cuando el proyecto es más grande, conviene
tiene una capa de abstracción de base de siempre utilizar Django es uno de los
datos, tampoco validación de formularios ni frameworks más utilizados(escrito en Python)
ningún otro componente donde las bibliotecas para el desarrollo web hoy en día.
de terceros preexistentes proporcionan
funciones comunes. Sin embargo, Flask
admite extensiones que pueden agregar esas Para más información de Flask, te recomendamos la
funciones a la aplicación, como si estuvieran documentación oficial:
implementadas en el propio Flask. https://flask.palletsprojects.com/
Python Programming
¡Sigamos trabajando!
Python Programming
from flask import Flask,request,jsonify
alumnos = []
campos = ("name", "courses")
app = Flask(__name__)
app.config['JSON_SORT_KEYS'] = False
@app.route("/")
def test():
return jsonify({"mensaje":"Error, servicio en
localhost:7001/student"}),404
@app.route("/student", methods=['GET'])
def mostrar_alumnos():
return jsonify({"students":alumnos}),200
@app.route('/student/<int:dato_id>', methods=['GET'])
def get_uno(dato_id):
try:
return jsonify(alumnos[dato_id]),200
except IndexError:
return jsonify({"Mensaje":"Error, no se encuentra ese dato"}),404
@app.route('/student', methods=['POST'])
def post_alumno():
# POST desde el cliente , tomo con request
try:
body = request.get_json() # obtener el contenido de lo que envio
el cliente
except Exception:
return jsonify({"Mensaje":"Bad Request"}),400
for key in body:
if key not in campos:
return jsonify({"Mensaje":"Bad Request"}),400
nuevo =
{"id":len(alumnos),"nombre":body["name"],"cursos":body["courses"]}
alumnos.append(nuevo)
return jsonify({"id":nuevo["id"]}),201
@app.route('/student/<int:dato_id>', methods=['PUT'])
def put_alumno(dato_id):
# PUT desde el cliente, tomo con request
try:
body = request.get_json() # obtener el contenido de lo que envio
el cliente para modificar
except Exception:
return jsonify({"Mensaje":"Bad Request"}),400
try:
if "name" in body and "courses" in body:
alumnos[dato_id]["nombre"] = body["name"]
alumnos[dato_id]["cursos"] = body["courses"]
return jsonify({"Mensaje":"Modificado"}),204
elif "name" in body:
alumnos[dato_id]["nombre"] = body["name"]
return jsonify({"Mensaje":"Modificado"}),204
elif "courses" in body:
alumnos[dato_id]["cursos"] = body["courses"]
return jsonify({"Mensaje":"Modificado"}),204
else:
return jsonify({"Mensaje":"No existe el campo"}),204
except IndexError:
return jsonify({"Mensaje":"No existe ese id"}),404
@app.route("/student/<int:dato_id>", methods=["DELETE"])
def delete_alumno(dato_id):
try:
#borro alumno id
del alumnos[dato_id]
#actualizar los id´s
for n in range(0,len(alumnos)):
alumnos[n]["id"]= n
return jsonify({"Mensaje": "Borrado"}), 204
except IndexError:
return jsonify({"Mensaje": "Error, no se encontro"}), 202
app.run("localhost",port="7001")
P1thon Programming
Módulo 05
Python Programming
Interacción con el
servicio de prueba
Python Programming
Interacción con el servicio de prueba
Nuestro servicio de prueba corre en la El servicio que tenemos de prueba expone el
dirección http://localhost:7001 y expone el siguiente recurso con la arquitectura REST:
recurso (según lo que acabamos de decir
sobre la arquitectura REST) http://localhost:7001/student
http://localhost:7001/student. Por lo general, los recursos de los servicios
Sabido esto, creamos un nuevo archivo de web están escritos en inglés, así que
Python para interactuar con el servicio vía la podemos ir acostumbrándonos desde el
librería requests. comienzo. Este recurso permite obtener,
agregar, modificar y eliminar alumnos
Ahora bien, vayamos a lo que nos interesa (students). Cada alumno del recurso tiene un
que es interactuar con un servicio web. nombre (name) y una cantidad de cursos
realizados (courses).
Python Programming
Intentemos hacer una petición GET a este recurso a
ver cuál es el resultado.
import requests
r = requests.get("http://localhost:7001/student")
print("Código de estado:", r.status_code)
print("Contenido de la respuesta:", r.json())
Python Programming
El texto impreso en pantalla es el siguiente:
Código de estado: 200
Contenido de la respuesta: {'students': []}
Python Programming
Para trabajar mejor con ella, asignémosla a una
variable:
r = requests.get("http://localhost:7001/student")
print("Código de estado:", r.status_code)
respuesta = r.json()
print("Contenido de la respuesta:", respuesta)
Python Programming
Previamente vimos que el método HTTP para agregar
información a un recurso es POST.
En el caso de nuestro servicio de prueba, lo estaremos
usando para insertar nuevos alumnos. Ya dijimos que
cada alumno tiene un nombre y una cantidad de cursos.
Entonces el código para insertar un nuevo alumno se
vería más o menos así:
r = requests.post("http://localhost:7001/student",
json={"name": "Lautaro", "courses": 3})
print("Código de estado:", r.status_code)
print("Contenido de la respuesta:", r.json())
Esto imprime:
Código de estado: 201
Contenido de la respuesta: {'id': 0}
Python Programming
¡Perfecto! Dijimos que los códigos de estado 200, 201, 202 y
204 indican que la operación se ejecutó correctamente. En
los servicios con arquitectura REST, el código 201 indica que
se insertó satisfactoriamente un nuevo registro a un recurso.
También tenemos una respuesta, el diccionario {"id": 0} que
nos indica que el servicio le asignó el número 0 al alumno
que acabamos de crear. Este identificador nos será útil luego
para hacer modificaciones sobre ese alumno e incluso
eliminarlo.
Python Programming
Agreguemos algunos alumnos más para tener más de un
registro con el cual seguir trabajando:
alumnos = (
("Juan", 1),
("Sofia", 5),
("Martin", 2)
)
Python Programming
Si todo salió bien, al ejecutarse esto debe imprimir:
Código de estado: 201
Contenido de la respuesta: {'id': 1}
Código de estado: 201
Contenido de la respuesta: {'id': 2}
Código de estado: 201
Contenido de la respuesta: {'id': 3}
Python Programming
Ahora que tenemos algunos alumnos, si volvemos a ejecutar
nuestro primer código…
r = requests.get("http://localhost:7001/student")
print("Código de estado:", r.status_code)
respuesta = r.json()
print("Contenido de la respuesta:", respuesta)
...obtendremos lo siguiente:
Código de estado: 200
Contenido de la respuesta: {'students': [{'id': 0,
'nombre': 'Lautaro', 'cursos': 3}, {'id': 1, 'nombre':
'Juan', 'cursos': 1}, {'id': 2, 'nombre': 'Sofia',
'cursos': 5}, {'id': 3, 'nombre': 'Martin', 'cursos': 2}]}
Python Programming
Ahora el contenido de respuesta["students"] ya no es
una lista vacía. Cada uno de sus elementos representa a un
alumno como un diccionario. Cada alumno tiene tres claves:
un identificador numérico ("id"), un nombre ("name") y una
cantidad de cursos ("courses"). Podemos recorrer cada uno
de los alumnos usando un bucle “for” así:
r = requests.get("http://localhost:7001/student")
if r.status_code == 200:
respuesta = r.json()
for alumno in respuesta["students"]:
print("Alumno", alumno["id"])
print("Nombre:", alumno["name"])
print("Cursos:", alumno["courses"])
else:
print("Ocurrió un error.")
Python Programming
Si ingresamos a http://localhost:7001/student
desde el navegador también será capaz de
mostrarnos la lista de alumnos, puesto que
cada vez que visitamos una dirección de URL
desde un navegador web se realiza una
petición del tipo GET.
Python Programming
Ahora bien, usando GET también podemos obtener la
información de algún alumno en particular indicando su
identificador numérico. Por ejemplo, GET /student/3
debe retornar únicamente la información de Sofía.
Comprobémoslo:
r = requests.get("http://localhost:7001/student/3")
print("Código de estado:", r.status_code)
print("Contenido de la respuesta:", r.json())
Python Programming
Nótese que en este caso la información del alumno está
dentro de la clave "student", por lo que habremos de
acceder a ella más o menos así:
r = requests.get("http://localhost:7001/student/3")
if r.status_code == 200:
alumno = r.json()["student"]
print("Nombre:", alumno["name"])
print("Cursos:", alumno["courses"])
else:
print("Ocurrió un error.")
Python Programming
¿Cómo proceder si queremos modificar algún dato (nombre o
cantidad de cursos) del alumno 3 (Sofía)? Según lo que vimos
más arriba, debemos usar el método PUT. Esto en Python se
traduce como la función requests.put() , y vamos a pasar
como argumento un diccionario con las claves que queremos
modificar y sus respectivos valores, que luego serán convertidas
a formato JSON automáticamente por la librería. El siguiente
código cambia la cantidad de cursos de Sofía a 6:
datos = {"courses": 6}
r = requests.put("http://localhost:7001/student/3",
json=datos)
print("Código de estado:", r.status_code)
Python Programming
El código de estado 204 indica que la petición se ejecutó
correctamente, pero a diferencia de los estados anteriores, este
no retorna ningún contenido. Por eso no llamamos a r.json().
Si la petición fallara por alguna razón, su código de estado sería
otro que 204. Por ejemplo:
datos = {"courses": 6}
r = requests.put("http://localhost:7001/student/10",
json=datos)
print("Código de estado:", r.status_code)
Python Programming
Al invocar la función put(), es posible modificar varias claves
simultáneamente:
# Modifica el nombre y la cantidad de cursos del alumno 3.
datos = {"name": "Josefina", "courses": 6}
r = requests.put("http://localhost:7001/student/3",
json=datos)
print("Código de estado:", r.status_code)
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 05 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Administrar alumnos
Para este ejercicio estaremos usando el mismo
servicio web que en el material de la clase, es decir,
el servicio web servicio_web.py, que tenés que
tener en ejecución.
Desarrollar un programa admin_alumnos.py que
permita añadir, modificar, eliminar y listar los
alumnos del servicio web.
A continuación, encontrará ejemplos de uso (en rojo
lo que ingresa el usuario).
Python Programming
Menú Menú
1. Agregar un alumno. 1. Agregar un alumno.
2. Modificar alumno existente. 2. Modificar alumno existente.
3. Listar alumnos. 3. Listar alumnos.
4. Eliminar un alumno. 4. Eliminar un alumno.
Seleccione una opción: 1 Seleccione una opción: 1
Nombre: Matias Nombre: Gonzalo
Cursos: 3 Cursos: 1
Alumno ingresado correctamente. Alumno ingresado correctamente.
Menú Menú
1. Agregar un alumno. 1. Agregar un alumno.
2. Modificar alumno existente. 2. Modificar alumno existente.
3. Listar alumnos. 3. Listar alumnos.
4. Eliminar un alumno. 4. Eliminar un alumno.
Seleccione una opción: 3 Seleccione una opción: 3
Id: 0 - Matias - 3 cursos Id: 0 - Matias - 3 cursos
Id: 1 - Gonzalo - 1 cursos
Python Programming
Menú Menú
1. Agregar un alumno. 1. Agregar un alumno.
2. Modificar alumno existente. 2. Modificar alumno existente.
3. Listar alumnos. 3. Listar alumnos.
4. Eliminar un alumno. 4. Eliminar un alumno.
Seleccione una opción: 2 Seleccione una opción: 4
Ingrese el ID del alumno: 1 Ingrese el ID del alumno: 1
Nuevo nombre (o deje vacío para mantener Alumno eliminado correctamente.
el anterior): Sofia
Nueva cantidad de cursos (o deje vacío): Menú
Alumno modificado correctamente. 1. Agregar un alumno.
2. Modificar alumno existente.
Menú 3. Listar alumnos.
1. Agregar un alumno. 4. Eliminar un alumno.
2. Modificar alumno existente. Seleccione una opción: 3
3. Listar alumnos. Id: 0 - Matias - 3 cursos
4. Eliminar un alumno.
Seleccione una opción: 3
Id: 0 - Matías - 3 cursos
Id: 1 - Sofia - 1 cursos
Python Programming
Menú Recomendamos el uso de herramientas
1. Agregar un alumno.
2. Modificar alumno existente.
empleadas en otras ocasiones:
3. Listar alumnos.
4. Eliminar un alumno.
● os.sytem("cls") para borrar
Seleccione una opción: 4 pantalla, en caso de Linux “clear”
Ingrese el ID del alumno: 1
No se pudo eliminar el alumno. ● Si usas el bucle while para el menú,
recordar que se puede usar break
para terminar el bucle.
Python Programming
¡Sigamos trabajando!
Python Programming
import requests
import os
if os.name == "nt":
borrar = "cls"
else:
borrar = "clear"
os.system(borrar)
url = "http://localhost:7001/student"
while True:
print("1. Agregar un alumno.")
print("2. Modificar alumno existente.")
print("3. Listar alumnos.")
print("4. Eliminar un alumno.")
print("5. Salir.")
opcion = input(">>> ")
if opcion == "1":
nombre = input("Nombre: ")
cursos = solicitar_entero("Cursos: ")
r = requests.post(url, json={"name": nombre, "courses": cursos})
if r.status_code == 201:
print("Alumno ingresado correctamente.")
else:
print("No se ha podido ingresar el alumno.")
elif opcion == "2":
id_alumno = solicitar_entero("Ingrese el ID del alumno: ")
datos = {}
nombre = input("Nuevo nombre (o deje vacío para mantener el
anterior): ")
if nombre:
datos["name"] = nombre
cursos = solicitar_entero("Nueva cantidad de cursos (o deje
vacío): ", vacio=True)
if cursos:
datos["courses"] = cursos
r = requests.put(url + f"/{id_alumno}", json=datos)
if r.status_code == 204:
print("Alumno modificado correctamente.")
else:
print("No se ha podido modificar el alumno.")
elif opcion == "3":
r = requests.get(url)
if r.status_code == 200:
alumnos = r.json()["students"]
for alumno in alumnos:
print(f'Id:{alumno["id"]} - {alumno["nombre"]} -
{alumno["cursos"]} cursos.')
else:
print("No se pudo obtener la lista de alumnos.")
elif opcion == "4":
id_alumno = solicitar_entero("Ingrese el ID del alumno: ")
r = requests.delete(url + f"/{id_alumno}")
if r.status_code == 204:
print("Alumno eliminado correctamente.")
else:
print("No se pudo eliminar el alumno.")
elif opcion == "5":
print("¡Gracias por usar nuestro programa!")
break
else:
print("Error de opcion, vuelva a intentarlo")
input("Toque ENTER para continuar...")
os.system(borrar)
P1thon Programming
Módulo 05
Python Programming
Automatizar envío
de formularios
Python Programming
Automatizar envío de formulario HTML
vía HTTP
Los formularios son la principal forma de Lo primero que necesitamos es un sitio con
comunicación entre un usuario y un sitio web un formulario. Para eso nuevamente vamos a
para enviar información. Por ejemplo, usar una aplicación creada para este ejemplo.
formularios de contacto o para iniciar sesión. La encuentras para descargar en el Alumni en
Enviar información a través de un formulario esta misma sección con el nombre
usando Python es una operación muy común formulario_web.
con el objetivo de automatizar tareas. La
misma librería con la que hemos estado
trabajando hasta ahora, requests, nos
permite efectuar dicha operación. De hecho,
el método HTTP que usan los formularios
HTML para enviar información es POST.
Python Programming
Descargas formulario_web.py y guardas
en una carpeta. Luego le haces doble click
encima de formulario_web.py, se abrirá
una terminal (servidor) muy parecido a lo que
hicimos en la sección anterior con el servicio
de alumnos.
(Solo en Linux o en iOS ejecutarlo desde la
consola con python3).
Este pequeño sitio de ejemplo expone el
siguiente formulario de contacto en
http://localhost:8880/form.
Python Programming
Para automatizar el envío, lo primero que Para ello necesitamos ver el código de
tenemos que identificar es la dirección de URL. fuente del formulario. Todos los
Luego, acabamos de decir que la información navegadores contienen una opción para
de un formulario HTML en un sitio web se envía ello en el menú contextual:
a través del protocolo HTTP usando el método
POST; entonces, nuestro código de Python
comenzará siendo el siguiente:
import requests
r =
requests.post("http://localhost:8880/form")
Python Programming
Para ello necesitamos ver el código
de fuente del formulario. Todos los
navegadores contienen una opción
para ello en el menú contextual:
Python Programming
Se abrirá una nueva ventana y veremos el
siguiente código:
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"></head>
<body>
<form method="post">
Nombre:<br>
<input type="text" name="name">
<br>
Email:<br>
<input type="text" name="email">
<br>
Mensaje:<br>
<textarea name="message"></textarea>
<br><br>
<input type="submit" value="Enviar">
</form>
</body>
</html>
Python Programming
El fragmento de código que configura el <!DOCTYPE html>
<html>
formulario HTML está entre las etiquetas
<head><meta charset="utf-8"></head>
<form> y </form>. Lo que nos interesa <body>
dentro de él son los nombres que el sitio le <form method="post">
ha asignado a los componentes del Nombre:<br>
formulario (esto es, las cajas de texto para <input type="text" name="name" >
<br>
ingresar datos) vía el atributo name. Los Email:<br>
marcamos en rojo a continuación: <input type="text" name="email" >
<br>
Mensaje:<br>
<textarea name="message" ></textarea>
<br><br>
<input type="submit" value="Enviar">
</form>
</body>
</html>
Python Programming
Vemos que los nombres para los campos de nombre, correo
electrónico y mensaje son, respectivamente, name, email y
message. Pues bien, estos corresponderán, entonces, a las
clave de nuestro diccionario de datos:
datos = {
"name": "Mariano",
"email": "mariano@ejemplo.com",
"message": "¡Hola, mundo!"
}
r = requests.post("http://localhost:8880/form", data=datos)
Python Programming
¡Perfecto! Ahora, ¿cómo sabemos que el formulario se ha
enviado correctamente? Primero intentemos enviarlo
manualmente usando el navegador. Luego de completar los
datos veremos que la página responde con lo siguiente:
Python Programming
Podemos acceder a la respuesta del sitio desde Python vía r.text:
datos = {
"name": "Mariano",
"email": "mariano@ejemplo.com",
"message": "¡Hola, mundo!"
}
r = requests.post("http://localhost:8880/form", data=datos)
contenido = r.text
print(contenido)
Python Programming
Esto imprime:
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Enviado</title>
<meta http-equiv="refresh" content="3";URL="http://localhost:8880/form">
</head>
<body>
Mensaje enviado
</body>
</html>
Python Programming
Eso quiere decir que podemos hacer una comprobación
desde nuestro código para determinar si el formulario se
envió correctamente, igualando contenido a la cadena
anterior. Pero dado que el resultado en HTML suele ser muy
voluminoso, simplemente podemos buscar alguna parte de
la cadena, por ejemplo, “Mensaje enviado”. Para ello usamos
el operador in, como vimos en las colecciones:
datos = {
"name": "Mariano",
"email": "mariano@ejemplo.com",
"message": "¡Hola, mundo!"
}
r = requests.post("http://localhost:8880/form",
data=datos)
contenido = r.text
Python Programming
O bien usando la función find() según lo visto en la sección
de operaciones sobre cadenas:
if contenido.find("Mensaje enviado") > -1:
print("¡Formulario enviado!")
else:
print("Ocurrió un error.")
Python Programming
¡Sigamos trabajando!
Python Programming
from flask import Flask,request
formulario_html = """
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"></head>
<body>
<form method="POST">
Nombre:<br>
<input type="text" name="name">
<br>
Email:<br>
<input type="text" name="email">
<br>
Mensaje:<br>
<textarea name="message"></textarea>
<br><br>
<input type="submit" value="Enviar">
</form>
</body>
</html>
"""
enviado_html = """
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Enviado</title>
<meta http-equiv="refresh"
content="3";URL="http://localhost:8880/form">
</head>
<body>
Mensaje enviado
</body>
</html>
"""
vacios_error_html = """
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Vacios</title>
<meta http-equiv="refresh"
content="3";URL="http://localhost:8880/form">
</head>
<body>
Campos Vacios, o hay un error
</body>
</html>
"""
app = Flask(__name__)
@app.route("/")
def home():
return 'Formulario en <a
href="http://localhost:8880/form">localhost:8880/form</a>'
@app.route("/form", methods=["GET","POST"])
def tomar_formulario():
if request.method == "GET":
return formulario_html.encode("utf-8")
elif request.method == "POST":
try:
body = dict(request.form)
if body["name"] and body["email"] and body["message"]:
print("-"*20,"\n"*2)
print("Nombre:",body["name"],"\nEmail:",body["email"],"\n
Mensaje:",body["message"])
print("\n"*2,"-"*20)
return enviado_html.encode("utf-8")
else:
return vacios_error_html.encode("utf-8")
except Exception:
return vacios_error_html.encode("utf-8")
else:
return vacios_error_html.encode("utf-8")
app.run("localhost",port=8880)
P1thon Programming
Módulo 05 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Automatizar envío de formularios
Con formulario_web.py , crear un Ejemplo de uso:
programa enviar_formulario.py que
Menú
envíe el formulario automáticamente con 1-Ingresar Datos
datos ingresados por el usuario a través 2-Salir del programa
de la consola vía input(). Luego se debe >>> 1
Ingrese nombre: Matías
comprobar que el formulario se haya Ingrese email: matias@mail.com
enviado correctamente. Ingrese mensaje: ¡Hola Mundo!
¡Datos enviados correctamente!
Recuerde todos los consejos empleados
en otros scripts para poder hacer una Menú
buena implementación del ejercicio. 1-Cargar Formulario
2-Salir
>>> 2
¡Gracias por usar el programa!
Python Programming
¡Sigamos trabajando!
Python Programming
import requests
import os
if os.name == "nt":
borrar = "cls"
else:
borrar = "clear"
os.system(borrar)
while True:
print("""
1 - Ingresar datos
2 - Salir del programa
""")
opcion = input(">>> ")
if opcion == "1":
datos = {
"name": input("Ingrese nombre: "),
"email": input("Ingrese email: "),
"message": input("Ingrese mensaje: ")
}
r = requests.post("http://localhost:8880/form", data=datos)
if r.status_code == 200:
contenido = r.content.decode("utf-8")
if "enviado" in contenido:
print("¡Datos enviados correctamente!")
else:
print("Debes ingresar todos los campos.")
else:
print("Ocurrió un error.")
elif opcion == "2":
print("Gracias por usar nuestro programa")
break
else:
print("Error de opción")
input("Toque ENTER para continuar...")
os.system(borrar)
P1thon Programming
Módulo 05 - Desafío
Python Programming
¿Qué son los desafíos?
● Son ejercicios complementarios a los realizados en clase.
● Permiten practicar y consolidar los conocimientos adquiridos.
● Es recomendable que los realices antes de rendir el
examen de la clase.
Python Programming
Ejercicio 1: Dólar
Necesitamos conseguir la cotización del dólar
en Argentina. Entonces, nos ponemos en la
búsqueda de algún servicio web online que
nos permita obtener esa información para
hacer uso en nuestro programa.
Tratar de consultar algún api online del dólar,
por ejemplo, esta: “api dólar argentina”
Hay que consultar el precio del dólar oficial
(compra y venta) con el módulo “requests” y
mostrar valores por pantalla.
Python Programming
Ejercicio 2: Clima.p1
Existen en la web un montón de servicios Variables climáticas: debería mostrar la
web en los cuales se puede consultar el temperatura, humedad y presión.
clima. Registrarse en alguno de ellos, o usar
el siguiente que es gratuito y sin registro: “api Visibilidad: debe informar los Kilómetros
clima” (Buscar en la documentación de este de visibilidad máxima.
servicio JSON output). Velocidad y dirección del viento:
Crear un script con menú: informar justamente de donde y velocidad
en kilómetros / hora del viento.
Menú
1. Variables climáticas Salir: termina el programa.
2. Visibilidad
3. Velocidad y dirección del viento
4. Salir
Python Programming
Ejercicio 3: Guardar clima
Al ejercicio anterior, agregarle una opción Cuando se seleccione esa opción, tenemos
más en el menú: que guardar en una base de datos
“clima.sqlite” en una tabla llamada “datos”
Menú
1. Variables climáticas los valores: id incremental, “fecha y hora”,
2. Visibilidad temperatura, humedad, presión,
3. Velocidad y dirección del viento visibilidad, velocidad del viento y dirección.
4. Guardar clima
5. Salir
Python Programming
En la sección de Descargas encontrarás los recursos
necesarios para realizar los ejercicios y su resolución
para que verifiques cómo te fue.
Python Programming
¡Terminaste el módulo!
Estás listo para rendir el examen
Python Programming
import requests
import sys
try:
r = requests.get("https://api-dolar-
argentina.herokuapp.com/api/dolaroficial")
except Exception:
print("Hay algún problema. No se puede conectar al servicio")
sys.exit()
if r.status_code == 200:
datos = r.json()
compra = datos["compra"]
venta = datos["venta"]
print("Dolar:")
print("\tCompra: $" + compra)
print("\tVenta: $"+venta)
else:
print("No es posible acceder a la información solicitada")
####################
####################
import requests
import sys
import os
def consultar():
try:
r = requests.get("https://wttr.in/buenos%20aires?format=j1")
except Exception:
print("Hay algún problema. No se puede conectar al servicio")
print("Se finaliza el programa. Intente más tarde.")
sys.exit()
return r.json()
def informar():
datos = consultar()
#print(datos)
t = datos["current_condition"][0]["temp_C"]
h = datos["current_condition"][0]["humidity"]
p = datos["current_condition"][0]["pressure"]
v = datos["current_condition"][0]["visibility"]
vel = datos["current_condition"][0]["windspeedKmph"]
dir = datos["current_condition"][0]["winddir16Point"]
valores =
{"temperatura":t,"humedad":h,"presion":p,"visibilidad":v,"velocidad":vel,
"direccion":dir}
#print(valores)
return valores
######################################################################
if os.name == "nt":
borrar = "cls"
else:
borrar = "clear"
os.system(borrar)
while True:
print("""
Menú
1. Variables climáticas
2. Visibilidad
3. Velocidad y dirección del viento
4. Salir
""")
opcion = input(">>> ")
if opcion == "1":
info = informar()
print("La temperatura es " + info["temperatura"] +"°C")
print("La humedad es " + info["humedad"] +"%")
print("La presión es " + info["presion"] +"Hpa")
elif opcion == "2":
info= informar()
print("La visibilidad actual es "+ info["visibilidad"] +" km")
elif opcion == "3":
info = informar()
print(f"La velocidad del viento es {info['velocidad']} km/h y la
direccion es {info['direccion']}")
elif opcion == "4":
print("¡Gracias por usar nuestro programa!")
break
else:
print("¡Esa opcion no es correcta!")
input("Toque ENTER para continuar...")
os.system(borrar)
############################################################
import requests
import sqlite3
import sys
import os
def consultar():
try:
r = requests.get("https://wttr.in/buenos%20aires?format=j1")
except Exception:
print("Hay algún problema. No se puede conectar al servicio")
print("Se finaliza el programa. Intente más tarde.")
sys.exit()
return r.json()
def informar():
datos = consultar()
#print(datos)
t = datos["current_condition"][0]["temp_C"]
h = datos["current_condition"][0]["humidity"]
p = datos["current_condition"][0]["pressure"]
vis = datos["current_condition"][0]["visibility"]
vel = datos["current_condition"][0]["windspeedKmph"]
dir = datos["current_condition"][0]["winddir16Point"]
fec = datos["current_condition"][0]["localObsDateTime"]
valores =
{"temperatura":t,"humedad":h,"presion":p,"visibilidad":vis,"velocidad":ve
l,"direccion":dir,"fecha":fec}
#print(valores)
return valores
""""""
def guardar():
info = informar()
try:
conn = sqlite3.connect("clima.sqlite")
cursor = conn.cursor()
cursor.execute("INSERT INTO datos VALUES (null,?,?,?,?,?,?,?)",
(
info["fecha"],
info["temperatura"],
info["humedad"],
info["presion"],
info["visibilidad"],
info["velocidad"],
info["direccion"]
)
)
conn.commit()
conn.close
except sqlite3.OperationalError:
conn = sqlite3.connect("clima.sqlite")
cursor = conn.cursor()
# Cuando tomamos los datos de este servicio en particular, todos
son del tipo string
# No implica que siempre sea asi
# Pero si no lo convertimos podemos dejarlo asi usando el tipo de
dato correcto para los campos
# de la base de datos
cursor.execute("""CREATE TABLE datos
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
fecha TEXT,
temperatura TEXT,
humedad TEXT,
presion TEXT,
visibilidad TEXT,
viento_vel TEXT,
viento_dir TEXT
)
""")
cursor.execute("INSERT INTO datos VALUES (null,?,?,?,?,?,?,?)",
(
info["fecha"],
info["temperatura"],
info["humedad"],
info["presion"],
info["visibilidad"],
info["velocidad"],
info["direccion"]
)
)
conn.commit()
conn.close
print("¡Se salvo el nuevo evento del clima!")
######################################################################
if os.name == "nt":
borrar = "cls"
else:
borrar = "clear"
os.system(borrar)
while True:
print("""
Menú
1. Variables climáticas
2. Visibilidad
3. Velocidad y dirección del viento
4. Guardar clima
5. Salir
""")
opcion = input(">>> ")
if opcion == "1":
info = informar()
print("La temperatura es " + info["temperatura"] +"°C")
print("La humedad es " + info["humedad"] +"%")
print("La presión es " + info["presion"] +"Hpa")
elif opcion == "2":
info= informar()
print("La visibilidad actual es "+ info["visibilidad"] +" km")
elif opcion == "3":
info = informar()
print(f"La velocidad del viento es {info['velocidad']} km/h y la
direccion es {info['direccion']}")
elif opcion == "4":
guardar()
elif opcion == "5":
print("¡Gracias por usar nuestro programa!")
break
else:
print("¡Esa opcion no es correcta!")
input("Toque ENTER para continuar...")
os.system(borrar)
P1thon Programming
Módulo 06
Python Programming
En este módulo verás:
● Desarrollo avanzado con Tcl/Tk vía el
módulo “tkinter”.
● Botones, cajas de texto, etiquetas.
● Menús.
● Listas.
● Convertir un script de Python a un
archivo ejecutable.
● Entornos Virtuales.
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 06
Python Programming
Aplicaciones
de escritorio
Python Programming
Aplicaciones de escritorio 1 tkinter
Python es siempre una buena elección para En este ocasión al igual que en el curso
desarrollar aplicaciones de escritorio. Ofrece introductorio estaremos trabajando con
una gran cantidad de librerías para diseñar y Tcl/Tk (tkinter), pero con una profundidad
desplegar interfaces de usuario rápidamente. aun mayor. Esta es una librería mucho más
Entre ellas se encuentran Tcl/Tk, GTK+, Qt y pequeña en comparación con otras, pero lo
wxWidgets. Estas son librerías gráficas de suficiente para tener una aplicación de
código abierto y multiplataforma escritorio funcional en muy pocos minutos y
desarrolladas en C y C++, pero como Python perfectamente preparada para aplicaciones
permite escribir extensiones en dichos comerciales. Además, accedemos a ella a
lenguajes y luego importarlas como módulos través del módulo tkinter, módulo que
convencionales, utilizarlas es realmente muy viene en la librería estándar de Python, por lo
fácil. que no requiere instalaciones adicionales.
Python Programming
Es importante aprender a desarrollar aplicaciones
gráficas “manualmente” (esto es, escribiendo el código
directamente).
Por otro lado, en el caso de librerías más grandes como
GTK+ o Qt, hacer uso de dichas herramientas (como
Glade o QtDesigner) requiere de un conocimiento previo
de su funcionamiento para no terminar convirtiéndose
en un impedimento para el desarrollo de la aplicación.
Python Programming
En la imagen observamos una aplicación
escrita en Python usando Tcl/Tk. Destacamos
distintos controles que incluye (botones, cajas
de texto, etiquetas, menúes, etc.), a los cuales
también se conoce como widgets. ¡Incluso la
misma ventana es un widget!
Python Programming
El módulo tkinter está estructurado siguiendo el
paradigma de orientación a objetos. Recordamos que
el concepto central de este paradigma es el de clase,
distinguimos por la convención de nombramiento que
lleva CamelCase en lugar de lower_case. Por ejemplo:
a = Clase()
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 06
Python Programming
Estructura básica
de una aplicación
Python Programming
Estructura de una aplicación
Lo primordial es importar los módulos Luego creamos la ventana principal y le
tkinter y ttk. Este último introduce asignamos un título de la siguiente forma.
algunos widgets nuevos a la colección de
ventana_principal = tk.Tk()
Tcl/Tk y optimiza otros ya existentes en el ventana_principal.title("Mi primera
primero. aplicación")
ventana_principal.mainloop()
import tkinter as tk
from tkinter import ttk
La función mainloop() ejecuta el bucle
Por convención se acostumbra a importar principal de la aplicación, aquel encargado de
tkinter con el nombre de tk (ese es dibujar todos los controles y manejar los
efectivamente el propósito de la palabra eventos como veremos más adelante. Nótese
reservada as en este contexto). que esta función bloquea la ejecución del código
hasta que la ventana principal se cierre.
Python Programming
Para ser un poco más precisos, vamos a configurar el
tamaño de la ventana, indicando vía la función config()
o configure() que debe tener un ancho de 300px y un
alto de 200px.
ventana_principal.title("Mi primera aplicación")
ventana_principal.config(width=300, height=200)
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 06
Python Programming
Widgets básicos
Python Programming
Widgets básicos
Estos 3 widgets muchos los vieron en el curso introductorio,
no está demás un repaso de estos.
● Botón.
● Caja.
● Etiqueta.
Luego veremos otros widgets más avanzados para crear
mejores aplicaciones.
Python Programming
Botón
Tk provee dos widgets para botones: Podemos usar la función help() en la
ttk.Button y tk.Button. El primero es un consola interactiva para conocer los
widget con apariencia básica, el segundo tiene argumentos de cada control, o mirar la
mejoras en el aspecto. documentación oficial.
Por ejemplo, el siguiente código crea un Cuando se omiten los valores width y
botón con el texto “Hola mundo” y lo ubica en height en una llamada a place(), son
la posición 50, 10. inferidos de acuerdo con la longitud del texto.
boton = ttk.Button(text="Hola mundo") Para asociar la presión del botón con una
boton.place(x=50, y=10)
función de Python, podemos crear una
función como la siguiente:
El parámetro text indica el texto que
mostrará el botón. def boton_presionado():
print("Presionado")
Python Programming
Y en la aplicación usamos el parámetro command.
boton = ttk.Button(text="Hola mundo", command=boton_presionado)
boton.place(x=50, y=10)
Python Programming
Cajas de texto Entr1 1 Text
Tk provee dos widgets para ingresar texto: A continuación vemos una función asociada a
ttk.Entry y tk.Text. El primero es un botón la cual toma lo que hay en la caja:
generalmente útil para textos pequeños en
def imprimir_texto():
una misma línea, soportando únicamente print(entry.get())
texto plano. El segundo, además de permitir
texto de múltiples líneas, también puede En la aplicación:
albergar imágenes y texto con formato.
entry = ttk.Entry()
entry = ttk.Entry() entry.place(x=10, y=10)
boton = ttk.Button(text="Imprimir texto",
Para obtener el texto que el usuario ha command=imprimir_texto)
boton.place(x=10, y=50)
ingresado en el control utilizamos la función
get().
Python Programming
Vía las funciones insert() y delete() podemos añadir y
remover texto del control en una determinada posición:
# Inserta el texto al comienzo del control.
entry.insert(0, "Hola mundo")
Python Programming
Etiqueta Label
Una etiqueta es un control cuya única funcionalidad es
contener un texto o una imagen. Al igual que los botones,
la propiedad que controla el texto es text.
label = ttk.Label(text="Hola mundo")
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 06
Python Programming
Listas común
1 desplegable
Python Programming
Lista común Listbox
La lista permite mostrar un conjunto de textos,
como se muestra en la siguiente imagen.
Python Programming
Para implementar una lista creamos una instancia de la
clase tk.Listbox e insertamos elementos vía insert().
lista = tk.Listbox()
lista.insert(0, "Python", "C", "C++", "Java")
lista.place(x=10, y=10)
Python Programming
La función get() retorna el elemento en una posición
determinada, mientras que curselection() retorna la
posición del elemento seleccionado.
def imprimir_seleccion():
print(lista.get(lista.curselection()))
Python Programming
Lista desplegable Combobox
La lista desplegable es una combinación entre
una lista y una caja de texto (Entry). Permite
seleccionar un elemento entre varios o bien
ingresar manualmente un texto.
Python Programming
Se implementa creando una instancia de ttk.Combobox e
indicando los elementos en una lista a través del parámetro
values.
lista_desplegable = ttk.Combobox(
values=[
"Visual Basic",
"Python",
"C",
"C++",
"Java"
]
)
lista_desplegable.place(x=10, y=10)
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 06
Python Programming
Casilla de
verificación
Python Programming
Casilla de verificación
Checkbox / Checkbutton
La casilla de verificación es un control que permite al
usuario dirimir entre dos opciones opuestas: sí/no,
activado/desactivado, encendido/apagado, etc.
Python Programming
Se implementa a través de la clase ttk.Checkbutton .
checkbutton = ttk.Checkbutton(text="Opción")
checkbutton.place(x=10, y=10)
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 06
Python Programming
Cuadros de diálogo
Python Programming
Cuadros de diálogo
Los cuadros de diálogo presentan un Tk provee el módulo tkinter.messagebox
mensaje al usuario y opcionalmente le con un conjunto de funciones para crear
solicitan tomar una decisión: sí/no, cuadros de diálogo de forma rápida que
aceptar/cancelar, reintentar/abortar, etc. retornan el valor seleccionado por el usuario.
from tkinter import messagebox
Python Programming
Las funciones principales son:
# Siempre retornan la cadena "ok".
messagebox.showinfo(
title="Información", message="Hola mundo")
messagebox.showwarning(
title="Advertencia", message="Hola mundo")
messagebox.showerror(
title="¡Error!", message="Hola mundo")
# Retornan True o False.
messagebox.askokcancel(
title="Pregunta", message="¿Desea salir?")
messagebox.askyesno(
title="Pregunta", message="¿Desea salir?")
Para más información podés ver
messagebox.askretrycancel( la documentación oficial acerca
title="Operación fallida", message="¿Qué desea de los cuadros de diálogos.
hacer?")
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 06
Python Programming
Barra de menú
Python Programming
Barra de menú
Para incluir un menú en nuestra ventana, Por ejemplo, el código en la siguiente
primero tenemos que crear una barra de dispositiva crea una barra de menús con los
menús a través de la clase tk.Menu, la cual menús “Archivo” y “Ayuda”, dentro de los
es enlazada a la ventana principal vía cuales se encuentran las opciones “Nuevo”
config(menu=...) . Luego, individualmente y “Acerca de”, respectivamente, que están
creamos cada uno de los menús asociadas con una función de Python que
propiamente dichos, también vía la clase es invocada cuando son presionados.
tk.Menu, los cuales son enlazados a la barra
con la función add_cascade() . Cada una de
las opciones de un menú es añadida vía
add_command() .
Python Programming
import tkinter as tk
from tkinter import ttk
def nuevo():
print("Nuevo archivo.")
def acerca_de():
print("Acerca de:")
ventana_principal = tk.Tk()
ventana_principal.title("Mi primera aplicación")
barra_de_menu = tk.Menu()
barra_de_menu.add_cascade(label="Archivo", menu=menu_archivo)
barra_de_menu.add_cascade(label="Ayuda", menu=menu_ayuda)
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 06
Python Programming
Organización de
controles
Python Programming
Organización de controles
Hicimos uso de una única forma de Por lo general para aplicaciones medianas y
posicionar los widgets dentro de una grandes querrás optar por la organización
ventana, indicando su posición X e Y vía la en grilla.
función place(). Existen otros dos métodos
para organizar una interfaz en Tcl/Tk:
posicionamiento relativo, vía la función
pack(), y el modelo de grilla, vía grid().
Si bien la elección de un modelo u otro
puede resultar trivial en interfaces pequeñas,
a medida que una aplicación de escritorio
crece se vuelve fundamental que se Para conocer más widgets y más configuraciones
encuentre bien organizada. recordá que podes ver la documentación oficial.
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 6 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Aplicación de escritorio
Utilizando el módulo tkinter, crear el
siguiente programa, que contiene una caja
de texto, un botón, una etiqueta, y una lista.
Python Programming
El usuario debe poder ingresar un nombre en
la caja de texto y, al presionar el botón, debe
mostrarse el mensaje “¡Hola, [nombre]!” en la
etiqueta que se encuentra inmediatamente
debajo de él.
Python Programming
Luego del saludo, el nombre se añade a una lista que
no puede superar los 5 elementos. En caso de que se
intente emitir otro saludo una vez alcanzado este
límite, se debe mostrar un mensaje de error. Si la caja
de texto está vacía al momento de presionar el botón,
se debe desplegar un mensaje informando dicha falla.
No es importante que el tamaño de los controles y las
proporciones sean exactas, únicamente considerar su
disposición en la ventana.
Python Programming
Nota: Puesto que se debe crear una función que estará
asociada al botón para saludar, y desde esta función se
tiene que acceder a una variable que cuente la cantidad de
saludos realizados, y teniendo en cuenta que esta variable
estará definida fuera de la función, para poder hacer uso
de ella desde el interior se debe agregar al inicio la palabra
reservada global. Por ejemplo:
def saludar():
# Esto me permite acceder desde esta función a la variable
# “saludos” definida fuera.
global saludos
# …
saludos = 0
boton_saludar = tk.Button(text="¡Saludar!", command=saludar)
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
import tkinter as tk
from tkinter import messagebox
def saludar():
# Me permite acceder a la variable "saludos" definida
# fuera de la función.
global saludos
# Chequear que los saludos no sean mayores a cinco.
# Una vez alcanzados, se muestra un mensaje de error.
if saludos == 5:
messagebox.showerror(
title="Error",
message="Ya se han emitido demasiados saludos."
)
# Terminar la función.
return
# Obtener el nombre ingresado en la caja de texto.
nombre = texto_nombre.get()
# Chequear que no esté vacío.
if nombre:
# Mostrar el saludo en una etiqueta.
label_saludo.configure(
text=f"¡Hola, {nombre}!")
# Añadir el nombre a la lista.
lista_nombres.insert(tk.END, nombre)
# Borrar el contenido de la caja de texto.
texto_nombre.delete(0, tk.END)
# Aumentar el contador de saludos.
saludos += 1
else:
messagebox.showinfo(
title="Falta información",
message="Debe ingresar un nombre."
)
saludos = 0
ventana = tk.Tk()
ventana.title("Ejercicio integrador")
ventana.config(width=300, height=200)
# Variable que lleva la cuenta de los saludos emitidos.
texto_nombre = tk.Entry()
texto_nombre.place(x=10, y=10, width=200, height=23)
boton_saludar = tk.Button(text="¡Saludar!", command=saludar)
boton_saludar.place(y=9, x=215)
label_saludo = tk.Label()
label_saludo.place(x=10, y=35)
lista_nombres = tk.Listbox()
lista_nombres.place(x=10, y=60, width=278, height=120)
ventana.mainloop()
P1thon Programming
Módulo 06
Python Programming
Aplicaciones
ejecutables
Python Programming
Distribuir aplicaciones como ejecutables
con P1Installer
Habíamos dicho que Python es un lenguaje Para solucionar este problema se hace uso
interpretado, de modo que no se compila a de alguna herramienta que convierte
un código que es ejecutado directamente por nuestro programa de Python en un archivo
el procesador, sino que requiere, justamente, ejecutable (.exe en Windows), de modo que
de un intérprete. Ahora bien, hemos el intérprete de Python no tenga que estar
desarrollado nuestra aplicación de escritorio necesariamente instalado. Entre ellas se
y queremos distribuirla. ¿Debemos pretender encuentran py2exe, PyInstaller y cx_Freeze.
que todos los usuarios que la utilicen tengan En este curso estaremos empleando la
Python instalado? Eso sería una experiencia segunda, ya que es sencilla de utilizar.
poco amigable.
Podemos instalar PyInstaller vía pip:
python -m pip install pyinstaller
Python Programming
Su utilización es muy sencilla. Abrimos una terminal en la
carpeta en donde se encuentre el script que queramos
distribuir y ejecutamos:
pyinstaller miscript.py
Python Programming
Si queremos aún más portabilidad haciendo que PyInstaller
genere únicamente un archivo ejecutable sin dependencias,
podemos usar la opción --onefile:
pyinstaller --onefile miscript.py
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 6 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Crear un ejecutable
Utilizando “pyinstaller”, crear un ejecutable de la
aplicación creada en el ejercicio anterior.
La aplicación no tiene que contar con la consola.
Y ser un único archivo .exe
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 06
Python Programming
Entornos virtuales
Python Programming
Entornos virtuales
Un entorno virtual, es un entorno de Python Laboralmente tenemos algunos proyectos, en
parcialmente aislado. Permite instalar los cuales vamos a trabajar con las
paquetes para que los use una aplicación en mismas librerías, pero con versiones
particular, en lugar de instalarlos en todo el diferentes (anteriores).
sistema.
¿Entonces? ¿Desinstalamos todo y solo
La idea es sencilla, funcionan de la siguiente instalamos lo que necesitamos para terminar
manera: supongamos que tenemos una el proyecto laboral, y luego volver a la
computadora en donde se instaló Python y normalidad? , no , eso sería un caos.
además tenemos instaladas librerías en sus
versiones más recientes. Python nos provee de la creación de entornos
virtuales para simplificar las cosas.
Python Programming
La imagen es tan solo a modo demostrativo, lo importante es la idea que esconde.
Python Programming
Instalar el módulo virtualenv
Python cuenta en su librería estándar con un módulo que nos
permite realizar esta tarea (venv), sin embargo la comunidad
usa habitualmente otro más completo y con más
herramientas, el módulo virtualenv .
Este módulo no es estándar (no viene incluido con Python) por
lo que necesitaremos instalarlo. Entonces en la consola del
sistema operativo escribimos:
pip install virtualenv
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 06
Python Programming
Crear 1 activar un
entorno virtual
Python Programming
Crear un entorno virtual
Lo primero que tenemos que hacer antes de crear el entorno
virtual es ubicarnos en directorio donde queramos que se cree.
En esta ocasión, a modo de ejemplo, creamos una carpeta en el
disco C:\ llamada “carpeta_entorno_virtual” . En tu caso podrías
hacerlo en otro path.
Una vez en la ruta deseada, vamos a escribir en la consola:
C:\carpeta_entorno_virtual>virtualenv ejemplo
created virtual environment CPython3.9.5.final.0-64 in 3221ms
Python Programming
Activar el entorno virtual
Para activar un entorno virtual, como en pasos anteriores,
vamos a la consola del sistema operativo y nos ubicamos en el
directorio donde está la carpeta del entorno virtual, en
nuestro caso “ejemplo” y dentro vamos a una carpeta llamada
“scripts”. Una vez en ese directorio escribimos “activate”,
como en el ejemplo a continuación:
C:\carpeta_entorno_virtual\ejemplo\Scripts>activate
Luego veremos:
(ejemplo) C:\carpeta_entorno_virtual\ejemplo\Scripts>
Python Programming
Desactivar el entorno virtual
Para desactivar el entorno virtual escribir:
C:\carpeta_entorno_virtual\ejemplo\Scripts>deactivate
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 06
Python Programming
PIP 1 trabajar con el
entorno virtual
Python Programming
Instalar paquetes en un entorno virtual
Una vez que tenemos activado el entorno virtual, podremos
instalar los paquetes o módulos que necesitemos. Esto lo
haremos con pip, como si los instaláramos directamente en el
sistema, no cambia en nada. La única diferencia es que solo
se instalarán en el entorno virtual, ya que este está activo.
Python Programming
Correr un programa usando
entornos virtuales
Al igual que en los aspectos anteriores, lo que necesitamos es
que el entorno esté activo, entonces podremos ejecutar
cualquier archivo de Python que use las librerías que
habíamos instalado. Llamando al interprete y la ruta del script
desde el entorno virtual.
También con cualquier editor de código actual como VSCode,
podemos poner como interprete favorito al que tenemos en
nuestro entorno virtual, así de esta manera cuando estamos
desarrollando usamos el virtualenv.
Python Programming
¡Sigamos trabajando!
Python Programming
P1thon Programming
Módulo 6 - Laboratorio adicional
Python Programming
Para poder realizar el Laboratorio se recomienda:
● Leer contenidos previos.
● Descargar el material necesario de la carpeta Descargas.
Python Programming
Ejercicio 1: Entorno virtual
Crear un entorno virtual y en el mismo, instalar
los módulos que veníamos usando en las
diferentes clases con pip.
Activar también el entorno virtual en tu VSCode,
para futuros usos.
Python Programming
¡Muchas gracias!
¡Sigamos trabajando!
Python Programming
Para llevar adelante esta práctica, recomendamos leer los apuntes:
* Entornos virtuales
* Crear y Activar un entorno virtual
* PIP y trabajar con entornos virtuales
P1thon Programming
Módulo 06 - Proyecto integrador - Etapa 3
Python Programming
Etapa 3
Introducción
Esta tercera parte trata de modificar
nuestro script para convertirlo en una
aplicación de escritorio.
Python Programming
Una apariencia sencilla, integrando todo lo 4. También vamos a usar algún servicio del
aprendido y por supuesto lo que hacíamos dólar para leer el valor de venta de esa
en la versión 2 del proyecto con bases de divisa y poder convertir nuestros totales
datos se mantiene como consigna. en pesos (en las bases de datos se
guardará todo en pesos). Recordemos
1. Botón Hacer Pedido, guarda los pedidos que el menú estaba en dólares.
que son ingresados en las cajas por el
encargado. El nombre del encargado una 5. Como siempre el programa, no debe
vez puesto no habría que borrarlo, hasta frenar de forma imprevista. En caso de
que venga otro nuevo encargado y el algún error solucionarlo con todo lo
mismo borre la caja. aprendido.
2. Botón Cancelar Pedido, borra todas las
cajas menos la del encargado.
3. Botón Salir Seguro, guarda el último
encargado y no pierde esos datos.
Python Programming
En la sección de Descargas encontrarás los recursos
necesarios para realizar los ejercicios y su resolución
para que verifiques cómo te fue.
Python Programming
¡Sigamos trabajando!
Python Programming
import tkinter as tk
from tkinter import messagebox
import time
import sqlite3
import requests
import sys
##########################
def guardarEncargado(data):
datosIn = (data["nombre"],data["ingreso"],"IN",0)
datosOut = (data["nombre"],data["egreso"],"OUT",data["facturado"])
conn = sqlite3.connect("comercio.sqlite")
cursor = conn.cursor()
try:
cursor.execute("INSERT INTO registro VALUES (null,?,?,?,?)",
datosIn)
cursor.execute("INSERT INTO registro VALUES (null,?,?,?,?)",
datosOut)
except sqlite3.OperationalError:
cursor.execute("""CREATE TABLE registro
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
encargado TEXT,
fecha TEXT,
evento TEXT,
caja REAL
)
""")
cursor.execute("INSERT INTO registro VALUES (null,?,?,?,?)",
datosIn)
cursor.execute("INSERT INTO registro VALUES (null,?,?,?,?)",
datosOut)
conn.commit()
conn.close
def guardarVentas(data):
datos = tuple(data)
conn = sqlite3.connect("comercio.sqlite")
cursor = conn.cursor()
try:
cursor.execute("INSERT INTO ventas VALUES (null,?,?,?,?,?,?,?)",
datos)
except sqlite3.OperationalError:
cursor.execute("""CREATE TABLE ventas
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
cliente TEXT,
fecha TEXT,
ComboS INT,
ComboD INT,
ComboT INT,
Flurby INT,
total REAL
)
""")
cursor.execute("INSERT INTO ventas VALUES (null,?,?,?,?,?,?,?)",
datos)
conn.commit()
conn.close
def cotizar():
try:
r = requests.get("https://api-dolar-
argentina.herokuapp.com/api/dolaroficial")
valor = r.json()["venta"]
valor = round(float(valor))
return valor
except:
messagebox.showerror(title="Error grave", message="Sin internet
para cotizar. Terminado")
sys.exit()
def validar(dato):
try:
dato = int(dato)
return dato
except ValueError:
return -1
def borrar():
#no borramos el encargado, para no tener que estar reescribiendolo
siempre
ccomboUno.delete(0,tk.END)
ccomboDos.delete(0,tk.END)
ccomboTres.delete(0,tk.END)
cpostre.delete(0,tk.END)
ccliente.delete(0,tk.END)
def cancelar_pedido():
respuesta = messagebox.askyesno(title="Pregunta", message="¿Desea
cancelar el pedido?")
if respuesta:
borrar()
def pedir():
cantUno= ccomboUno.get()
cantUno = validar(cantUno)
cantDos = ccomboDos.get()
cantDos = validar(cantDos)
cantTres = ccomboTres.get()
cantTres = validar(cantTres)
cantPostre = cpostre.get()
cantPostre = validar(cantPostre)
dolar = cotizar()
if cantUno>=0 and cantDos>=0 and cantTres>=0 and cantPostre>=0:
cliente = ccliente.get()
encargado = cencargado.get()
if cliente and encargado:
respuesta = messagebox.askyesno(title="Pregunta",
message="¿Confirma el pedido?")
if respuesta:
costot =
((cantUno*precios["ComboSimple"])+(cantDos*precios["ComboDoble"])+(cantTr
es*precios["ComboTriple"])+(cantPostre*precios["Flurby"]))
totalPesos = costot * dolar
fecha = time.asctime()
pedido =
[cliente,fecha,cantUno,cantDos,cantTres,cantPostre,totalPesos]
messagebox.showinfo(title="A pagar",
message="$"+str(totalPesos))
guardarVentas(pedido)
messagebox.showinfo(title="Información", message="Pedido
Exitoso")
if datosEncargado["nombre"] != encargado and
datosEncargado["egreso"] == "" : # cuando inicia la app egreso es vacio
datosEncargado["nombre"] = encargado
datosEncargado["egreso"] = "SinFecha" # es solo para
que la proxima no cumpla la condición, es solo al inicio
datosEncargado["facturado"] += totalPesos #voy
incrementando totales
elif datosEncargado["nombre"] == encargado:
datosEncargado["facturado"] += totalPesos #voy
incrementando totales
else:
datosEncargado["egreso"] = fecha # al cambiar de
encargado registro la fecha
guardarEncargado(datosEncargado) # guardo
#borramos el encargado anterior, en el diccionario
ponemos el nuevo
datosEncargado["nombre"] = encargado # iniciamos el
nuevo encargado
datosEncargado["Ingreso"] = fecha
datosEncargado["facturado"] = 0
datosEncargado["facturado"] += totalPesos
borrar()
else:
messagebox.showinfo(title="Información", message="Pedido
en pausa")
else:
messagebox.showwarning(title="Advertencia", message="Error,
ingrese bien los datos")
else:
messagebox.showwarning(title="Advertencia", message="Error,
ingrese datos correctos")
def salir():
#salir seguro implica guardar el último encargado
respuesta = messagebox.askyesno(title="Pregunta", message="¿Desea
salir?")
if respuesta:
datosEncargado["egreso"] = time.asctime()
guardarEncargado(datosEncargado)
sys.exit()
##########################
precios = {"ComboSimple":5,"ComboDoble":6,"ComboTriple":7,"Flurby":2}
datosEncargado =
{"nombre":"","ingreso":time.asctime(),"egreso":"","facturado":0}
##########################
ventana = tk.Tk()
ventana.config(width = 400, height = 400)
ventana.title("Delivery")
#####etiquetas######
ebienvenido = tk.Label(text="------ Pedidos -------")
ebienvenido.place(x = 140, y = 20)
#####cajas#########
cencargado = tk.Entry()
cencargado.place(x = 230, y = 70)
ccomboUno = tk.Entry()
ccomboUno.place(x = 230, y = 110)
ccomboDos = tk.Entry()
ccomboDos.place(x = 230, y = 150)
ccomboTres = tk.Entry()
ccomboTres.place(x = 230, y = 190)
cpostre = tk.Entry()
cpostre.place(x = 230, y = 230)
ccliente = tk.Entry()
ccliente.place(x = 230, y = 270)
ventana.mainloop()
P1thon Programming
Módulo 06 - Desafío
Python Programming
¿Qué son los desafíos?
● Son ejercicios complementarios a los realizados en clase.
● Permiten practicar y consolidar los conocimientos adquiridos.
● Es recomendable que los realices antes de rendir el
examen de la clase.
Python Programming
Ejercicio 1: Dólar II
Hacer un programa que con un botón de consulta
muestre el precio de compra y venta del dólar.
Python Programming
Ejercicio 2: Calculadora
Armar una calculadora como la siguiente: Para lograrlo recomendamos que
investigues el posicionamiento “grid” con
tkinter.
Solo dale forma (crea únicamente la parte
gráfica), luego le daremos funcionalidad.
Python Programming
Ejercicio 3: Calculadora II
Lograr que la calculadora del ejercicio anterior funcione
de manera correcta, contemplando los errores que se
puedan producir por manipulación del usuario.
Además, investiga todo lograrlo. Recomendamos el uso
de una función “built-in”, llamada eval().
Python Programming
En la sección de Descargas encontrarás los recursos
necesarios para realizar los ejercicios y su resolución
para que verifiques cómo te fue.
Python Programming
¡Terminaste el módulo!
Estás listo para rendir el examen
Python Programming
import tkinter as tk
from tkinter import messagebox
import requests
################################################
def borrar():
ccompra.delete(0,tk.END)
cventa.delete(0,tk.END)
def consultar():
borrar()
try:
r = requests.get("https://api-dolar-
argentina.herokuapp.com/api/dolaroficial")
data = r.json()
compra = data["compra"]
venta = data["venta"]
ccompra.insert(0,compra)
cventa.insert(0,venta)
except Exception:
messagebox.showerror(title="Error",message="Se produjo un error")
ccompra.insert(0,"No hay data")
cventa.insert(0,"No hay data")
################################################
ventana = tk.Tk()
ventana.config(height=200,width=200)
ventana.title("Dolar")
ecompra = tk.Label(text="Compra:")
ecompra.place(x=40,y=20)
ccompra = tk.Entry()
ccompra.place(x=40,y=45)
eventa = tk.Label(text="Venta:")
eventa.place(x=40,y=80)
cventa = tk.Entry()
cventa.place(x=40,y=110)
bconsulta = tk.Button(text="Consulta",command=consultar)
bconsulta.place(x=40,y=150,width=125,height=30)
consultar()
ventana.mainloop()
## EJS 2 Y 3
"""
Python calculadora usando Tkinter
Versión 3
"""
ventana = Tk()
ventana.title("Calculadora")
equation.set('0')
ventana.mainloop()