<jupyter_start><jupyter_text>![Header.jpg](attachment:Header.jpg) Curso de introducción a la programación orientada a objetos con Python¡Hola compañero! Bienvenido a este curso donde aprenderas programación orientada objetos con el lenguaje de programación Python. Antes de comenzar a aprender y a escribir código, vamos a hablar del contenido del curso y algunos requisitos previos. RequisitosPara este curso, es necesario tener conocimientos básicos de programación, preferiblemente con Python. Conocimientos básicos se refiere al manejo de algún editor de texto o entorno de desarrollo, saber tipos de datos, estructuras de datos, ciclos, condicionales y funciones. Contenido del cursoA través de estos cuadernos de Jupyter aprenderás programación orientada a objetos con explicaciones, ejemplos y desafíos. Esta es la lista de temas que se cubrirán en el curso:* Básicos de Python* Introducción a la programación orientada a objetos* Clases en Python* Métodos 'mágicos'* Métodos* Objetos en PythonEspero que disfrutes el contenido del curso y aprendas mucho. ¡Continúa aprendiendo!  Básicos de PythonEn esta sección del curso se dará un breve repaso de algunos elementos del lenguaje de programación Python. Si tú ya tienes experiencia en este lenguaje puedes saltarte esta sección.  Variables y tipos de datosEn Python existen 4 tipos de datos básicos que usaremos en este curso:* Int* Float* String* BoolTambién existe el tipo de dato 'complex' que nos ayuda a representar números complejos pero no lo usaremos mucho durante el curso.Al declarar una variable no es necesario indicar el tipo de dato ya que Python lo infiere automáticamente.<jupyter_code># Variables con diferentes tipos de datos
edad = 19
pi = 3.141592
nombre = "Perla"
me_gusta_python = True # El tipo de dato booleano empieza con mayúscula

print(edad)
print(pi)
print(nombre)
print("Me gusta Python:", me_gusta_python)

# Podemos modificar los valores dentro de las variables
edad += 1
print(edad)
# Para conocer el tipo de dato de una variable, podemos usar la función 'type'
print(type(edad))
print(type(pi))
print(type(nombre))
print(type(me_gusta_python))<jupyter_output><class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'><jupyter_text>Con la función 'print' se pueden imprimir variables o strings separados con comas, para imprimirlas en la misma línea con un espacio.Con la función 'format' se puede hacer interpolación de variables en un String. Aquí hay algunas características de la función print al igual que un ejemplo de la función 'format'.<jupyter_code>mensaje1 = "Hola"
mensaje2 = "mundo"

# Imprimir con un separador
print(mensaje1, mensaje2, sep=', ')

# Imprimir con un String al final de la línea
print(mensaje1, mensaje2, end= '. :)\n')

# Usando separadores y caracteres al final de la línea
print(mensaje1, mensaje2, sep=', ',end= '. :)\n')

# Función 'format'
print("Hola {}!".format(mensaje2))<jupyter_output>Hola, mundo
Hola mundo. :)
Hola, mundo. :)
Hola mundo!<jupyter_text>Estructuras de datosPara este curso, usaremos listas y diccionarios. Aquí una muestra de estos tipos de datos en Python.  Listas<jupyter_code># Definir una lista vacía
edades = []

# Agregar elementos a la lista
edades.append(20)
edades.append(30)
edades.append(18)

print(edades)

# Obtener un elemento en una posición de la lista
print(edades[0])

# Obtener el largo de la lista
largo = len(edades)
print(largo)

print()

# También es importante no confiundir las listas con tuplas, que son muy similares a las listas sin embargo no lo son
tupla = (1, 2, 3, 4)

print(tupla[0])
print(len(tupla))

# Las tuplas no pueden ser modificadas. Descomenta la siguiente línea para ver el error
# tupla.append(5)<jupyter_output>[20, 30, 18]
20
3

1
4<jupyter_text>Operadores de comparaciónEn esta sección se revisarán los operadores de comparación en Python.<jupyter_code>a = 10
b = 5

# Igual que
print(a == b)

# No es igual
print(a != b)

# Mayor que
print(a > b)

# Mayor o igual
print(a >= b)

# Menor que
print(a < b)

# Menor o igual
print(a <= b)

print()

# Conjunción
print(True and False)
print(True and True)

print()

# Disyunción
print(True or False)
print(False or False)<jupyter_output>False
True
True
True
False
False

