Hasta ahora, hemos discutido c贸mo construir p谩ginas web simples utilizando HTML y CSS, y c贸mo utilizar Git y GitHub para llevar un registro de los cambios en nuestro c贸digo y colaborar con otros.
Hoy, profundizaremos en Python, uno de los dos principales lenguajes de programaci贸n que utilizaremos a lo largo de este curso.
Python es un lenguaje muy poderoso y ampliamente utilizado que nos permitir谩 construir r谩pidamente aplicaciones web bastante complejas. En este curso, utilizaremos Python 3, aunque Python 2 a煤n se utiliza en algunos lugares. Al buscar recursos externos, ten cuidado de asegurarte de que est茅n utilizando la misma versi贸n.
Comencemos donde comenzamos con muchos lenguajes de programaci贸n: 隆Hola, mundo! Este programa, escrito en Python, se ver铆a as铆:
python
1print("Hello, world!")
Para desglosar lo que sucede en esa l铆nea, hay una funci贸n print incorporada en el lenguaje Python, que toma un argumento entre par茅ntesis y muestra ese argumento en la l铆nea de comandos.
Para escribir y ejecutar este programa en sus computadoras, primero escribir谩n esta l铆nea en su editor de texto preferido y luego guardar谩n el archivo con un nombre, por ejemplo,"algo.py". Luego, abrir谩n su terminal, se dirigir谩n al directorio que contiene el archivo y escribir谩n"python algo.py". En el caso del programa anterior, las palabras "隆Hola, mundo!" se mostrar谩n en la terminal.
Dependiendo de c贸mo est茅 configurada su computadora, es posible que deban escribir "Python3" en lugar de "Python" antes del nombre del archivo, e incluso es posible que deban descargarPythonsi a煤n no lo han hecho. Despu茅s de instalar Python, recomendamos que tambi茅n descarguenPip, ya que lo necesitar谩n m谩s adelante en el curso.
Cuando escriben "python archivo.py" en su terminal, un programa llamado int茅rprete, que descargaron junto con Python, lee su archivo l铆nea por l铆nea y ejecuta cada l铆nea de c贸digo. Esto es diferente de lenguajes como C o Java, que deben compilarse a c贸digo de m谩quina antes de poder ejecutarse.
Una parte clave de cualquier lenguaje de programaci贸n es la capacidad de crear y manipular variables. Para asignar un valor a una variable en Python, la sintaxis se ve as铆:
python
1a =28
2b =1.5
3c ="Hello!"
4d =True
5e =None
Cada una de estas l铆neas toma el valor a la derecha del signo igual=y lo almacena en la variable que se encuentra a la izquierda.
A diferencia de algunos otros lenguajes de programaci贸n, los tipos de variables en Python son inferidos, lo que significa que si bien cada variable tiene un tipo, no es necesario declarar expl铆citamente de qu茅 tipo es al crear la variable. Algunos de los tipos de variables m谩s comunes son:
int: Un n煤mero entero.
floatUn n煤mero decimal.
strUna cadena de caracteres o secuencia de caracteres.
bool: Un valor que es True o False.
NoneType: Un valor especial (None) que indica la ausencia de un valor.
Ahora trabajaremos en escribir un programa m谩s interesante que pueda tomar la entrada del usuario y saludar al usuario. Para hacer esto, utilizaremos otra funci贸n incorporada llamada input, que muestra un mensaje al usuario y devuelve lo que el usuario proporciona como entrada. Por ejemplo, podemos escribir lo siguiente en un archivo llamado"name.py":
python
1name =input("Name: ")
2print("Hello, "+ name)
Un par de cosas para se帽alar aqu铆:
En la primera l铆nea, en lugar de asignar la variable"name" a un valor expl铆cito, la estamos asignando a lo que devuelve la funci贸n"input".
En la segunda l铆nea, estamos utilizando el operador"+" para combinar o concatenar dos cadenas. En Python, el operador"+" se puede utilizar para sumar n煤meros o concatenar cadenas y listas.
Si bien podemos utilizar el operador"+" para combinar cadenas como hicimos anteriormente, en las 煤ltimas versiones de Python, existen formas a煤n m谩s sencillas de trabajar con cadenas, conocidas como"cadenas formateadas" o"f-strings" en resumen.
Para indicar que estamos utilizando cadenas formateadas, simplemente agregamos una f antes de las comillas. Por ejemplo, en lugar de usar "Hello, " + name como hicimos anteriormente, podr铆amos escribirf"Hello, {name}" para obtener el mismo resultado. Incluso podemos insertar una funci贸n en esta cadena si lo deseamos, y convertir nuestro programa anterior en una sola l铆nea:
Al igual que en otros lenguajes de programaci贸n, Python nos brinda la capacidad de ejecutar segmentos de c贸digo diferentes basados en diferentes condiciones. Por ejemplo, en el programa a continuaci贸n, cambiaremos nuestra salida dependiendo del n煤mero que un usuario escriba:
python
1num =input("Number: ")
2if num >0:
3print("Number is positive")
4elif num <0:
5print("Number is negative")
6else:
Entrando en c贸mo funciona el programa anterior, las sentencias condicionales en Python contienen una palabra clave(if, elif o else)y luego(excepto en el caso de else)una expresi贸n booleana, es decir, una expresi贸n que se eval煤a como True o False. Luego, todo el c贸digo que queremos ejecutar si cierta expresi贸n es verdadera se encuentra sangrado directamente debajo de la declaraci贸n. La sangr铆a es obligatoria como parte de la sintaxis de Python.
Sin embargo, al ejecutar este programa, nos encontramos con unaexcepci贸nque se ve as铆:
Una excepci贸n es lo que sucede cuando ocurre un error mientras estamos ejecutando nuestro c贸digo Python, y con el tiempo te volver谩s mejor en la interpretaci贸n de estos errores, lo que es una habilidad muy valiosa.
Veamos un poco m谩s de cerca esta excepci贸n espec铆fica: Si observamos en la parte inferior, veremos que nos encontramos con un TypeError, lo que generalmente significa que Python esperaba que una variable fuera de un tipo espec铆fico, pero encontr贸 que era de otro tipo. En este caso, la excepci贸n nos dice que no podemos usar el s铆mbolo>para comparar una cadena(str)y un entero(int), y luego arriba podemos ver que esta comparaci贸n ocurre en la l铆nea 2.
En este caso, es evidente que 0 es un entero, por lo que debe ser el caso que nuestra variable"num es una cadena. Esto sucede porque resulta que la funci贸n"input siempre devuelve una cadena, y debemos especificar que debe convertirse(o fundirse)en un entero utilizando la funci贸n"int. Esto significa que nuestra primera l铆nea ahora se ver铆a as铆:
python
1num =int(input("Number: "))
Ahora, el programa funcionar谩 tal como lo ten铆amos previsto!
Una de las partes m谩s poderosas del lenguaje Python es su capacidad para trabajar con secuencias de datos adem谩s de variables individuales.
Hay varios tipos de secuencias que son similares en algunos aspectos, pero diferentes en otros. Al explicar esas diferencias, utilizaremos los t茅rminos mutables/inmutables y ordenados/desordenados. Mutable significa que una vez que se ha definido una secuencia, podemos cambiar elementos individuales de esa secuencia, y ordenado significa que el orden de los objetos es importante.
Cadenas
Ordenadas: S铆
Mutables: No
Ya hemos examinado las cadenas un poco, pero en lugar de solo variables, podemos pensar en una cadena como una secuencia de caracteres. Esto significa que podemos acceder a elementos individuales dentro de la cadena. Por ejemplo:
python
1name ="Mario"
2print(name[0])
3print(name[1])
imprime el primer car谩cter(o 铆ndice-0) en la cadena, que en este caso es M, y luego imprime el segundo car谩cter(铆ndice-1), que es"a".
Listas
Ordenadas: S铆
Mutables: S铆
Unalista en Pythonte permite almacenar cualquier tipo de variable. Creamos una lista utilizando corchetes cuadrados y comas, como se muestra a continuaci贸n. Al igual que con las cadenas, podemos imprimir una lista completa o algunos elementos individuales. Tambi茅n podemos agregar elementos a una lista utilizandoappendy ordenar una lista utilizandosort.
python
1# Esto es un comentario en Python
2nombres =["Harry","Ron","Hermione"]
3# Imprimir la lista completa:
4print(nombres)
5# Imprimir el segundo elemento de la lista:
6print(nombres[1])
7# Agregar un nuevo nombre a la lista:
8nombres.append("Draco")
9# Ordenar la lista:
10nombres.sort()
11# Imprimir la nueva lista:
12print(nombres)
Tuplas
Ordenadas: S铆
Mutables: No
Las tuplas generalmente se utilizan cuando necesitas almacenar solo dos o tres valores juntos, como los valoresx e ypara un punto. En el c贸digo de Python, utilizamos par茅ntesis:
python
1point =(12.5,10.6)
2# Otra tupla
3mitupla =("manzana","banana","frutilla")
Unatuplaes uno de los 4 tipos de datos incorporados en Python que se utilizan para almacenar colecciones de datos. Los otros 3 son List, Set y Dictionary, todos con diferentes caracter铆sticas y usos.
Una tupla es una colecci贸n que est谩 ordenada y no se puede modificar.
Los elementos de una tupla est谩n ordenados, no se pueden cambiar y permiten valores duplicados.
Los elementos de una tupla se indexan, el primer elemento tiene el 铆ndice[0], el segundo elemento tiene el 铆ndice[1], y as铆 sucesivamente.
Conjuntos
Ordenadas: No
Mutables: N/D
Losconjuntosson diferentes de las listas y las tuplas en que son desordenados. Tambi茅n son diferentes porque, mientras puedes tener dos o m谩s elementos iguales dentro de una lista/tupla, un conjunto solo almacenar谩 cada valor una vez. Podemos definir un conjunto vac铆o utilizando la funci贸n"set". Luego, podemos usar"add" y"remove" para agregar y quitar elementos de ese conjunto, y la funci贸n"len" para encontrar el tama帽o del conjunto. Ten en cuenta que la funci贸n"len"funciona en todas las secuencias en Python. Tambi茅n ten en cuenta que, a pesar de agregar 4 y 3 al conjunto dos veces, cada elemento solo puede aparecer una vez en un conjunto.
python
1# Crear un conjunto vac铆o:
2s =set()
3
4# Agregar algunos elementos:
5s.add(1)
6s.add(2)
7s.add(3)
8s.add(4)
9s.add(3)
10s.add(1)
11
12# Quitar el 2 del conjunto
13s.remove(2)
14
15# Imprimir el conjunto:
16print(s)
17
18# Encontrar el tama帽o del conjunto:
19print(f"El conjunto tiene {len(s)} elementos.")
20
21""" Este es un comentario de varias l铆neas en Python:
22Salida:
23{1, 3, 4}
24El conjunto tiene 3 elementos.
25"""
Diccionarios
Ordenadas: No
Mutables: S铆
Losdiccionariosde Python, o dicts, ser谩n especialmente 煤tiles en este curso. Un diccionario es un conjunto de pares clave-valor, donde cada clave tiene un valor correspondiente, al igual que en un diccionario, cada palabra(la clave) tiene una definici贸n correspondiente(el valor). En Python, utilizamos llaves(corchetes) para contener un diccionario y dos puntos para indicar claves y valores. Por ejemplo:
LosbuclesLos son una parte incre铆blemente importante de cualquier lenguaje de programaci贸n, y en Python, existen dos formas principales:bucles forybucles while. Por ahora, nos centraremos en los bucles for.
Los buclesforse utilizan para iterar sobre una secuencia de elementos, realizando un bloque de c贸digo (sangrado debajo) para cada elemento en una secuencia. Por ejemplo, el siguiente c贸digo imprimir谩 los n煤meros del 0 al 5:
python
1for i in[0,1,2,3,4,5]:
2print(i)
3
4""" Output:
50
61
72
83
94
105
11"""
Podemos condensar este c贸digo utilizando la funci贸n range de Python, que nos permite obtener f谩cilmente una secuencia de n煤meros. El siguiente c贸digo produce el mismo resultado que nuestro c贸digo anterior:
python
1for i inrange(6):
2print(i)
3
4""" Output:
50
61
72
83
94
105
11"""
隆Este tipo de bucle puede funcionar para cualquier secuencia! Por ejemplo, si deseamos imprimir cada nombre en una lista, podr铆amos escribir el siguiente c贸digo:
python
1# Crea una lista:
2nombres =["Harry","Ron","Hermione"]
3
4# Imprime en pantalla cada nombre:
5for nombre in nombres:
6print(name)
7
8""" Output:nombres
9Harry
10Ron
11Hermione
12"""
Podemos ser a煤n m谩s espec铆ficos si lo deseamos y recorrer cada car谩cter en un solo nombre.
Ya hemos visto algunas funciones de Python, comoprinteinput, pero ahora vamos a adentrarnos en escribir nuestras propias funciones. Para comenzar, escribiremos una funci贸n que toma un n煤mero y lo eleva al cuadrado:
python
1defsquare(x):
2return x * x
Observa c贸mo utilizamos la palabra clave"def"para indicar que estamos definiendo una funci贸n, que estamos tomando una 煤nica entrada llamada"x" y que utilizamos la palabra clave"return"para indicar cu谩l debe ser la salida de la funci贸n.
Luego podemos "llamar" a esta funci贸n de la misma manera en que hemos llamado a otras: utilizando par茅ntesis:
A medida que nuestros proyectos se vuelvan m谩s grandes, ser谩 煤til poder escribir funciones en un archivo y ejecutarlas en otro. En el caso anterior, podr铆amos crear un archivo llamado"functions.py"con el c贸digo:
python
1defsquare(x):
2return x * x
Y otro archivo llamado"square.py"con el c贸digo:
python
1for i inrange(10):
2print(f"The square of {i} is {square(i)}")
Sin embargo, cuando intentemos ejecutar"square.py", nos adentraremos en el siguiente error:
Nos encontramos con este problema porque, de forma predeterminada, los archivos de Python no saben acerca de los dem谩s, por lo que debemos importar expl铆citamente la funci贸n"square" desde el m贸dulo"functions" que acabamos de escribir. Ahora, cuando"square.py"se ve as铆:
python
1from functions import square
2
3for i inrange(10):
4print(f"The square of {i} is {square(i)}")
Alternativamente, podemos optar por importar el m贸dulo completo"functions" y luego utilizar la notaci贸n de punto para acceder a la funci贸n"square":
python
1import functions
2
3for i inrange(10):
4print(f"The square of {i} is {functions.square(i)}")
Existen muchos m贸dulos incorporados en Python que podemos importar, como "math" o "csv", que nos brindan acceso a a煤n m谩s funciones. Adem谩s, podemos descargar a煤n m谩s m贸dulos para acceder a una funcionalidad adicional. Pasaremos mucho tiempo utilizando el m贸dulo Django, que veremos en la pr贸xima etapa.
LaProgramaci贸n Orientada a Objetoses un paradigma de programaci贸n, o una forma de pensar acerca de la programaci贸n, que se centra en objetos que pueden almacenar informaci贸n y realizar acciones.
Clases: Ya hemos visto varios tipos diferentes de variables en Python, pero 驴qu茅 pasa si queremos crear nuestro propio tipo? Una clase en Python es esencialmente una plantilla para un nuevo tipo de objeto que puede almacenar informaci贸n y realizar acciones. Aqu铆 tienes una clase que define un punto bidimensional:
python
1classPoint():
2# Un m茅todo para definir como crear un punto:
3def__init__(self, x, y):
4 self.x = x
5 self.y = y
en en cuenta que en el c贸digo anterior, utilizamos la palabra clave"self"para representar el objeto con el que estamos trabajando actualmente."self"debe ser el primer argumento para cualquier m茅todo dentro de una clase de Python.
Ahora, veamos c贸mo realmente podemos usar la clase de arriba para crear un objeto:
python
1p = Point(2,8)
2print(p.x)
3print(p.y)
4
5""" Output:
62
78
8"""
Ahora, veamos un ejemplo m谩s interesante en el que, en lugar de almacenar solo las coordenadas de un punto, creamos una clase que representa un vuelo de aerol铆nea:
python
1classVuelo():
2# M茅todo para crear un vuelo nuevo y su capacidad:
3def__init__(self, capacidad):
4 self.capacidad = capacidad
5 self.pasajeros =[]
6
7# M茅todo para agregar pasajeros al vuelo:
8defagregar_pasajero(self, nombre):
9 self.pasajeros.append(nombre)
Sin embargo, esta clase tiene una falla, ya que aunque establecemos una capacidad, todav铆a podr铆amos agregar demasiados pasajeros. Vamos a mejorarla para que antes de agregar un pasajero, verifiquemos si hay espacio en el vuelo:
python
1classVuelo():
2# M茅todo para crear un vuelo nuevo y su capacidad:
3def__init__(self, capacidad):
4 self.capacidad = capacidad
5 self.pasajeros =[]
6
7# M茅todo para agregar pasajeros al vuelo:
8defagregar_pasajero(self, nombre):
9ifnot self.asientos_disponibles():
10returnFalse
11 self.pasajeros.append(nombre)
12returnTrue
13
14# M茅todo para devolver el n煤mero de los asientos disponibles:
15defacientos_disponibles(self):
16return self.capacidad -len(self.pasajeros)
Observa que arriba utilizamos la l铆nea"if not self.asientos_disponibles"para determinar si hay o no asientos disponibles. Esto funciona porque en Python, el n煤mero 0 puede interpretarse como False, y tambi茅n podemos usar la palabra clave"not"para indicar lo contrario de la declaraci贸n siguiente, por lo que "not True" es False y"not False" es True. Por lo tanto, si "asientos_disponibles"devuelve 0, toda la expresi贸n se evaluar谩 como True.
Ahora, probemos la clase que hemos creado instanciando algunos objetos:
python
1# Crear un nuevo vuelo con capacidad para 3 pasajeros
2vuelo = Vuelo(3)
3
4# Crear una lista de personas
5personas =["Harry","Ron","Hermione","Ginny"]
6
7# Intentar a帽adir a cada persona de la lista al vuelo
8for persona in personas:
9if vuelo.agregar_pasajero(persona):
10print(f"Se a帽adi贸 a {persona} al vuelo con 茅xito")
11else:
12print(f"No hay asientos disponibles para {persona}")
Adem谩s de admitir la Programaci贸n Orientada a Objetos, Python tambi茅n admite el Paradigma deProgramaci贸n Funcional, en el cual las funciones se tratan como valores, al igual que cualquier otra variable.
Una cosa que es posible gracias a la programaci贸n funcional es la idea de un decorador, que es una funci贸n de orden superior que puede modificar otra funci贸n. Por ejemplo, escribamos un decorador que anuncie cu谩ndo una funci贸n est谩 a punto de comenzar y cu谩ndo termina. Luego, podemos aplicar este decorador utilizando el s铆mbolo "@".
python
1defanunciar(f):
2defenvoltorio():
3print("A punto de ejecutar la funci贸n")
4 f()
5print("Terminado con la funci贸n")
6return envoltorio
7
8@anunciar
9defhola():
10print("隆Hola, mundo!")
11
12hola()
13
14""" Resultado:
15A punto de ejecutar la funci贸n
16隆Hola, mundo!
17Terminado con la funci贸n
18"""
Los decoradores tambi茅n se pueden usar en las clases para losgettersysetters, para las clases abstractas, usar m茅tdos est谩ticos, entre otros. Veamos un ejemplo en una clase con los decoradores de getters y setters:
Las funciones lambda proporcionan otra forma de crear funciones en Python. Por ejemplo, si queremos definir la misma funci贸n cuadrado que hicimos anteriormente, podemos escribir:
python
1square =lambda x: x * x
Donde la entrada est谩 a la izquierda de los dos puntos (:) y la salida est谩 a la derecha.
Esto puede ser 煤til cuando no queremos escribir una funci贸n completamente separada para un uso 煤nico o peque帽o. Por ejemplo, si deseamos ordenar algunos objetos donde inicialmente no est谩 claro c贸mo deben ordenarse. Imagina que tenemos una lista de personas, pero con nombres y casas en lugar de solo nombres que deseamos ordenar:
python
1people =[
2{"name":"Harry","house":"Gryffindor"},
3{"name":"Cho","house":"Ravenclaw"},
4{"name":"Draco","house":"Slytherin"}
5]
6
7people.sort()
8
9print(people)
Esto, sin embargo nos deja este error:
Esto sucede porque Python no sabe c贸mo comparar dos diccionarios para verificar si uno es menor que el otro.
Podemos resolver este problema incluyendo un argumento "key" en la funci贸n de ordenamiento, que especifica qu茅 parte del diccionario deseamos utilizar para ordenar:
python
1people =[
2{"name":"Harry","house":"Gryffindor"},
3{"name":"Cho","house":"Ravenclaw"},
4{"name":"Draco","house":"Slytherin"}
5]
6
7deff(person):
8return person["name"]
9
10people.sort(key=f)
11
12print(people)
13
14""" Output:
15[{'name': 'Cho', 'house': 'Ravenclaw'},
16{'name': 'Draco', 'house': 'Slytherin'},
17{'name': 'Harry', 'house': 'Gryffindor'}]
18"""
Si bien esto funciona, hemos tenido que escribir una funci贸n completa que solo estamos utilizando una vez. Podemos hacer que nuestro c贸digo sea m谩s legible utilizando una funci贸n lambda:
Durante esta conferencia, nos hemos encontrado con varias excepciones diferentes, por lo que ahora veremos algunas nuevas formas de lidiar con ellas.
En el siguiente fragmento de c贸digo, tomaremos dos n煤meros enteros del usuario e intentaremos dividirlos:
python
1x =int(input("x: "))
2y =int(input("y: "))
3
4result = x / y
5
6print(f"{x} / {y} = {result}")
En muchos casos, el programa funciona bien:
Sin embargo, nos encontraremos con problemas cuando intentemos dividir por 0:
Podemos manejar este error desordenado utilizando elmanejo de excepciones. En el siguiente bloque de c贸digo,intentaremos dividir los dos n煤meros,exceptocuando obtengamos unZeroDivisionError :
python
1import sys
2
3x =int(input("x: "))
4y =int(input("y: "))
5
6try:
7 result = x / y
8except ZeroDivisionError:
9print("Error: No se puede dividir por 0.")
10# Salir del programa
11 sys.exit(1)
12
13print(f"{x} / {y} = {result}")
En este caso cuando intentemos esto de nuevo:
Sin embargo, a煤n nos encontramos con un error cuando el usuario ingresa valores que no son n煤meros para x e y:
Podemos resolver este problema de similar manera:
python
1import sys
2
3try:
4 x =int(input("x: "))
5 y =int(input("y: "))
6except ValueError:
7print("Error: Entrada no v谩lida.")
8 sys.exit(1)
9
10try:
11 result = x / y
12except ZeroDivisionError:
13print("Error: No se puede dividir por 0.")
14# Salir del programa
15 sys.exit(1)
16
17print(f"{x} / {y} = {result}")
隆Eso es todo para esta clase! La pr贸xima clase, usaremos el m贸dulo Django de Python para construir algunas aplicaciones.