Python
Python
(Google Colaboratory)
Google Colab permite ejecutar código Python en la nube. Para ello usa el formato de Jupyter Notebook, que es
simplemente como una versión de Python enriquecida: además del código Python, es posible agregar texto con
diferentes formatos o imágenes.
Para utilizar Google Colab es necesario tener una cuenta de Google. En nuestro caso crearemos la cuenta en
Google:
[email protected]
en el siguiente enlace:
https://accounts.google.com/signup/v2/createaccount?continue=https%3A%2F%2Ffanyv88.com%3A443%2Fhttps%2Faccounts.google.com%2FMan
ageAccount%3Fnc%3D1&biz=false&theme=glif&flowName=GlifWebSignIn&flowEntry=SignUp
https://colab.research.google.com/?hl=es
Herramienta de trabajo Google Colab
(Google Colaboratory)
●
Tipado dinámico:
●
Una misma variable puede tomar valores de distinto tipo en distintos momentos.
●
Resolución dinámica de nombres:
●
Métodos, variables son enlazadas con su lógica durante la ejecución.
●
Biblioteca estándar de Python es extensa y bien documentada:
●
Conocido como "batteries included"
●
Gran variedad de librerías de terceros:
●
Más de 130.000 paquetes en un gran rango de funcionalidades, incluyendo: GUI, Web,
Multimedia, Base de datos, Redes, Testing, Automatización, Web Scraping,
Procesamiento de texto, Procesamiento de imágenes, etc.
●
Esponsorizado por grandes empresas:
●
Facebook, Google, Amazon, Redhat, Microsoft, etc.
Legibilidad
●
Más uso de palabras:
●
!, ||, && → not, or, y and
●
Indentación (sangrado):
●
En lugar de usar llaves o palabras claves para delimitar bloques de código, usa
espacios o tabuladores.
# Bash # Python
if [ $x -ge 18 ]; then if x >= 18: print("Es
echo "Es mayor" else mayor")
echo "Es menor" else:
fi print("Es menor")
Comentarios y Variables
●
Comentarios:
'''
Comentario más largo en una línea en Python '''
print ("Hola mundo") # Al final de una línea dec código
●
Variables:
● Las variables no necesitan ser declaradas, no se tiene que especificar cuál es su tipo.
●
Las variables son creadas cuando se les asigna valores. Se usa el símbolo = paras asignar
valores.
● Deben ser asignadas antes de ser usadas.
● Se les puede asignar cualquier tipo de dato.
x = 1
x = "texto" # Posible porque los tipos son
# asignados dinámica mente
Tipo de datos
Tipo Clase Notas Ejemplo
complex Numbers Número complejo con parte real y parte imaginaria j 4.5 + 3j
set Set Types Conjunto de datos, sin orden, no contiene duplicados. Mutable set([4.0, 'Cadena', True])
frozenset Set Types Conjunto de datos, sin orden, no contiene duplicados. Inmutable frozenset([4.0, 'Cadena',
True])
dict Mappings Diccionario de pares clave:valor (array asociativo) {'key1': 1.0, 'key2': False}
●
Nota: Python diferencia entre mayúsculas y minúsculas.
Identificadores
●
Palabras reservadas:
>>> import keyword
>>> keyword.kwlist
Manejo de variables
●
Asignación simple (=)
>>> a=5
●
Asignación multiple:
>>> edad,nombre = 21, 'Daniel'
●
Mismo valor para múltiples variables:
●
>>> age=fav=7
●
Intercambiando variables
>>> a,b='red','blue'
>>> a,b=b,a
●
Borrando variables
>>> del a
Conversión de tipos
●
Para convertir entre tipos de datos se puede utilizar:
● bool(x) Convierte x en un booleano.
● int (x) Convierte x en un entero
● float (x) Convierte x en un número real
● str (x) Convierte x a una cadena.
● set(x) Convierte x en un conjunto
● list(x) Convierte x en una lista
● tuple(x) Convierte x en una tupla
●
Nota: hay conversiones que no se pueden realizar y retorna un
error.
Variables Locales y Globales
●
Variables Locales:
●
Una variable creada dentro de una función pertenece al ámbito local
de esa función y solo se puede usar dentro de esa función.
● Variables Globales:
●
print("{a} tiene {b} años de edad".format(a=nombre,b=edad))
●
Sucede a la cadena y las variables van como argumentos separados
por comas. Se usa llaves para colocar las variables. Se puede hacer
referencia a la posición o al nombre si se definen.
Formateadores de cadenas
●
Operador %:
●
print("%s tiene %s años de edad"%(nombre,edad))
●
Se colocan donde van las variables en una cadena. %s es para la
cadena. Lo que sigue a la cadena es el operador % y las variables en
una tupla.
● Otras opciones incluyen:
– %d - para enteros
– %f - para números de coma flotante
Entrada estándar
●
La función input() permite obtener texto escrito por teclado. El programa
se detiene esperando que se escriba algo y se pulse la tecla Intro.
● print("¿Cómo se llama? ", end="")
nombre = input()
print(f"Me alegro de conocerle, {nombre}")
#Using 'list()'
f = open("hola.txt", "r")
f_content = list(f)
print(f_content)
f.close()
Manejo de archivos
●
Sentencia with:
●
Nota: con with el close se hace automáticamente
Manejo de archivos
Programación Orientada a Objeto (POO)
●
Los estilos de programación se les llama paradigmas:
●
Secuencial o lineal:
– Las instrucciones van de arriba hacia abajo, no tenemos que abstraer cosas
complejas, simplemente damos ordenes una tras otra.
– Para aplicaciones sencillas suele ser muy directo y mantenible.
●
Estructurado:
– Surge con la idea de mejorar la claridad, calidad y tiempo de desarrollo de una
programación secuencial. Se basa en en subrutinas y estructuras básicas:
● bloques de código
● sentencias condicionales
● y bucles.
Programación Orientada a Objeto (POO)
●
Lineal y Estructurado:
• Se centran en parte algorítmica y la lógica de programación más
que en la representación de los datos y la descripción de la lógica
del negocio. Los datos están separados y sin relación con los
procedimientos o funciones.
• Aunque es útil para muchos problemas para el desarrollo de
grandes aplicaciones con una lógica de negocio extensa y dinámica
es complejo de mantener y evolucionar.
Programación Orientada a Objeto (POO)
●
POO:
●
Es la evolución natural de la programación estructurada. Se basa en una
representación más cercana a como expresaríamos las cosas en la vida real.
●
Se basa en dividir el programa en pequeñas unidades lógicas de código. A
estas pequeñas unidades lógicas de código se les llama objetos.
●
Los objetos son estructuras independientes que combinan datos o estados
(variables) con acciones asociadas o comportamiento (métodos).
●
La lógica de negocio se modela e implementa mediante una serie de objetos
que interactúan entre si.
●
Este enfoque aumenta la capacidad para administrar la complejidad del
software, lo cual resulta especialmente importante cuando se desarrollan y
mantienen aplicaciones y estructuras de datos de gran tamaño.
Programación Orientada a Objeto (POO)
●
Características principales:
●
Abstracción: Los objetos permiten modelar las características
esenciales y el comportamiento de entidades reales sin revelar
"cómo" se implementan.
● Encapsulamiento: Consiste en agrupar en una clase las
características y el comportamiento de un mismo nivel a abstracción.
● Ocultamiento: Es la capacidad de ocultar los detalles internos de una
clase y exponer sólo los detalles que sean necesarios para el resto del
sistema.
● Polimorfismo: Se refiere a la propiedad de invocar acciones
sintácticamente iguales a objetos de tipos distintos.
Programación Orientada a Objeto (POO)
●
Características principales:
●
Herencia:
– Las clases no se encuentran aisladas, sino que se relacionan entre sí,
formando una jerarquía de clasificación. Los objetos heredan las propiedades
y el comportamiento de todas las clases a las que pertenecen.
● Recolección de basura:
– Es la técnica por la cual el entorno de objetos se encarga de destruir
automáticamente los objetos que hayan quedado sin ninguna referencia a
ellos.
– Esto significa que el programador no debe preocuparse por la asignación o
liberación de memoria, ya que el entorno asignará memoria al crear un nuevo
objeto y la liberará la memoria cuando nadie esté usando el objeto.
POO en Python
●
Características principales:
●
Abstracción: soportado
●
Encapsulamiento: soportado
● Ocultamiento: brinda está característica por convención.
● Polimorfismo: natural por su enfoque dinámico (enlazado tardío).
● Herencia: soporta herencia simple y múltiple
●
Recolección de basura: soportado
POO: Clases
●
Una clase es un tipo de dato definido por el usuario. La clase es como el
plano (la definición) de los objetos. Sintaxis:
● # Clase base:
class <NombreDeLaClase>:
"""documentación"""
<Sentencias de la clase>
● # Herencia (simple y multiple)
class <NombreDeLaClase>(<ClaseBase1, ..., ClaseBaseN>):
"""documentación"""
<Sentencias de la clase>
POO: Clases
● Crear una clase: ●
Todo es un objeto:
class MiClase:
x=5
● Crear un objeto:
o = MiClase()
print(o.x)
●
Borrar un objeto:
del o
POO: Clases: init ()
●
Todas las clases tienen una función class Persona:
llamada init (), que siempre se
ejecuta cuando se instancia la clase. def init (self, nombre, edad):
self.nombre = nombre
●
Se le llama “constructor” y se usa
para asignar valores a los atributos self.edad = edad
del objeto u otras operaciones que
sean necesarias cuando se crea el
objeto. p1 = Persona("Carlos", 36)
●
Nota: El parámetro self es una print(p1.nombre)
referencia a la instancia actual de la print(p1.edad)
clase y se usa para acceder a las
variables que pertenecen a la clase.
POO: Clases: Métodos
• Los objetos pueden contener class Persona:
métodos (son funciones que def init (self, nombre, edad):
pertenecen al objeto). self.nombre = nombre
• Todos los métodos de clase self.edad = edad
deben tener el argumento
adicional self como primer
def mimetodo(self):
argumento.
print("Hola, mi nombre es " + self.nombre)
p1 = Persona("Carlos", 36)
p1.mimetodo()
POO: Clases: Variables
●
Las variables del objeto se pueden modificar o borrar de la
siguiente manera:
class Persona:
def init (self, edad):
self.edad = edad
p1 = Persona(36)
# Modificar
p1.edad = 40
# Borrar
del p1.edad
POO: Clases: Variables
●
Dentro de una clase hay dos tipos principales de variables:
●
Variables de la clase:
– Tienen el mismo valor en todas las instancias de la clase (es decir, variables
estáticas)
– Se accede a la variable de la clase usando:
<NombreDeLaClase>.<NombreDeLaVariable>
●
Variables de la instancia:
– Suelen tener valores diferentes en todas las instancias de la clase.
– Se accede a la variable de la instancia usando
<NombreDeLaInstancia>.<NombreDeLaVariable>
POO: Clases: Variables
class Auto:
# Variable de la clase
ruedas = 4
auto1= Auto("Renault")
auto2= Auto("Suzuki")
print(f"Marca: {auto1.marca}, Ruedas: {Auto.ruedas}")
print(f"Marca: {auto2.marca}, Ruedas: {Auto.ruedas}")
POO: Clases: Variables
●
Cuando se crean variables de instancia realmente se generan
dos, una de la clase y otra de instancia con el mismo nombre. Y
cual se está usando depende de como se acceda.
class Auto:
ruedas = 4
def init (self, marca):
self.marca = marca
instancia= Auto("Renault")
instancia.ruedas = 5
print(instancia.ruedas)
print(Auto.ruedas)
POO: Encapsulamiento
• Nada en Python es privado. Todos los atributos de Python
(variables y métodos) son públicos.
• Por convención se usa un solo guión bajo antes del nombre para señalar
que es un atributo internos y no debería usarse externamente.
class Auto:
def init (self, marca):
self._marca = marca
auto= Auto("Renault")
auto._marca
POO: Encapsulamiento
●
Un doble guión bajo al principio de una variable lo “hace privado”.
Da una fuerte sugerencia de no tocarlo desde fuera de la clase.
Cualquier intento de acceder dará como resultado un AttributeError ya
que python cambia el nombre al siguiente formato:
<_NombreDeLaClase>__<NombreDeLaVariable>.
class Auto:
def init (self, marca):
self. marca = marca
auto= Auto("Renault")
auto._Auto marca
POO: Herencia
●
La herencia nos permite definir una clase que hereda todos los métodos y
propiedades de otra clase.
●
La clase padre es la clase de la que se hereda, también llamada clase base.
●
La clase hija es la clase que hereda de otra clase, también llamada clase derivada
class Persona:
def init (self, nombre):
self.nombre = nombre
def printNombre(self):
print(self.nombre)
class Estudiante(Persona):
pass
x = Estudiante("Alejandro")
x.printNombre()
POO: Herencia
class Persona:
def init (self, nombre):
self.nombre = nombre
class Estudiante(Persona):
def init (self, nombre, fecha): # Constructor propio
super(). init (nombre) # Para mantener la herencia
self.fechagraduacion = fecha
def welcome(self):
print(f"Bienvenido {self.nombre} ({self.fechagraduacion})")
x = Estudiante("Alejandro", "2019")
x.welcome()
POO: Herencia Múltiple
class A:
def a(self):
print('b')
class B:
def b(self):
print('c')
class C(A, B):
def c(self):
print('d')
c = C()
c.a()
c.b()
c.c()
Manejo de Excepciones
●
Hay dos tipos de errores durante la ejecución de un programa:
●
Errores de sintaxis:
– Los errores de sintaxis ocurren cuando se escribe el código incorrectamente.
– En tales casos, la línea errónea es repetida por el analizador con una flecha
apuntando a la primera ubicación en donde el error fue detectado.
●
Excepciones:
– Estos ocurren durante la ejecución de un programa cuando algo inesperado
sucede. Por ejemplo, división por cero.
– Cuando no estás manejando excepciones apropiadamente, el programa se
cerrará de manera abrupta ya que no sabe que hacer en tales casos.
Manejo de Excepciones
try:
<sentencias>
●
Try: permite controlar las
except excepción1 [as variable1]: excepciones dentro de un
<sentencias> bloque de código.
…
except excepciónN [as variableN]:
●
Except: permite ejecutar código
<sentencias> si ocurrió alguna excepción.
except (exA, exB, ...) [as variable]:
<sentencias>
●
Else: permite ejecutar código si
except: no ocurrieron excepciones.
<sentencias> ● Finally: permite ejecutar código
else:
<sentencias>
independientemente de si
finally:
ocurrieron o no excepciones.
<sentencias>
Manejo de Excepciones
Manejo de Excepciones
while True:
try:
x = int(input("Ingrese un número: "))
except ValueError:
print("El valor ingresad no es un entero.")
else:
print("Calculando 50 /", x,"Resultado:", 50/x)
finally:
print("Ya hice todo lo necesario.")
Manejo de Excepciones
●
En ciertas ocasiones es deseable generar una excepción:
●
Si estamos dentro de un bloque except, se puede lanzar una excepción
sin especificar que excepción.
raise
● Especificando un excepción (estándar o personalizada) y un argumento:
raise <TipoDeError>(<mensaje>)
x = -1
if x < 0:
raise Exception("x tiene un valor negativo")
Manejo de Excepciones
●
Las excepciones personalizadas son clases que heredan de otra
excepción:
class exceptionName(baseException):
<sentencias>
● Ejemplo:
class MiException(Exception):
def init (self, mensaje):
super(). init (mensaje)