False
True

True
False<jupyter_text>CiclosEn esta sección se verán los ciclos for y while. En Python no existen los ciclos do while.  Ciclo 'for'Este ciclo sirve para recorrer una lista de elementos. Estos ciclos son recomendables para cuando se sabe el número de veces que se va a iterar.<jupyter_code>nombres = ["Perla", "José", "Ximena", "Jesús"]

# Se usa la variable de control 'nombre' y se itera por la lista de nombres
for nombre in nombres:
    # Aquí se puede hacer cualquier operación con la variable de control
    # Es importante tomar en cuenta la identación (espacios) para denotar que el print va dentro del for
    print(nombre)
    
print()

# Con la función 'enumerate' se pueden obtener los índices de la lista así como los elementos
for index, nombre in enumerate(nombres):
    print(index, nombre)
    
# Con la función 'range' se puede crear un rango y se puede usar con un for
for num in range(1, 100):
    print(num, end=' ')<jupyter_output>Perla
José
Ximena
Jesús

0 Perla
1 José
2 Ximena
3 Jesús
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99<jupyter_text>Ciclos 'while'Este ciclo se ejecuta mientras se cumpla una condición. Estos ciclos son recomendables cuando no se sabe cuántas veces se va a iterar<jupyter_code># Usar un ciclo para pedirle una contraseña a un usuario
password = '<PASSWORD>'
input_password = ''

while password != input_password:
    input_password = input('Ingresa la contraseña: ')
    
    # Se puede usar la sentencia 'break para salir de un chiclo'
    if input_password == '<PASSWORD>':
        break<jupyter_output>Ingresa la contraseña: 23
Ingresa la contraseña: 43
Ingresa la contraseña: <PASSWORD><jupyter_text>FuncionesEn Python las funciones se declaran con la palabra reservada 'def', como se puede ver en el siguiente bloque de código<jupyter_code># Definición básica de una función
def saludar():
    print("Hola!")
    
# De esta forma se llama una función
saludar()<jupyter_output>Hola!<jupyter_text>Entre los paréntesis de la declaración de una función van los argumentos, de la siguiente manera<jupyter_code>def saludar(nombre):
    print("Hola", nombre, end="!\n")
    
saludar("Perla")<jupyter_output>Hola Perla!<jupyter_text>De esta forma se declara una función con parámetros que pueden tener un valor ya establecido<jupyter_code>def saludar(nombre="Iván"):
    print("Hola", nombre, end="!\n")
    
# Llamar a la función con el parámetro 'nombre'
saludar("Jesús")

# Llamar a la fnción sin el parámetro 'nombre'
saludar()<jupyter_output>Hola Jesús!
Hola Iván!<jupyter_text>En el siguiente bloque de código se verá una función recursiva en Python usando 'return'<jupyter_code>def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)

resultado = factorial(5)
print(resultado)<jupyter_output>120<jupyter_text>Espero que te haya sido de ayuda este cuaderno de Jupyter. Continúa a la siguiente sección donde comenzarás a aprender programación orientada a objetos.  Ejercicios de la secciónAntes de pasar a la siguiente sección, realiza los siguientes ejercicios para asegurar la comprensión de los conceptos básicos de Python.  Ejercicio 1Haz un programa que determine si una lista es estrictamente creciente, esto significa que todos sus elementos van en orden consecutivo, sin que ninguno se repita.Por ejemplo:[1, 2, 3, 4, 5] es una lista estrictamente creciente y [1, 2, 3, 4, 5] y [1, 3, 4, 5] también lo son.[1, 2, 6, 4, 5] no es una lista estrictamente creciente.NOTA:Deberás recibir la lista como una entrada del usuario  Ejercicio 2Considera una escalera de tamaño n = 4.<jupyter_code>#
  ##
 ###
####<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.07146383608985436, 'fraction_numerical': 0.03418908911379906, 'mean_word_length': 4.754971590909091, 'pattern_counts': {'":': 0, '<': 44, '<?xml version=': 0, '>': 44, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '609980', 'license': 'CC0-1.0', 'n_tokens_mistral': 3072, 'n_tokens_neox': 2851, 'n_words': 1144, 'path': 'courses/pythonOrientadoObje/.ipynb_checkpoints/PythonOOP01-checkpoint.ipynb', 'repo_name': 'UNAM-FESAc/UNAM-FESAc.github.io', 'size': '8084'}