Clase 7-8

Repaso conceptos clave:

  • Librería: Colección de modulos. Nos sirve para implementar funciones que permiten tareas específicas como: operaciones matemáticas, gráficos, procesar datos, etc.

  • Variables: elemento que amacena información de diferentes types.

  • Types: Tipos de información que podemos utilizar: texto, numérico, secuencial, boolean, etc.

  • Listas: Contenedor de información. Permite almacenar diferentes types.

  • Loops: iteraciones que vamos a llamar mediante la palabra for.

Contenidos de la clase:

  • Loops

  • Input/output

  • If

  • Crear funciones

  • Diccionarios

1. Loops

Podemos iterar sobre un rango de valores (a,b). Recordar que la iteración incluye a y no incluye b.

# Iterar sobre un rango de valores
for i in range(5, 10): 
    print(i)
5
6
7
8
9

Si creamos una variable antes de la iteración podemos modificarla con cada iteración. Veamos tres ejemplos con x, y, z:

# Creamos x y y fuera de la iteración
x = 0 
y = 0
for i in range(1, 5): 
    z = 0 #creamos z dentro de la iteración
    x = x + i
    y = i 
    z = z + i
    print("i:", i, ", x=", x, ", y=", y, ", z=", z)
i: 1 , x= 1 , y= 1 , z= 1
i: 2 , x= 3 , y= 2 , z= 2
i: 3 , x= 6 , y= 3 , z= 3
i: 4 , x= 10 , y= 4 , z= 4

Podemos utilizar iteraciones dentro de iteraciones, esto nos puede servir para trabajar con diferentes fuentes de información.

La clase pasada vimos como crear una lista manualmente, ahora dos ejemplos para crear una lista numérica (array) entre un rango de valores:

import numpy as np
#linspace(inicio, término, cantidad de elementos)
a = np.linspace(1, 10, 5)
print("type de a:", type(a))
print("a: ", a)
#arange(inicio, término, separador)
b = np.arange(1, 10,2)
print("type de b:", type(b))
print("b: ", b)
type de a: <class 'numpy.ndarray'>
a:  [ 1.    3.25  5.5   7.75 10.  ]
type de b: <class 'numpy.ndarray'>
b:  [1 3 5 7 9]
import numpy as np
inicio = 0
termino = 100
cantidad = 1001

np.linspace(inicio, termino, cantidad)

(termino-inicio)/cantidad
0.0999000999000999

Vamos a utilizar estas listas para crear un for anidado y guardar un resultado en una lista

Recorrer los elementos de la lista

for i in b: 
    print(i)
    
    
1
3
5
7
9
print(a)
print(b)
[ 1.    3.25  5.5   7.75 10.  ]
[1 3 5 7 9]
#1. Creamos una lista
lista1 = []
#2. Iteramos sobre los valoes de a y b
for i in a: 
    for j in b: 
        #3. Anexamos una operación a la lista
#         print((i, j), "multiplicacion:", i * j)
        lista1.append(i * j) 
print(lista1)
[1.0, 3.0, 5.0, 7.0, 9.0, 3.25, 9.75, 16.25, 22.75, 29.25, 5.5, 16.5, 27.5, 38.5, 49.5, 7.75, 23.25, 38.75, 54.25, 69.75, 10.0, 30.0, 50.0, 70.0, 90.0]

Otra forma de hacer la misma operación

#1. Creamos una lista
lista2 = []
#2. Iteramos sobre el largo de las listas a y b
for i in range(0, len(a)): 
    for j in range(0, len(b)): 
        #3. Anexamos una operación a la lista
        lista2.append(a[i] * b[j]) 
print(lista2)

#Podemos sumar los valores de una lista con sum()
print("suma de la lista:", sum(lista2))
[1.0, 3.0, 5.0, 7.0, 9.0, 3.25, 9.75, 16.25, 22.75, 29.25, 5.5, 16.5, 27.5, 38.5, 49.5, 7.75, 23.25, 38.75, 54.25, 69.75, 10.0, 30.0, 50.0, 70.0, 90.0]
suma de la lista: 687.5

Son iguales la lista 1 y lista 2?

lista1 == lista2
True

2. Input/Output

La función input() nos va a pedir entregar un valor. Esto es útil cuando necesitamos que el usuario nos reporte algún dato.

input()
---------------------------------------------------------------------------
StdinNotImplementedError                  Traceback (most recent call last)
<ipython-input-10-9c8b639daf2f> in <module>
----> 1 input()

