Hagamos un repaso de la clase del martes¶
- En la clase estuvimos trabajando con este desafío: necesitamos procesar las notas de los estudiantes de este curso. Queremos saber:
- cuál es el promedio de las notas,
- qué estudiantes están por debajo del promedio.
- Y plantemos este pseudocódigo para la solución:
Ingresar las notas Calcular el promedio Mostar quiénes tienen notas menores al promedio
- Implementamos el primer proceso:
In [1]:
Copied!
def ingreso_notas():
""" Esta función retorna un diccionario con los nombres y notas de estudiantes """
nombre = input("Ingresa un nombre (<FIN> para finalizar)")
dicci = {}
while nombre != "FIN":
nota = int(input(f"Ingresa la nota de {nombre}"))
dicci[nombre] = nota
nombre = input("Ingresa un nombre (<FIN> para finalizar)")
return dicci
notas_de_estudiantes = ingreso_notas()
notas_de_estudiantes
def ingreso_notas():
""" Esta función retorna un diccionario con los nombres y notas de estudiantes """
nombre = input("Ingresa un nombre ( para finalizar)")
dicci = {}
while nombre != "FIN":
nota = int(input(f"Ingresa la nota de {nombre}"))
dicci[nombre] = nota
nombre = input("Ingresa un nombre ( para finalizar)")
return dicci
notas_de_estudiantes = ingreso_notas()
notas_de_estudiantes
Ingresa un nombre (<FIN> para finalizar)Janis Ingresa la nota de Janis10 Ingresa un nombre (<FIN> para finalizar)Bob Ingresa la nota de Bob7 Ingresa un nombre (<FIN> para finalizar)FIN
Out[1]:
{'Janis': 10, 'Bob': 7}
Ahora observemos este código que implementa el segundo proceso:¶
In [2]:
Copied!
def calculo_promedio(notas):
""" Esta función calcula el promedio de las notas recibida por parámetro.
notas: es un diccionario de forma nombre_estudiante: nota
"""
suma = 0
for estu in notas:
suma += notas[estu]
promedio = 0 if len(notas)==0 else suma/len(notas)
return promedio
calculo_promedio(notas_de_estudiantes)
def calculo_promedio(notas):
""" Esta función calcula el promedio de las notas recibida por parámetro.
notas: es un diccionario de forma nombre_estudiante: nota
"""
suma = 0
for estu in notas:
suma += notas[estu]
promedio = 0 if len(notas)==0 else suma/len(notas)
return promedio
calculo_promedio(notas_de_estudiantes)
Out[2]:
8.5
- A diferencia de la función anterior, ésta tiene un parámetro.
- ¿Hay distintas formas de pasar parámetros en Python? ¿Cómo podemos probar esto?
Parámetros en Python¶
- Veamos un ejemplo más sencillo:
In [3]:
Copied!
def modifico_parametro(x):
x = 10
a = 2
modifico_parametro(a)
print(a)
def modifico_parametro(x):
x = 10
a = 2
modifico_parametro(a)
print(a)
2
Y ahora analicemos este otro ejemplo:¶
In [4]:
Copied!
def modifico_parametro1(x):
x[0] = "cero"
lista = [1, 20]
modifico_parametro1(lista)
print(lista)
def modifico_parametro1(x):
x[0] = "cero"
lista = [1, 20]
modifico_parametro1(lista)
print(lista)
['cero', 20]
Entonces, ¿qué podemos decir sobre el pasaje de parámetros en Python?¶
Cuando pasamos un parámetro a una función, pasamos una copia de la referencia al objeto pasado.¶
Analicemos de nuevo los ejemplos anteriores¶
In [5]:
Copied!
def modifico_parametro(x):
x = 10
a = 2
modifico_parametro(a)
print(a)
def modifico_parametro1(x):
x[0] = "cero"
lista = [1, 20]
modifico_parametro1(lista)
print(lista)
def modifico_parametro(x):
x = 10
a = 2
modifico_parametro(a)
print(a)
def modifico_parametro1(x):
x[0] = "cero"
lista = [1, 20]
modifico_parametro1(lista)
print(lista)
2 ['cero', 20]
Ahora miremos este otro ejemplo¶
In [6]:
Copied!
def modifico_lista(x):
y = x[:]
y[0] = "cero"
lista = [1,20]
modifico_lista(lista)
print(lista)
def modifico_lista(x):
y = x[:]
y[0] = "cero"
lista = [1,20]
modifico_lista(lista)
print(lista)
[1, 20]
- ¿Qué pasa en este caso?
- Y si invoco con modifico_lista(lista[:]) sería necesario la primer asignación? ¿Les parece buena esta práctica?
In [7]:
Copied!
def retorno_varios(cadena):
""" ..... """
cadena = cadena.lower()
cant_aeo = cadena.count("a") + cadena.count("e") + cadena.count("o")
cant_iu = cadena.count("i") + cadena.count("u")
return (cant_aeo, cant_iu, len(cadena))
algo = retorno_varios("Seminario de Python")
type(algo)
def retorno_varios(cadena):
""" ..... """
cadena = cadena.lower()
cant_aeo = cadena.count("a") + cadena.count("e") + cadena.count("o")
cant_iu = cadena.count("i") + cadena.count("u")
return (cant_aeo, cant_iu, len(cadena))
algo = retorno_varios("Seminario de Python")
type(algo)
Out[7]:
tuple
¿Cómo accedemos a los valores retornados?¶
- En el return se devuelve una tupla, por lo tanto, accedemos como en cualquier tupla:
In [8]:
Copied!
vocales_abiertas = retorno_varios("Seminario de Python")[0]
vocales_abiertas
vocales_abiertas = retorno_varios("Seminario de Python")[0]
vocales_abiertas
Out[8]:
5
In [9]:
Copied!
abiertas, cerradas, longitud = retorno_varios("Este video va a ser corto")
cerradas
abiertas, cerradas, longitud = retorno_varios("Este video va a ser corto")
cerradas
Out[9]:
1
Los parámetros en Python pueden tener valores por defecto¶
In [10]:
Copied!
def mi_musica(dicci_musica, nombre, tipo_musica="nacional"):
""" .... """
if nombre in dicci_musica:
interpretes = dicci_musica[nombre]
for elem in interpretes[tipo_musica]:
print(elem)
else:
print(f"¡Hola {nombre}! No tenés registrada música en esta colección")
dicci_musica = {"clau": {"internacional": ["AC/DC", "Led Zeppelin", "Bruce Springsteen"],
"nacional": ["Pappo", "Miguel Mateos", "Los Piojos", "Nonpalidece"]
},
"vivi": {"internacional": ["Ricky Martin", "Maluma", "Madona"],
"nacional": ["Lali"]}
}
mi_musica(dicci_musica, "vivi", "internacional")
def mi_musica(dicci_musica, nombre, tipo_musica="nacional"):
""" .... """
if nombre in dicci_musica:
interpretes = dicci_musica[nombre]
for elem in interpretes[tipo_musica]:
print(elem)
else:
print(f"¡Hola {nombre}! No tenés registrada música en esta colección")
dicci_musica = {"clau": {"internacional": ["AC/DC", "Led Zeppelin", "Bruce Springsteen"],
"nacional": ["Pappo", "Miguel Mateos", "Los Piojos", "Nonpalidece"]
},
"vivi": {"internacional": ["Ricky Martin", "Maluma", "Madona"],
"nacional": ["Lali"]}
}
mi_musica(dicci_musica, "vivi", "internacional")
Ricky Martin Maluma Madona
Si hay más de un argumento, los que tienen valores por defecto siempre van al final de la lista de parámetros.
Los parámetros formales y reales se asocian de acuerdo al orden posicional, pero invocar a la función con los parámetros en otro orden pero nombrando al parámetro.
In [11]:
Copied!
def mi_musica(dicci_musica, nombre, tipo_musica="nacional"):
if nombre in dicci_musica:
interpretes = dicci_musica[nombre]
for elem in interpretes[tipo_musica]:
print(elem)
else:
print(f"¡Hola {nombre}! No tenés registrada música en esta colección")
mi_musica(nombre="vivi", tipo_musica="internacional", dicci_musica=dicci_musica )
def mi_musica(dicci_musica, nombre, tipo_musica="nacional"):
if nombre in dicci_musica:
interpretes = dicci_musica[nombre]
for elem in interpretes[tipo_musica]:
print(elem)
else:
print(f"¡Hola {nombre}! No tenés registrada música en esta colección")
mi_musica(nombre="vivi", tipo_musica="internacional", dicci_musica=dicci_musica )
Ricky Martin Maluma Madona
Obervemos con atención este código¶
In [12]:
Copied!
def agrego(a, L=[]):
L.append(a)
return L
print(agrego(1))
print(agrego(2))
print(agrego(3))
def agrego(a, L=[]):
L.append(a)
return L
print(agrego(1))
print(agrego(2))
print(agrego(3))
[1] [1, 2] [1, 2, 3]
IMPORTANTE: los valores por defecto se evalúan UNA ÚNICA VEZ en la definición de la función.¶
Veamos otro tipo predefinido de Python¶
Conjuntos en Python¶
- Un conjunto es una colección de datos heterogéna, desordenada, NO indexada y sin elementos duplicados.
In [13]:
Copied!
bandas = {"AC/DC", "Metallica", "Greta Van Fleet", "Soda Stéreo", "Los Piojos"}
print(bandas)
bandas = {"AC/DC", "Metallica", "Greta Van Fleet", "Soda Stéreo", "Los Piojos"}
print(bandas)
{'Soda Stéreo', 'AC/DC', 'Los Piojos', 'Metallica', 'Greta Van Fleet'}
In [15]:
Copied!
bandas_nacionales = set(("Soda Stéreo", "La Renga"))
bandas_nacionales
bandas_internacionales = set(["Greta Van Fleet", "Led Zeppelin"])
bandas_internacionales
bandas_nacionales = set(("Soda Stéreo", "La Renga"))
bandas_nacionales
bandas_internacionales = set(["Greta Van Fleet", "Led Zeppelin"])
bandas_internacionales
Out[15]:
{'Greta Van Fleet', 'Led Zeppelin'}
In [14]:
Copied!
letras = set("alabanza")
letras
letras = set("alabanza")
letras
Out[14]:
{'a', 'b', 'l', 'n', 'z'}
No confundir¶
In [16]:
Copied!
dicci = {}
conjunto = set()
type(conjunto)
dicci = {}
conjunto = set()
type(conjunto)
Out[16]:
set
In [18]:
Copied!
c1 = {'alabanza'}
c2 = set('alabanza')
print(c1)
print(c2)
c1 = {'alabanza'}
c2 = set('alabanza')
print(c1)
print(c2)
{'alabanza'} {'l', 'n', 'z', 'a', 'b'}
¿Cómo recorremos un conjunto?¶
In [19]:
Copied!
bandas = {"AC/DC", "Metallica", "Greta Van Fleet", "Soda Stéreo", "Los Piojos"}
for elem in bandas:
print(elem)
bandas = {"AC/DC", "Metallica", "Greta Van Fleet", "Soda Stéreo", "Los Piojos"}
for elem in bandas:
print(elem)
Soda Stéreo AC/DC Los Piojos Metallica Greta Van Fleet
Y, ¿cómo sabemos la cantidad de elementos de un conjunto?¶
In [20]:
Copied!
len(bandas)
c2 = set('alabanzas')
len(c2)
len(bandas)
c2 = set('alabanzas')
len(c2)
Out[20]:
6
Operaciones con conjuntos¶
- Pensemos en las operaciones matemáticas sobre conjuntos:
- in: retonar si un elemento pertenece o no a un conjunto.
- |: unión entre dos conjuntos.
- &: intersección entre dos conjuntos.
- -: diferencia de conjuntos.
In [21]:
Copied!
bandas = {"AC/DC", "Metallica", "Greta Van Fleet", "Soda Stéreo", "Los Piojos"}
bandas_nacionales = set(("Soda Stéreo", "La Renga", "Los Piojos"))
print("Foo Fighters" in bandas)
todos = bandas | bandas_nacionales
print(todos)
en_ambos = bandas & bandas_nacionales
print(en_ambos)
solo_en_1 = bandas - bandas_nacionales
print(solo_en_1)
bandas = {"AC/DC", "Metallica", "Greta Van Fleet", "Soda Stéreo", "Los Piojos"}
bandas_nacionales = set(("Soda Stéreo", "La Renga", "Los Piojos"))
print("Foo Fighters" in bandas)
todos = bandas | bandas_nacionales
print(todos)
en_ambos = bandas & bandas_nacionales
print(en_ambos)
solo_en_1 = bandas - bandas_nacionales
print(solo_en_1)
False {'La Renga', 'Soda Stéreo', 'AC/DC', 'Los Piojos', 'Metallica', 'Greta Van Fleet'} {'Soda Stéreo', 'Los Piojos'} {'AC/DC', 'Metallica', 'Greta Van Fleet'}
También hay métodos que se pueden utilizar¶
- Para copiar conjuntos podemos usar la sentencia de asignación o usando copy().
- Se puede adicionar un elemento con add().
In [26]:
Copied!
bandas = {"AC/DC", "Metallica", "Greta Van Fleet", "Soda Stéreo", "Los Piojos"}
bandas_nacionales = set(("Soda Stéreo", "La Renga", "Los Piojos"))
mis_bandas = bandas
#mis_bandas = bandas.copy()
print(id(mis_bandas))
print(id(bandas))
bandas.add("Foo Fighters")
print(mis_bandas)
bandas = {"AC/DC", "Metallica", "Greta Van Fleet", "Soda Stéreo", "Los Piojos"}
bandas_nacionales = set(("Soda Stéreo", "La Renga", "Los Piojos"))
mis_bandas = bandas
#mis_bandas = bandas.copy()
print(id(mis_bandas))
print(id(bandas))
bandas.add("Foo Fighters")
print(mis_bandas)
140227264541664 140227264541664 {'Foo Fighters', 'Soda Stéreo', 'AC/DC', 'Los Piojos', 'Metallica', 'Greta Van Fleet'}
Probar en casa otros métodos¶
- issubset(), isdisjoint(), issuperset(), update(), discard(), remove()
- + Info en Real Python
- + Info en w3schools
- + Info en el sitio oficial