x = (1,2,3,0,2,1)

x

x = (0, 'hola', (1,2))

x

len(x)

"""
Explanation: Resumen de estructuras de datos en Python
Tuplas, Listas, Sets, Diccionarios, Listas de comprehension, funciones, clases
Vamos a ver ejemplos de estructuras de datos en Python.
Tuplas
Son el tipo mas simple de estructura, puede almacenar en una misma variables mas de un dato.
End of explanation
"""


x[0]

x[1]

x[2]

x[0:3]

x[0:2]

"""
Explanation: Una vez que guardan en una tupla datos, pueden accesarlos con indices en brackets. En python los indices comienzan en cero.
End of explanation
"""


x[1] = 'adios'

id(x)

x = (0, 'adios', (1,2))

id(x)

"""
Explanation: Que tienen de malo las tuplas y porque necesitariamos algomas? Son inmutables.
End of explanation
"""


x = [1,2,3]

x[0] = 'hola'

x

x.append('nuevo valor')

x

x.insert(2, 'valor intermedio')

x.pop(0)

x

"""
Explanation: Listas
Son elementos que pueden cambiar de valores y de tamano una vez creados, son las estructuras mas usadas. En vez de usar parentesis usan brackets.
End of explanation
"""


import timeit
timeit.timeit('x = (1,2,3,4,5,6)')

timeit.timeit('x=[1,2,3,4,5,6]')

"""
Explanation: Que es mas rapido, tuplas o listas?
End of explanation
"""


x = [1,2,3] # asignacion

y = [0, x] # referencia

y

x[0] = -1 # asignamos otra lista a x

y

"""
Explanation: Atencion para los usuarios de R: referencia o asignacion?
End of explanation
"""


dir_tel = {'juan': 553423523,  'pedro': 243252345, 'itam':'is fun'}

dir_tel['juan']

dir_tel['itam']

dir_tel.keys()

dir_tel.values()

"""
Explanation: Diccionarios
En una GRAN cantidad de problemas, quieren almacenar claves y asignarle a cada clave un valor. Un mejor nombre para diccionario (ejemplo jaja) es "directorio telefonico".
End of explanation
"""


A = {1,2,3}
B = {2,3,4}

A | B # union

A & B # interseccion

A - B # diferencia de conjuntos

B - A

A ^ B # diferencia simetrica

"""
Explanation: Sets
son conjuntos matematicos
End of explanation
"""


range(1000)

for i in range(5): # for (i in 0:(n-1))
    print(i)

for i in range(10):
    if i % 2 == 0: # operador de modulo (residuo tras division)
        print(str(i) + ' par') # str convierte numero en string
    else:
        print(str(i) + ' impar')

i = 0
while i < 10:
    print(i)
    i = i + 1

"""
Explanation: Condicionales y Loops, For, While, If, Elif
El truco para hacer loops en python es la funcion range
End of explanation
"""


True and True

True and False

True or True

True or False

2 > 3 or 1 < 2

(2 > 3) and (1 < 2)

"""
Explanation: Booleanos, short circuits
End of explanation
"""


class Person:
    def __init__(self, first, last):
        self.first = first # campos
        self.last = last       
    def greet(self, add_msg = ""): # mas metodos
        print('hello ' + self.first + ' ' + add_msg)

juan = Person('juan', 'dominguez')

type(juan)

juan.first

juan.last

pedro = Person('pedro', 'gonzalez')

pedro.first

pedro.last

pedro.greet('my friend')

"""
Explanation: Clases
End of explanation
"""