~/miniconda3/lib/python3.9/site-packages/ipykernel/kernelbase.py in raw_input(self, prompt)
    843         """
    844         if not self._allow_stdin:
--> 845             raise StdinNotImplementedError(
    846                 "raw_input was called, but this frontend does not support input requests."
    847             )

StdinNotImplementedError: raw_input was called, but this frontend does not support input requests.

Podemos incorporar un texto referente a la información solicitada

input("Indique su edad:")
Indique su edad: 10
'10'

¿Podemos guardar la información?

edad = input("indique su edad:") 
#Es una variable del tipo string
#¿Cómo la pasamos a una variable numérica?
#Con int() o float()
indique su edad: 10
print(edad)
10

3. If/else

La operación if nos permite evaluar si se cumple una condición.

Por ejemplo: Iteramos sobre una lista entre (0, 10), si el valor es mayor que 5 muestra el resultado.

  • Iteramos sobre una lista entre (0, 10): hacemos un for entre 0 y 10.

  • si el valor es mayor que 5: condición

  • muestra el resultado: operación

for i in range(0, 10): #iteración
    if i > 5: #condición
        print(i) #operación
6
7
8
9

¿Qué tipo de operaciones podemos evaluar? Operaciones lógicas:

  • Igualdad: ==

  • Desigualdad: !=

  • Mayor: >

  • Mayor que: >=

  • Menor: <

  • Menor que: <=

a = 10 
if a==10: 
    x = a
print(x)
10

Operaciones conjuntas con “or” y “and”

if a == 10 and x >= 5: 
    print((a, x))
(10, 10)

Para evaluar varias situaciones vamos a usar if, elif y else.

Ejemplo: Vamos a crear una lista A utilizando valores de una segunda lista B con valores entre 0-10. Vamos a iterar sobre los valores de la lista A y realizar las siguientes operaciones

  • Si el valor está entre 0-3 guardamos ese mismo valor en B

  • Si el valor es mayor que 3 y menor que 5 lo multiplicamos por 2

  • Si el valor es igual a 5 pedir ingresar un valor con la función input()

  • Para todo el resto eleva el número al cuadrado

#1. Creamos las listas
A = np.arange(0, 11, 1)
B = []

#2. Iteramos sobre A
for i in A: 
    #Creamos la primera condición
    if i>=0 and i<= 3: 
        B.append(i)
    #Segunda condición
    elif i > 3 and i<5: 
        B.append(i*2)
    #Tercera condición    
    elif i==5:
        B.append(float(input("Agregar un valor")))
        B.append(input("input 2:"))
    #Para todo el resto
    else: 
        B.append(i**2)
Agregar un valor 10
input 2: 10
print("A:", A)
print("B:", B)
A: [ 0  1  2  3  4  5  6  7  8  9 10]
B: [0, 1, 2, 3, 8, 10.0, '10', 36, 49, 64, 81, 100]
np.zeros(0)
array([], dtype=float64)
x = input("agrega un valor")
type(x)
agrega un valor 1
str
a = 'texto2'
if a != 'texto':
    print("ok")
ok
a = [0, 'x', 3]
for i in range(0, len(a)): 
    print(a[i])
    if i == 0:
        print("ok")
    elif i == 1:
        print("ok2")
        
0
ok
x
ok2
3

4. Crear funciones

Una función es un código que nos permite almacenar una una acción. A la función le damos un nombre y luego la podemos invocar utilizando ese nombre.

Un ejemplo de función es print(), mediante su nombre podemos pedir que muestre una variable, un texto u otro.

Ahora vamos a ver cómo se crea una función.

Sintaxis: “def” + “nombre” + “(input)” + “:”

def miprimerafuncion(a): #declaramos la función y establecemos el input
    b = a*2  #definimos qué hace la función
    return b #Establecemos un output

#definimos el input
a = 10
#llamamos la función
miprimerafuncion(a)
20

podemos evaluar la función con diferentes valores

b = 100
print(miprimerafuncion(b))
print(miprimerafuncion(1000))
200
2000

A una función le podemos dar diferentes input y que entregue variados output

def ejemplo2(a, b): 
    return a*b, a**b
ejemplo2(10,2)
(20, 100)

podemos guardar los valores del output de la función

X, Y = ejemplo2(10,2)
print("X=", X, "Y=", Y)
X= 20 Y= 100

El input puede ser de diferentes types

def ejemplo3(a):
    AA = []
    AA.append(a)
    return AA
C = ejemplo3("hola")
print(C)
['hola']
print(C)
['hola']

Variable local y global

Una variable local va a existir en un lugar específico. Por ejemplo dentro de la función ejemplo3(a) definimos A=[], esta variable A existe sólo dentro de la función ejemplo3(), es decir es una variable local.

Por otro lado, cuando decimos que A = ejemplo3(“hola”) estamos definiendo una vable global, que existe en todo el espacio del Jupyter, una vez definida puede ser llamada en en cualquier parte.

El ejemplo que utilizamos para probar if/ifelse/else lo podemos guardar en una función que le entremos una lista numérica (A) y que retorne una lista B con las operaciones del if

#1. Creamos la función con un input A
def ejemplo4(A):
    #2. Creamos una lista  vacía
    B = []

    #3. Iteramos sobre A
    for i in A: 
        #Creamos la primera condición
        if i>=0 and i<= 3: 
            B.append(i)
        #Segunda condición
        elif i > 3 and i<5: 
            B.append(i*2)
        #Tercera condición
        elif i==5:
            B.append(input("Agregar un valor"))
        #Todo el resto
        else: 
            B.append(i**2)

    #4. Output
    return B
#Creamos una lista entre 0-10
A = np.arange(0, 11, 1)
#Llamamos la función y guardamos el resultado en una variable global
B = ejemplo4(A)
Agregar un valor 1
print("A:", A)
print("B:", B)
A: [ 0  1  2  3  4  5  6  7  8  9 10]
B: [0, 1, 2, 3, 8, '1', 36, 49, 64, 81, 100]

5. Diccionarios

Un diccionario es una estructura que nos permite almacenar información mediante una llave (key) y un valor. Vamos a llamar tupla a esta llave:valor.

Por ejemplo si tenemos una base como

\[\begin{split}\begin{array}{ccc} \text{Nombre} & \text{Edad} & \text{Signo zodiacal} \\ \text{Ana} & 30 & \text{Libra} \\ \text{Félix} & 50 & \text{Sagitario} \end{array} \end{split}\]

Podemos crear dos diccionarios, uno para Ana y otro para Félix del tipo:

  • Ana: {Nombre: Ana, Edad:30, Signo:Libra}

  • Félix: {Nombre:Félix, Edad:50, Signo:Sagitario}

En este caso las llaves son (Nombre, Edad y Signo).

Para crear un diccionario utilizamos “{}”. La sintaxis es “{” + “llave” + “:” + “valor” + “}”

Ana = {'nombre':'ana', 'edad':30, 'signo':'libra'}
Felix = {'nombre':'felix', 'edad':50, 'signo':'sagitario'}

Para acceder a los elementos del diccionario vamos a usar la llave o el valor

print('La edad de Ana es '+ str(Ana['edad']) + ' y su signo es ' + Ana['signo'])
La edad de Ana es 30 y su signo es libra

Vamos a usar las funciones keys(), values() e items() para ver los valores dentro de un diccionario

#Para ver las llaves
Ana.keys()
dict_keys(['nombre', 'edad', 'signo'])
#Para ver los valores
Felix.values()
dict_values(['felix', 50, 'sagitario'])
#Para ver las tuplas (llave, valor)
Felix.items()
dict_items([('nombre', 'felix'), ('edad', 50), ('signo', 'sagitario')])

Actividad en clases (sin nota)

  1. ¿Cómo usamos linspace() y arange()? Muestre un ejemplo de cómo se utiliza y las diferencias.

  2. ¿Cuáles son los símbolos para evaluar igualdad, desigualdad, mayor igual, y menor que?

  3. El siguiente tiene por objetivo tomar información del array A y colocoarla en la lista B. El código tiene 5 errores, encuéntrelos y de una breve explicación del problema. El código tiene cuatro condicionales que hacen lo siguiente:

    • Si i es mayor o igual que 0 y menor o igual que 3, anexa i a la lista B.

    • Si i es mayor que 3 y menor que 5, anexa \(i*2\) a la lista B.

    • Si i es igual a 5, pide un valor (como float), anexarlo a la lista B.

    • Para todo lo demás, agrega a la lista B el valor \(i^2\).

# Descomente el código con ctr+/
# A = np.arange(0, 11, 1)
# B = []

# for i in range(len(A)): 
#     #Creamos la primera condición
#     if i>0 and i<= 3: 
#         B.append(i)
#     #Segunda condición
#     elif i > 3 and i<5: 
#         B.append(A[i]*2)
#     #Tercera condición    
#     elif i==5:
#         B.append((input("Agregar un valor")))
#     #Para todo el resto
#     elseif: 
#         B.append(i**2)
  1. Van a crear una función llamada miprimerafuncion y realizarán los siguiente:

    • En una línea explique la sintaxis de una función.

    • La función debe calcular \(y = x+x^2\). Escriba la función sin un input y que el retorno sea \(y\).

    • Escriba la función anterior pero con un input igual a \(x\). ¿Qué cambia con el caso anterior?

    • ¿Qué debería pasar con la función si ahora queremos calcular \(y=x+x*z+x^2\)?

    • ¿Qué ocurre si colocamos directamente en el retorno \(x + x^2\) versus definir primero \(y=x+x^2\) y retornar \(y\)?

    • Colocar un condicional dentro de la función que evalúe:

      • \(x>0 \Rightarrow y=x+x^2\)

      • \(x<0 \Rightarrow y=\text{abs}(x)+x^2\)

      • \(x=0 \Rightarrow y=0\)

    • ¿Por qué colocamos el condicional dentro de la función y no fuera de la función? Muestre un ejemplo.

  2. Con un diccionario podemos guardar información bajo el formato llave-valor. ¿Qué significa eso?

  3. ¿Podemos crear un diccionario con dos llaves que tengan el mismo nombre? mostrar un ejemplo.

  4. ¿Podemos crear un diccionario con dos valores que sean iguales? mostrar un ejemplo.

  5. ¿Podemos usar un loop para poblar un diccionario? muestre un ejemplo.