Introducción lenguaje Python doc 1
Introducción lenguaje Python doc 1
Codificación
Consiste en llevar un algoritmo a un lenguaje de programación que permita la interacción
con el computador. Para llegar a éste objetivo una vez construido el algoritmo, se debe
pasar por las etapas de diseño, en donde se incluye la modularización, el diseño de
entradas y salidas y el diseño de operación del programa.
Para adelantar este proceso se va a utilizar el lenguaje Python, para lo cual se hace una
introducción de las características de este lenguaje.
¿cómo entiende una máquina lo que tiene que hacer si le pasamos un programa
hecho en Python (o cualquier otro lenguaje de alto nivel)? La respuesta es un compilador
Los compiladores son programas que convierten un lenguaje «cualquiera» en código
máquina.
Se pueden ver como traductores, permitiendo a la máquina interpretar lo que queremos
hacer
Python es un intérprete en vez de un compilador, pero el efecto es prácticamente lo
mismo. La diferencia está en que el intérprete realiza la «compilación» (interpretación) y la
«ejecución» de una vez, mientras que el compilador genera un formato «ejecutable»
(código objeto) que se ejecuta en otra fase posterior
Hitos en la computación
Luego los avances en las ciencias informáticas han sido muy acelerados, se
reemplazaron los tubos de vacío por transistores en 1958 y en el mismo año, se
sustituyeron por circuitos integrados, y en 1961 se miniaturizaron en chips de silicio. En
1971 apareció el primer microprocesador de Intel; y en 1973 el primer sistema operativo
CP/M. El primer computador personal es comercializado por IBM en el año 1980.
Tipos de datos
Los programas están formados por código y datos. Pero a nivel interno de la memoria
del ordenador no son más que una secuencia de bits. La interpretación de estos bits
depende del lenguaje de programación, que almacena en la memoria no sólo el puro dato
sino distintos metadatos.
Cada «trozo» de memoria contiene realmente un objeto, de ahí que se diga que en
Python todo son objetos. Y cada objeto tiene, al menos, los siguientes campos:
• Un tipo del dato almacenado.
• Un identificador único para distinguirlo de otros objetos.
• Un valor consistente con su tipo.
Variables
Las variables son fundamentales ya que permiten definir nombres para los valores que
tenemos en memoria y que vamos a usar en nuestro programa.
Definición de variables
Nombre=valor
Palabras reservadas
Ejemplos de variables
Se recomienda que sean en inglés para que el código sea más universal
Ejemplo
Para números de canciones
num_songs
Constantes
Ejemplos variables
Los nombres van a depender del contexto del problema que estemos tratando.
Como regla general:
Asignación de variables
Nombre= Expresión.
total_population = 157503
avg_temperature = 16.8
city_name = ‘San Cristóbal de La Laguna’
SOUND_SPEED = 343.2
WATER_DENSITY = 997
EARTH_NAME = ‘La Tierra’
En este caso las tres variables utilizadas en el «lado izquierdo» tomarán el valor 3.
Hemos visto previamente cómo asignar un valor a una variable, pero aún no sabemos
cómo «comprobar» el valor que tiene dicha variable. Para ello podemos utilizar dos
estrategias:
1. Si estamos en una «shell» de Python, basta con que usemos el nombre de la variable:
>>> final_stock = 38934
>>> final_stock
38934
>>> type(9)
<class ‘int’>
>>> type(1.2)
<class ‘float’>
>>> height = 3718
>>> type(height)
<class ‘int’>
>>> sound_speed = 343.2
>>> type(sound_speed)
<class ‘float’>
con editor
print(type(9))
<class ‘int’>
Print( type(1.2))
<class ‘float’>
height = 3718
print( type(height))
<class ‘int’>
sound_speed = 343.2
print(type(sound_speed))
>>> a = 7
>>> id(a)
4310690288
Con editor
a=7
print (‘dirección -> ‘,id(a))
dirección -> 4310690288
Manejo de números
Ejemplos
Con editor
is_opened = True
print( is_opened)
True
has_sugar = False
print(has_sugar)
False
Tener cuidado con la primera letra de True y False, deben ser mayúsculas
Literales enteros
Con editor
num=3_000_000
print(num)
salida
3000000
>>> 2 ** 2 + 4 / 2
6.0
>>> 2 ** (2 + 4) / 2
32.0
Asignación aumentada
a = a + 10
Asignación aumentada
a += 10
Tradicional
a=a*4
Aumentada
a*=4
Ejemplos
>>> random_number = 15
>>> random_number += 5
>>> random_number
20
>>> random_number *= 3
>>> random_number
60
>>> random_number //= 4
>>> random_number
15
>>> random_number **= 1
>>> random_number
15
Valor absoluto
Límite de un entero
El limite de un entero es de cualquier tamaño.
Ejemplo, supongamos que queremos representar un centillón. Este valor viene a ser un
«1» seguido por ¡600 ceros! ¿Será capaz Python de almacenarlo?
>>> centillion = 10 ** 600
>>> centillion
100000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000 ……
Flotantes
Los números en punto flotante3 tienen parte decimal. Veamos algunos ejemplos de
flotantes en Python.
>>> True + 25
26
>>> 7 * False
0
>>> True + False
1
>>> 21.8 + True
22.8
>>> 10 + 11.3
21.3
La siguiente tabla muestra las conversiones cuando se trabaja con tipo bool y números
Conversión explícita
Existen una serie de funciones para realizar conversiones explícitas de un tipo a otro:
En el caso de que usemos la función int() sobre un valor flotante, nos retorna su parte
𝑖𝑛𝑡(25.5) =25
baja:
>>> pi = 3.14159265359
>>> round(pi)
3
>>> round(pi, 1)
3.1
>>> round(pi, 2)
3.14
>>> round(pi, 3)
3.142
>>> round(pi, 4)
3.1416
>>> round(pi, 5)
3.14159
Nota: round() aproxima al valor más cercano, mientras que int() obtiene siempre
el entero «por abajo».
Límite de un flotante
A diferencia de los enteros, los números flotantes sí que tienen un límite en Python. Para
descubrirlo podemos ejecutar el siguiente código:
>>> sys.float_info.min
2.2250738585072014e-308
>>> sys.float_info.max
1.7976931348623157e+308
Bases
3.2.4 Bases
Los valores numéricos con los que estamos acostumbrados a trabajar están en base 10
(o decimal). Esto indica que disponemos de 10 «símbolos» para representar las
cantidades. En este caso del 0 al 9.
Pero también es posible representar números en otras bases. Python nos ofrece una
serie de prefijos y funciones para este cometido.
Base binaria
Cuenta con 2 símbolos para representar los valores: 0 y 1.
Prefijo: 0b
>>> 0b1001
9
>>> 0b1100
12
Función: bin()
>>> bin(9)
‘0b1001’
>>> bin(12)
‘0b1100’
Base octal
Cuenta con 8 símbolos para representar los valores: 0, 1, 2, 3, 4, 5, 6 y 7.
Prefijo: 0o
>>> 0o6243
3235
>>> 0o1257
687
Función: oct()
>>> oct(3235)
‘0o6243’
>>> oct(687)
‘0o1257’
Base hexadecimal
Cuenta con 16 símbolos para representar los valores: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D,
E y F.
Prefijo: 0x
>>> 0x7F2A
32554
>>> 0x48FF
18687
Función: hex()
>>> hex(32554)
‘0x7f2a’
>>> hex(18687)
‘0x48ff’
Cadenas de texto
Las cadenas de texto son secuencias de caracteres. También se les conoce como
«strings» y nos permiten almacenar información textual de forma muy cómoda.
Es importante destacar que Python 3 almacena los caracteres codificados en el estándar
Unicode, lo que es una gran ventaja con respecto a versiones antiguas del lenguaje.
Creando «strings»
Para escribir una cadena de texto en Python basta con rodear los caracteres con comillas
simples:
>>> ‘Mi primera cadena en Python’
‘Mi primera cadena en Python’
Para incluir comillas dobles dentro de la cadena de texto no hay mayor inconveniente:
>>> ‘Los llamados "strings" son secuencias de caracteres’
‘Los llamados "strings" son secuencias de caracteres’
Conversión
Podemos crear «strings» a partir de otros tipos de datos usando la función str():
>>> str(True)
‘True’
>>> str(10)
‘10’
>>> str(21.7)
‘21.7’
Para el caso contrario de convertir un «string» a un valor numérico, tenemos a disposición
las funciones ya vistas:
>>> int(‘10’)
10
>>> float(‘21.7’)
21.7
Pero hay que tener en cuenta un detalle. La función int() también admite la base en la
que se encuentra el número. Eso significa que podemos pasar un número, por ejemplo,
en hexadecimal (como «string») y lo podríamos convertir a su valor entero:
>>> int(‘FF’, 16)
255
Nota: La base por defecto que utiliza int() para convertir cadenas de texto es la base
decimal.
Secuencias de escape
Python permite escapar el significado de algunos caracteres para conseguir otros
resultados.
Si escribimos una barra invertida \ antes del carácter en cuestión, le otorgamos un
significado especial.
Quizás la secuencia de escape más conocida es \n que representa un salto de línea, pero
existen muchas otras:
# Salto de línea
>>> msg = ‘Primera línea\nSegunda línea\nTercera línea’
>>> print(msg)
Primera línea
Segunda línea
Tercera linea
# Tabulador
>>> msg = ‘Valor = \t40’
>>> print(msg)
Valor = 40
# Comilla simple
>>> msg = ‘Necesitamos \’escapar\’ la comilla simple’
>>> print(msg)
Necesitamos ‘escapar’ la comilla simple
# Barra invertida
>>> msg = ‘Capítulo \\ Sección \\ Encabezado’
>>> print(msg)
Capítulo \ Sección \ Encabezado
Nota: Al utilizar la función print() es cuando vemos realmente el resultado de utilizar los
caracteres escapados.
Python también nos ofrece la posibilidad de leer la información introducida por teclado.
Para ello se utiliza la función input():
Nota: La función input() siempre devuelve un objeto de tipo cadena de texto o str.
Tenerlo muy en cuenta a la hora de trabajar con números, ya que debemos realizar una
conversión explícita.
Ejemplo
Combinar cadenas
Podemos combinar dos o más cadenas de texto utilizando el operador +:
>>> proverb1 = ‘Cuando el río suena’
>>> proverb2 = ‘agua lleva’
>>> proverb1 + proverb2
‘Cuando el río suenaagua lleva’
>>> proverb1 + ‘, ‘ + proverb2 # incluimos una coma
‘Cuando el río suena, agua lleva’
Repetir cadenas
Podemos repetir dos o más cadenas de texto utilizando el operador *:
>>> reaction = ‘Wow’
>>> reaction * 4
‘WowWowWowWow’
Obtener un carácter
Los «strings» están indexados y cada carácter tiene su propia posición. Para obtener un
único carácter dentro de una cadena de texto es necesario especificar su índice dentro de
corchetes [...].
Las cadenas de texto son tipos de datos inmutables. Es por ello que no podemos
modificar un carácter directamente:
Importante: El troceado siempre llega a una unidad menos del índice final que hayamos
especificado. Sin embargo el comienzo sí coincide con el que hemos puesto.
Control de flujo
Normalmente el control de flujo se hace en forma secuencial de arriba hacia abajo, pero
hay acciones que hacen que este comportamiento no se dé. Las siguientes instrucciones
que presentan este comportamiento son las siguientes;
Condicionales
En esta sección veremos las sentencias if y match-case junto a las distintas variantes
que pueden asumir, pero antes de eso introduciremos algunas cuestiones generales de
escritura de código
Definición de bloques
A diferencia de otros lenguajes que utilizan llaves para definir los bloques de código,
en Python los bloques de código se definen a través de espacios en blanco,
preferiblemente 4. En términos técnicos se habla del tamaño de indentación
Comentarios
Los comentarios son anotaciones que se pueden incluir en el programa y que permiten
aclarar ciertos aspectos del código. Estas indicaciones son ignoradas por el intérprete de
Python.
Los comentarios se incluyen usando el símbolo almohadilla # y comprenden hasta el final
de la línea.
Comentario en bloque
#Esto es un comentario para clarificar acciones
Comentario en línea
stock = cantidad_minima #determina cantidad mínima en bodega
La sentencia if
La sentencia condicional en Python (al igual que en muchos otros lenguajes de
programación) es if. En su escritura debemos añadir una expresión de comparación
terminando con dos puntos al final de la línea. Veamos un ejemplo
Formato
If condición:
Acciones por verdadero
[else:
Acciones por falso]
>>> temperature = 20
Parámetros normales
Decisiones anidadas
>>> temperature = 28
>>> if temperature < 20:
... if temperature < 10:
... print(‘Nivel azul’)
... else:
... print(‘Nivel verde’)
... else:
... if temperature < 30:
... print(‘Nivel naranja’)
... else:
print(‘Nivel rojo’)
Nivel naranja
Python nos ofrece una mejora en la escritura de condiciones anidadas cuando aparecen
consecutivamente un else y un if. Podemos sustituirlos por la sentencia elif:
>>> temperature = 28
>>> if temperature < 20:
... if temperature < 10:
... print(‘Nivel azul’)
... else:
... print(‘Nivel verde’)
... elif temperature < 30:
... print(‘Nivel naranja’)
... else:
... print(‘Nivel rojo’)
...
Nivel naranja
Operadores de comparación
Ejemplos con lo operadores
Operadores lógicos
• and
• or
• not
Ejemplo
# Asignación de valor inicial
>>> x = 8
>>> x > 4 or x > 12 # True or False
True
>>> x < 4 or x > 12 # False or False
False
>>> x > 4 and x > 12 # True and False
False
True
Para determinar el resultado de una expresión lógica se deben tener bien claro las tablas
de decisión.
Python a diferencia de otros lenguajes, ofrece la posibilidad de ver si un valor está entre
dos límites de manera directa. Así, por ejemplo, para descubrir si value está entre 4 y 12
haríamos:
>>> 4 <= value <= 12
True
>>> x=8
«Booleanos» en condiciones
Cuando queremos preguntar por la veracidad de una determinada variable «booleana»
en una condición, la primera aproximación que parece razonable es la siguiente:
>>> is_cold = True
>>> if is_cold == True:
... print(‘Coge chaqueta’)
... else:
... print(‘Usa camiseta’)
...
Coge chaqueta
Pero podemos simplificar esta condición tal que así:
>>> if is_cold:
... print(‘Coge chaqueta’)
... else:
... print(‘Usa camiseta’)
...
Coge chaqueta
Ciclos o bucles
sentencia while.
Formato
while condición:
acciones dentro del ciclo
Mientras la condición sea verdadera realice las acciones dentro del ciclo
Veamos un sencillo bucle que muestra por pantalla los números del 1 al 4:
>>> value = 1
>>> while value <= 4:
... print(value)
... value += 1
...
1
2
3
4
Cuando se encuentra la sentencia break se sale del ciclo porque la condición se vuelve
falsa
Ejemplo: buscar un número múltiplo de 3 desde 20 hasta 1. Cuando encuentre el primer
multiplo de 3 salir del bucle.
>>> num = 20
>>> while num >= 1:
... if num % 3 == 0:
... print(num)
... break
... num -= 1
...
18
Continuar un bucle
Saltar adelante hacia la siguiente repetición.
Sentencia continue.
Cuando dentro de las instrucciones se encuentran la sentencia continue, el control de
ejecución regresa a evaluar la condición del ciclo, saltándose las acciones que faltaran en
la iteración.
En resumen, se descartar el resto del código del ciclo y salta a la siguiente iteración.
>>> num = 21
>>> while num >= 1:
... num -= 1
... if num % 3 == 0:
... continue
... print(num, end=’, ‘) # Evitar salto de línea
...
20, 19, 17, 16, 14, 13, 11, 10, 8, 7, 5, 4, 2, 1,
Bucles infinitos
Cuando no se controla bien la condición o no se cumple adecuadamente dentro de las
instrucciones a repetirse la posibilidad de volver la condición falsa entonces se genera un
bucle infinito
Ejemplo
>>> num = 1
>>> while num != 10:
... num += 2
...
El problema que surge es que la variable num toma los valores 1, 3, 5, 7, 9, 11, ..
. por lo que nunca se cumple la condición de parada del bucle. Esto hace que se repita la
ejecución
Una posible solución a este error es reescribir la condición de parada en el bucle:
>>> num = 1
>>> while num < 10:
... num += 2
...
Hay veces en que la condición se la puede reemplazar con True y dentro del ciclo forzar
la salida.
Ejemplo
>>>while True:
... mark = float(input(‘Introduzca nueva nota: ‘))
... if not(0 <= mark <= 10):
... print(´Nota fuera de rango’)
... break
... print(mark)
...
Ejecución
Introduzca nueva nota: 5
5.0
Introduzca nueva nota: 3
3.0
Introduzca nueva nota: 11
Nota fuera de rango
La sentencia for
Python permite recorrer aquellos tipos de datos que sean iterables, es decir, que admitan
ser recorridas, utilizando la sentencia for.
Algunos ejemplos de tipos y estructuras de datos que permiten ser iteradas (recorridas)
son: cadenas de texto, listas, diccionarios, ficheros, etc.
letter toma en cada iteración una de las letras que existen en word, porque una cadena de
texto está formada por elementos que son caracteres e internamente cada carácter tiene
un índice asociado (contador 0…tam-1).
Secuencias de números
Es muy habitual hacer uso de secuencias de números en bucles. Python no tiene una
instrucción específica para ello. Lo que sí aporta es una función range() que devuelve un
flujo de números en el rango especificado. Una de las grandes ventajas es que la «lista»
generada no se construye explícitamente, sino que cada valor se genera bajo demanda.
Esta técnica mejora el consumo de recursos, especialmente en términos de memoria.
Rango: [0, 1, 2]
Utilización de variable
>>> c=4
>>> for i in range(c): # No hace falta indicar el inicio si es 0
... print(i)
...
0
1
2
3
Rango: [1, 3, 5]
Variación de -1
Rango: [2, 1, 0]
Bucles anidados
Estructuras de datos
Listas
>>> empty_list = []
>>> languages = [‘Python’, ‘Ruby’, ‘Javascript’]
>>> fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]
>>> data = [‘Tenerife’, {‘cielo’: ‘limpio’, ‘temp’: 24}, 3718, (28.2933947, -16.
˓→5226597)]
Nota: Una lista puede contener tipos de datos heterogéneos, lo que la hace una
estructura de datos muy versátil.
[‘P’, ‘y’,’t’,’h’,’o’,’n’]
Podemos extender este comportamiento a cualquier otro tipo de datos que permita
ser iterado (iterables).
Combinación de range() con list(). Obtener una lista explícita con los valores que
constituyen el rango [0, 9]:
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Lista vacía
Existe una manera particular de usar list() y es no pasarle ningún argumento.
vacía:
>>> list()
[]
Para crear una lista vacía, se suele recomendar el uso de [] frente a list(), mejor
rendimiento en tiempos de ejecución.
El índice tiene que estar comprendido entre los límites de la misma. Si no es así,
hay un error (excepción):
>>> shopping[-5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> shopping[:3]
[‘Agua‘, ‘Huevos‘, ‘Aceite‘]
>>> shopping[2:4]
[‘Aceite‘, ‘Sal‘]
>>> shopping[-1:-4:-1]
[‘Limón‘, ‘Sal‘, ‘Aceite‘]
>>> shopping
shopping = [‘Agua‘, ‘Huevos‘, ‘Aceite‘, ‘Sal‘, ‘Limón‘]
>>> shopping[10:]
[]
>>> shopping[-100:2]
[‘Agua’, ‘Huevos’]
>>> shopping[2:100]
[‘Aceite’, ‘Sal’, ‘Limón’]
>>> shopping[::-1]
[‘Limón‘, ‘Sal‘, ‘Aceite‘, ‘Huevos‘, ‘Agua‘]
>>> shopping
[‘Agua‘, ‘Huevos‘, ‘Aceite‘, ‘Sal‘, ‘Limón‘]
>>> list(reversed(shopping))
[‘Limón‘, ‘Sal‘, ‘Aceite‘, ‘Huevos‘, ‘Agua‘]
>>> shopping.reverse()
>>> shopping
[‘Limón‘, ‘Sal‘, ‘Aceite‘, ‘Huevos‘, ‘Agua‘]
Una de las operaciones más utilizadas en listas es añadir elementos al final de las
mismas.
Para ello Python nos ofrece la función append(). Se trata de un método destructivo
que modifica la lista original:
>>> even_numbers = []
>>> for i in range(20):
... if i % 2 == 0:
... even_numbers.append(i)
...
>>> even_numbers
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
En la función insert() no hay un error si el índice no está dentro de los límites, los
ajusta a la lista
Repetir elementos
Al igual que con las cadenas de texto, el operador * nos permite repetir los
elementos de una
lista:
>>> shopping = [‘Agua’, ‘Huevos’, ‘Aceite’]
>>> shopping * 3
[‘Agua’,
‘Huevos’,
‘Aceite’,
‘Agua’,
‘Huevos’,
‘Aceite’,
‘Agua’,
‘Huevos’,
‘Aceite’]
Combinar listas
Python nos ofrece dos aproximaciones para combinar listas:
El motivo es que extend() «recorre» (o itera) sobre cada uno de los elementos del
objeto en cuestión. En el caso anterior, al ser una cadena de texto, está formada
por caracteres.
Se podría pensar en el uso de append() para combinar listas. La realidad es que
no funciona exactamente como esperamos; la segunda lista se añadiría como una
sublista de la principal:
Por su índice (con extracción): Las dos funciones anteriores del() y remove()
efectivamente borran el elemento indicado de la lista, pero no «devuelven» nada.
Sin embargo, Python nos ofrece la función pop() que además de borrar, nos
«recupera» el elemento; algo así como una extracción. Lo podemos ver como una
combinación de acceso + borrado:
>>> shopping.pop(2)
‘Aceite’
>>> shopping
[‘Agua’, ‘Huevos’, ‘Sal’]
Nota: Si se usa la función pop() sin pasarle ningún argumento, por defecto usará
el índice -1, es decir, el último elemento de la lista. Pero también podemos
indicarle el índice del elemento a extraer.
Python nos ofrece, al menos, dos formas para borrar una lista por completo:
1. Utilizando la función clear():
>>> shopping = [‘Agua’, ‘Huevos’, ‘Aceite’, ‘Sal’, ‘Limón’]
>>> shopping.clear() # Borrado in-situ
>>> shopping
[]
2. «Reinicializando» la lista a vacío con []:
pertenencia de un elemento
Si se quiere comprobar la existencia de un determinado elemento en una lista,
podríamos buscar su índice, o utilizar el operador in:
>>> shopping = [‘Agua’, ‘Huevos’, ‘Aceite’, ‘Sal’, ‘Limón’]
>>> ‘Aceite’ in shopping
True
>>> ‘Pollo’ in shopping
False
Nota: El operador in siempre devuelve un valor booleano, es decir, verdadero o
falso.
Número de ocurrencias
Para contar cuántas veces aparece un determinado valor dentro de una lista
podemos usar la función count():
>>> sheldon_greeting = [‘Penny’, ‘Penny’, ‘Penny’]
>>> sheldon_greeting.count(‘Howard’)
0
Ordenar una lista
Python proporciona, al menos, dos formas de ordenar los elementos de una lista:
Conservando lista original: Mediante la función sorted() que devuelve una nueva
lista ordenada:
>>> shopping = [‘Agua’, ‘Huevos’, ‘Aceite’, ‘Sal’, ‘Limón’]
>>> sorted(shopping)
[‘Aceite’, ‘Agua’, ‘Huevos’, ‘Limón’, ‘Sal’]
Modificando la lista original: Mediante la función sort():
>>> shopping = [‘Agua’, ‘Huevos’, ‘Aceite’, ‘Sal’, ‘Limón’]
>>> shopping.sort()
>>> shopping
[‘Aceite’, ‘Agua’, ‘Huevos’, ‘Limón’, ‘Sal’]
Ejemplo
Cantidad de datos 8
Datos
[7,2,7,3,2,4,2,7]
Resultado
[7,2,3,4]
Resultado ascendente
[2,3,4,7]
Resultado descendente
[7,4,3,2]
for i in range(len(l1)):
b=l1[i] in l2 #en b se determina si el dato l1[i] está en lista l2
if b==False:
l2.append(l1[i])
l2.sort()
l2.sort(reverse=True)
print('lista sin repetidos ordenada descendentemente \n',l2)
Ejercicio 2
Se tiene una lista con enteros repetidos, determinar cuantas veces aparece cada dato en
la lista.
En este ejercicio, no se van a leer los datos desde el teclado, ya están definidos. Si se lo
quiere generalizar se llenan los datos desde el teclado
Ejemplo
lista=[7,2,7,3,2,4,2,7]
Resultado
7 4 veces
2 3 veces
3 1 veces
4 1 veces
l1=[7,2,7,3,2,4,2,7]
l2=[] # esta lista va a controlar los que se van contado
for i in range(len(l1)):
b=l1[i] in l2 #determina en b si l1[i] está en la lista l2
if b==False:
c=l1.count(l1[i]) #se cuenta las veces que aparece l1[i] en l1
# muestra el dato y su cuenta
print('dato ',l1[i], 'esta ',c,' veces')
l2.append(l1[i]) # se adiciona en l2 para indicar que ya se contó
Ejercicio 3
Se tiene una lista con datos numéricos, eliminar los números pares de la lista.
La lista se la define
Ejemplo
[7,2,7,3,2,4,2,7]
Resultado
[7,7,3,7]
l1=[7,2,7,3,2,4,2,7]
i=0
while i<len(l1):
if l1[i]%2==0:
del(l1[i])
else:
i=i+1
print('Lista resultante \n',l1)
Ejercicio 4
Se tiene una lista con datos numéricos ordenada ascendentemente, insertar un nuevo
dato en la posición que le corresponde de forma tal que siga ordenada. No aplicar método
de ordenamiento.
Ejemplo.
Lista inicial
[4,4,15,20,20,25,30]
Dato a insertar
28
Lista resultante
[4,4,15,20,20,25,28,30]
Pasos genéricos
Ejercicio 5.
Se tiene una cantidad de datos dada que entran desde el teclado. Llenarlos en una lista,
de forma tal que al entrar vayan quedando ordenados ascendentemente. (ordenamiento
por inserción)
Ejemplo
7 datos
9 4 6 2 14 3 1
Después de entrado los datos, la lista queda
[1, 2, 3, 4, 6, 9, 14]
Para este ejercicio se utiliza la lógica del anterior. Los pasos genéricos son los siguientes
Ejercicio 6
Se tiene una lista con una cantidad de números. Buscar un dato dado en la lista y su
posición.
Anotaciones
Para este ejercicio se hace uso de la función index() la cual entrega la ubicación de un
elemento dentro de la lista solo si existe en la lista, si no existe el programa cancela, por
lo que se debe combinar este ejercicio preguntando primero si el dato se encuentra en la
lista (acción in) , si existe se obtiene con seguridad de no cancelar el índice.
Ejemplo
Dato a buscar 10
R/ 10 se encuentra en la posición 4
Pasos genéricos
Definir lista
Leer dato a buscar
Determinar si dato se encuentra en la lista
Si dato se encuentra en la lista obtener índice
Mostrar ubicación del dato
Sino se encuentra mostrar resultado
Ejemplo
[7,4,2,9,7,4,4,7,4,2,9]
Este ejercicio es el complemento del ejercicio que cuenta las veces que se repiten los
datos, en donde se lleva un contador del dato que no se ha contado. Por lo tanto se debe
controlar los datos contados en una lista.
Pasos genéricos
datos=[7,4,2,9,7,4,4,7,4,2,9]
contados=[]
b1=0
for i in range(len(datos)):
b=datos[i] in contados #determina si l1[i] está en la lista l2
if b==False:
c=datos.count(datos[i])
if b1==0:
mayor=c
datomay=datos[i]
b1=1
else:
if c>mayor:
mayor=c
datomay=datos[i]
#determinar dato como contado
contados.append(datos[i])
print('Dato que mas se repite -> ',datomay,' veces que se repite ->',mayor)
Ejercicio 8
Se tienen dos listas con datos numéricos formar una tercera lista con los pares no
comunes sin repetidos
Ejemplo
l1=[4,2,9,7,4,8,10,15]
l2=[10,6,7,8,16,20,6]
Pasos genéricos
Definir lista 1
Definir lista 2
Recorrer lista 1 y por cada dato realizar
Determinar si dato es par
Si es par buscarlo en lista 2
Si no está buscarlo en lista resultado
Si no está llenarlo en lista resultado
Recorre lista 2 y por cada dato realizar
Determinar si dato es par
Si es par buscarlo en lista 1
Si no está buscarlo en lista resultado
Si no está llenarlo en lista resultado
Mostrar lista resultado
#formar una lista con pares no comunes de dos listas sin repetidos
#definir listas
l1=[4,2,7,9,4,8,10,15]
l2=[10,6,7,8,16,20,6]
lr=[] #lista resultado
#recorrer lista 1 y realizar...
for i in range(len(l1)):
if l1[i] % 2==0:
b=l1[i] in l2 #busca dato de l1 en l2
if b==False:
b1=l1[i] in lr #busca dato de l1 en lr
if b1==False:
lr.append(l1[i])
#recorrer lista 2 y realizar ...
for i in range(len(l2)):
if l2[i] % 2==0:
b=l2[i] in l1 #busca dato de l2 en l1
if b==False:
b1=l2[i] in lr #busca dato de l2 en lr
if b1==False:
lr.append(l2[i])
#muestra lista resultado
print('lista pares no cumunes \n',lr)
Nota importante. La mayoría de los ejercicios no está necesitando los datos desde el
teclado, se los define directamente lo que implica que el ejercicio solo funciona para las
listas con los datos propuestos.
La generalización se logra entrando los datos desde el teclado, como se había
establecido en el primer ejercicio, o generando los números de la lista aleatoriamente.
Ejercicio 1
Generar 10 números enteros aleatoriamente entre 0 y 10
import random
lista1=[]
for _ in range(10):
num=random.randint(0,10)
lista1.append(num)
print(lista1)
Ejercicio 2
Generar 10 números pares aleatorios entre 0 y 100
import random
list2=[]
for _ in range(10):
num=random.randrange(0,100,2)
list2.append(num)
print(list2)
ejercicio 3
Generar 10 números aleatorios múltiplos de 5
Forma 1
#aleatorios múltiplos de 3
import random
list3=[]
for _ in range(10):
num=random.randrange(0,100,5)
list3.append(random.randrange(0,100,5))
print(list3)
forma 2
import random
list3=[]
for _ in range(10):
num=random.randint(1,10)*5
list3.append(num)
print(list3)
Ejercicio 4
Generar los números del 1 al 20 desordenados
import random
list4=[]
for i in range(21):
list4.append(i)
random.shuffle(list4)
print(list4)
Ejercicio 9
Se tienen dos listas con datos numéricos generados aleatoriamente, formar una lista con
la unión de las dos por extensión.
import random
cd1=int(input("Cantidad de datos lista 1 ->"))
cd2=int(input("Cantidad de datos lista 2 ->"))
l1=[]
l2=[]
v1=int(input("valor entero límite aleatorio ->"))
for _ in range(cd1):
l1.append(random.randint(0,v1))
for _ in range(cd2):
l2.append(random.randint(0,v1))
print("lista 1 \n",l1)
print("lista 2 \n",l2)
l1.extend(l2)
Ejecicio de aplicación
Se tienen dos listas con datos enteros formar una tercera lista con los pares no comunes.
Los pasos genéricos son los mismos del ejercicio anterior solo cambia la definición de las
listas que se hacen aleatoriamente.
#formar una lista con pares no comunes de dos listas sin repetidos
#definir listas. Utilizar valores aleatorios
import random
cd1=int(input("Cantidad de datos lista 1 ->"))
cd2=int(input("Cantidad de datos lista 2 ->"))
l1=[]
l2=[]
for _ in range(cd1):
l1.append(random.randint(0,20))
for _ in range(cd2):
l2.append(random.randint(0,20))
#muestra las listas a procesar
print("lista 1 \n",l1)
print("lista 2 \n",l2)
lr=[] #lista resultado
#recorrer lista 1 y realizar...
for i in range(len(l1)):
if l1[i] % 2==0:
b=l1[i] in l2
if b==False:
b1=l1[i] in lr
if b1==False:
lr.append(l1[i])
#recorrer lista 2 y realizar ...
for i in range(len(l2)):
if l2[i] % 2==0:
b=l2[i] in l1
if b==False:
b1=l2[i] in lr
if b1==False:
lr.append(l2[i])
print('lista pares no comunes \n',lr)
Con estos conceptos ya se puede trabajar con matrices dentro del lenguaje Python.
Definición de una matriz
matriz = [] #matriz vacía
matriz2=[[5,3,8],[5,2,4]] # matriz de 2 filas por 3 columnas
Matriz=[]
for i in range(filas):
Matriz.append([0]*columnas)
print(Matriz)
Matriz1=[]
for i in range(filas):
fila=[]
for j in range(columnas):
fila.append(0)
Matriz.append(fila)
print(Matriz)
Ejercicio. Definir una lista (matriz) donde las filas pares sean 0 y las filas impares sean 1
#filas pares 0 filas impares 1 forma 1
filas=int(input("Numero de filas"))
columnas=int(input('Numero de columnas'))
Matriz=[]
for i in range(filas):
if i%2==0:
Matriz.append([0]*columnas)
else:
Matriz.append([1]*columnas)
print(Matriz)
Segunda solución
#filas pares 0 filas impares 1 forma 2
filas=int(input("Numero de filas"))
columnas=int(input('Numero de columnas'))
Matriz=[]
for i in range(filas):
fila=[]
if i%2==0:
for j in range(columnas):
fila.append(0)
else:
for j in range(columnas):
fila.append(1)
Matriz.append(fila)
print(Matriz)
filas=int(input("Numero de filas"))
columnas=int(input('Numero de columnas'))
Matriz=[]
for i in range(filas):
fila=[]
for j in range(columnas):
fila.append(int(input(f'dato {i},{j} =')))
Matriz.append(fila)
print(Matriz)
Ejercicio.
Se tiene una matriz con datos numéricos, hallar el promedio de los números pares.
Pasos genéricos
Definir matriz
Leer matriz
Sumar y contar pares de la matriz
Calcular promedio pares e impares matriz
filas=int(input("Numero de filas"))
columnas=int(input('Numero de columnas'))
mat=[]
# Leer matriz
for i in range(filas):
fila=[]
for j in range(columnas):
fila.append(int(input(f'dato {i},{j} =')))
mat.append(fila)
#mostrar matriz
print(mat)
#sumar y contar pares de la matriz
sump=0
conp=0
for i in range(filas):
for j in range(columnas):
if mat[i][j]%2==0:
sump+=mat[i][j]
conp+=1
#hallar promedio pares
if conp>0:
prop=sump/conp
print('promedio de pares = ',prop)
else:
print('En la matriz no hay números pares')
Ejercicio.
Se tiene una matriz con datos numéricos, hallar el promedio de los números primos.
Ejercicio.
Se tiene una matriz con datos numéricos, hallar el promedio de los números pares.
Pasos genéricos
Definir matriz
Leer matriz
Recorrer la matriz y por cada fila
Mostrar mayor de cada fila
Mostrar menor de cada fila
Mostrar suma de cada fila
mat=[]
# Leer matriz
for i in range(filas):
fila=[]
for j in range(columnas):
fila.append(int(input(f'dato {i},{j} =')))
mat.append(fila)
#mostrar matriz
print('\n Matriz creada \n')
for i in range(filas):
print(mat[i])
for i in range(filas):
print('\nfila ',mat[i],'\n')
print('mayor fila = ',max(mat[i]))
print('menor fila = ',min(mat[i]))
print('suma fila = ',sum(mat[i]))
Pasos genéricos
Definir matriz
Leer matriz
Llenar lista con los mayores de cada fila
Obtener mayor de la lista resultante
Mostrar mayor
mat=[]
# Leer matriz
for i in range(filas):
fila=[]
for j in range(columnas):
fila.append(int(input(f'dato {i},{j} =')))
mat.append(fila)
#mostrar matriz
print('\n Matriz creada \n')
for i in range(filas):
print(mat[i])
Hallar el dato menor de una matriz, con matriz creada en forma aleatoria
Pasos genéricos
Definir matriz
Llenar matriz aleatoriamente
Llenar lista con los menores de cada fila
Obtener menor de la lista resultante
Mostrar menor
mat=[]
# Leer matriz
for i in range(filas):
fila=[]
for j in range(columnas):
fila.append(random.randint(0,20)) #datos enteros aleatorios
mat.append(fila)
#mostrar matriz
print('\n Matriz creada \n')
for i in range(filas):
print(mat[i])
MODULARIDAD
Una función viene definida por su nombre, sus parámetros y su valor de retorno.
Esta parametrización de las funciones las convierte en una poderosa herramienta
ajustable a las circunstancias que tengamos. Al invocarla se está solicitando su
ejecución para obtener unos resultados.
Independencia de las funciones
Las funciones se ejecutan en forma independiente. Este concepto es importante
tenerlo presente ya que mientras se esté ejecutando las instrucciones de la
función, no se conoce ninguna información de quién solicito su ejecución.
Al ser independiente se debe tener claro los canales de comunicación para que
una función realice la tarea específica y entregue los resultados al programa o
subprograma que lo invoca. Los canales de comunicación están determinados en
los parámetros y en el nombre mismo de la función, los cuales pueden ser
utilizados para enviar y recibir información a la función o de la función
respectivamente.
Formato
Ejemplo
>>>def say_hello():
... print(‘Hello!’)
Retornar un valor
Las funciones pueden retornar (o «devolver») un valor.
Ejemplo:
>>> def uno():
... return 1
...
>>> uno()
1
>>> if uno() == 1:
... print(‘Siempre 1’)
... else:
... print(‘No se va a presentar’)
...
Siempre 1
Parámetros y argumentos.
1.
1. void CambiarCantidad(int *cantidad)
2. {
3. *cantidad = 5;
4. }
5.
6. int cantidad = 1;
7. CambiarCantidad(&cantidad);
8. printf("%d", cantidad); /* Imprime 5 */
a, b, c = 1, 2, 3
f(a, b, c)
print(a, b, c) # Imprime 1, 2, 3.
No se modifican porque los números enteros son inmutables, de igual forma los de
coma flotante, las cadenas y otros objetos.
a=2
Las asignaciones
a=1
a=2
Las siguientes acciones demuestran con la función id() (id muestra la dirección de
un identificador) que la variable a no almacena valores, son referencias a un valor
>>>a=1
2952065149232
>>> a=2
2952065149264
Lo mismo ocurre con las string o cadenas que también son inmutables
>>>h='hola'
>>> id(h)
2952068065520
>>> h='pedro'
>>> id(h)
2952068065584
>>>
def f(a):
a[0] = "CPython"
a[1] = "PyPy"
a.append("Stackless")
Como ítems es una lista y es mutable, si es posible editarlo dentro de una función
y va a tener efecto por fuera de esta.
Python permite en una función devolver o retornar varios objetos utilizando tuplas
o listas. Por ejemplo:
a=1
b=2
c=3
def f(a,b,c):
return 4, 5, 6
a, b, c = f(a,b,c)
# Ahora "a" referencia a 4, "b" referencia a 5 y "c" referencia a 6.
def leerVector(l1):
cd=int(input('Cantidad de datos -> '))
for i in range(cd):
l1.append(int(input(f'dato {i} = ')))
def leerMatriz(m1):
nf=int(input('Cantidad de filas -> '))
nc=int(input('Cantidad de columnas -> '))
for i in range(nf):
l1=[]
for j in range(nc):
l1.append(int(input(f'dato ({i},{j}) = ')))
m1.append(l1)
Las dos funciones anteriores utilizan los parámetros para recibir e resultado de las
funciones.
#Funcion que no recibe parámetros, crea una lista con valores y retorna la #lista
def leerVectorR():
l1=[]
cd=int(input('Cantidad de datos -> '))
for i in range(cd):
l1.append(int(input(f'dato {i} = ')))
return l1
#Funcion que no recibe parámetros, crea una lista para ser trabajado como
#vector llena valores y retorna la lista
def leerMatrizR():
m1=[]
nf=int(input('Cantidad de filas -> '))
nc=int(input('Cantidad de columnas -> '))
for i in range(nf):
l1=[]
for j in range(nc):
l1.append(int(input(f'dato ({i},{j}) = ')))
m1.append(l1)
return m1
l1=[]
leerVector(l1)
print('Lista leida \n',l1)
m1=[]
leerMatriz(m1)
print('Matriz leida \n',m1)
l1=leerVectorR()
print('Vector leido con retorno \n',l1)
m2=leerMatrizR()
print('Matriz con retorno leida \n',m2)
Ejercicio.
Se tiene una matriz con datos numéricos, hallar le promedio de los números
primos de la matriz.
Pasos genéricos
leerMatriz
Hallar suma y cuenta de primos
Hallar el promedio
Mostrar promedio
def leerMatriz():
m=[]
nf=int(input('Cantidad de filas -> '))
nc=int(input('Cantidad de columnas -> '))
for i in range(nf):
l1=[]
for j in range(nc):
l1.append(int(input(f'dato ({i},{j}) = ')))
m.append(l1)
return m
def primo(valor):
c=1
cd=0
while c<=valor :
if valor%c==0:
cd+=1
c+=1
if cd==2:
return 1
else:
return 0
def sumaCuentaPrimosMatriz(m):
sump,conp=0,0
for i in range(len(m)):
for j in range(len(m[i])):
if primo(m[i][j])==1:
sump +=m[i][j]
conp +=1
return sump,conp
#programa principal
m=leerMatriz()
sum,con=sumaCuentaPrimosMatriz(m)
if con>0:
print ('promedio =',sum/con)
else:
print('no hay primos en la matriz')
Ejercicio.
Se tiene una matriz con datos numéricos, formar dos listas con primos y Fibonacci
respectivamente.
Pasos genéricos
Leer matriz
Obtener listas de primos y Fibonacci
Mostrar lista primos
Mostrar lista fibonacci
def leerMatriz():
m=[]
nf=int(input('Cantidad de filas -> '))
nc=int(input('Cantidad de columnas -> '))
for i in range(nf):
l1=[]
for j in range(nc):
l1.append(int(input(f'dato ({i},{j}) = ')))
m.append(l1)
return m
def primo(valor):
c=1
cd=0
while c<=valor :
if valor%c==0:
cd+=1
c+=1
if cd==2:
return 1
else:
return 0
def fibonacci(valor):
a=0
b=1
t=0
while t<valor :
t=a+b
a=b
b=t
if t==valor:
return True
else:
return False
def ListaPrimosFibonacci(m):
lp=[]
lf=[]
sump,conp=0,0
for i in range(len(m)):
for j in range(len(m[i])):
if primo(m[i][j])==1:
lp.append(m[i][j])
if fibonacci(m[i][j])==True:
lf.append(m[i][j])
return lp,lf
#programa principal
m=leerMatriz()
lp,lf=ListaPrimosFibonacci(m)
print('Lista de primos \n',lp)
print('Lista de fibonacci \n ',lf)
Diseño de un programa
Para colocar varios ejercicios relacionados con vectores o con matrices, éstos
deben ejecutarse dentro de un mismo programa en forma organizada.
Una de las formas que permiten realizar varias acciones a la vez, es el manejo de
un menú en donde se hace un diseño de ejecución de un programa. El menú
permite integrar varias acciones en un programa, hace parte de lo que se
denomina el diseño de un programa.
El diseño es una etapa que sigue al análisis en donde se especifica el cómo se va
a ejecutar el programa.
Ejemplo
7. Salir
--------------------------------
Elija una opción (1-7): 4
Leer Opcion
Se puede trabajar el menú con ciclo mientras combinada con una instrucción
match-case
Sentencia match-case
Ejemplo
def leerLista():
lista=[]
cd=int(input('Cantidad de datos lista'))
for i in range(cd):
lista.append(int(input(f'dato ({i}) --> ')))
return lista
def mostrarLista(l1):
for i in range(len(l1)):
print(f'dato ({i})--> {l1[i]}')
def ordenarLista(l1):
l1.sort()
print('ordenada ascendente ')
mostrarLista(l1)
l1.sort(reverse=True)
print('ordenada descendentemente ')
mostrarLista(l1)
while True:
print ('Menu Lista')
print('------------------------------')
print('1. Leer lista ')
print('2. Mostrar lista ')
print('3. Ordenar lista ')
print('4. Mayor y menor lista ')
print('5. Promedio primos lista ')
print('6. Fibonacci mayor lista ')
print('7. Salir ')
print('------------------------------ ')
if opcion==1:
l1=leerLista()
elif opcion==2:
mostrarLista(l1)
elif opcion==3:
ordenarLista(l1)
elif opcion==7:
break
Pertenencia de un elemento
Para determinar si una subcadena se encuentra en una cadena de texto se utiliza
el operador in para ello. Se trata de una expresión que tiene como resultado un
valor «booleano» verdadero o falso:
>>> proverb = ‘Más vale malo conocido que bueno por conocer’
>>> ‘malo’ in proverb
True
>>> ‘bueno’ in proverb
True
>>> ‘regular’ in proverb
False
La funcion split() devuelve una lista , donde cada elemento es una parte de la
cadena de texto original:
>>> game = ‘piedra-papel-tijera’
>>> type(game.split(‘-‘))
List
Ejercicio
Sabiendo que la longitud de una lista se calcula igual que la longitud de una
cadena de texto,
obtenga el número de palabras que contiene la siguiente cadena de texto:
La función strip() se utiliza para eliminar caracteres del principio y del final de un
«string» generalmente conocidos como caracteres de relleno.
las variantes de esta función permiten aplicarla únicamente al comienzo o
únicamente al final de la cadena de texto.
Ejemplo. Eliminar caracteres de relleno:
>>> serial_number.lstrip()
‘48374983274832 \n\n\t \t \n’
Ejercicio
Dada la siguiente letra5, obtenga la misma pero sustituyendo la palabra voices por
sounds:
>>> song = ‘’’You look so beautiful in this light
... Your silhouette over me
... The way it brings out the blue in your eyes
... Is the Tenerife sea
... And all of the voices surrounding us here
... They just fade out when you take a breath
... Just say the word and I will disappear
... Into the wilderness’’’
Python nos permite realizar variaciones en los caracteres de una cadena de texto
para pasarlos a mayúsculas y/o minúsculas. Veamos las distintas opciones
disponibles:
>>> proverb = ‘quien a buen árbol se arrima Buena Sombra le cobija’
>>> proverb
‘quien a buen árbol se arrima Buena Sombra le cobija’
>>> proverb.capitalize()
‘Quien a buen árbol se arrima buena sombra le cobija’
>>> proverb.title()
‘Quien A Buen Árbol Se Arrima Buena Sombra Le Cobija’
>>> proverb.upper()
‘QUIEN A BUEN ÁRBOL SE ARRIMA BUENA SOMBRA LE COBIJA’
>>> proverb.lower()
‘quien a buen árbol se arrima buena sombra le cobija’
Identificando caracteres
Funciones para identificar qué tipo de caracteres contiene.
funciones:
Detectar si todos los caracteres son letras o
números
>>> ‘R2D2’.isalnum()
True
>>> ‘C3-PO’.isalnum()
False
>>> ‘314’.isnumeric()
True
>>> ‘3.14’.isnumeric()
False
Detectar si todos los caracteres son letras
>>> ‘abc’.isalpha()
True
>>> ‘a-b-c’.isalpha()
False
Detectar mayúsculas/minúsculas
>>> ‘BIG’.isupper()
True
>>> ‘small’.islower()
True
>>> ‘First Heading’.istitle()
True
Interpolación de cadenas
interpolar valores dentro de cadenas de texto utilizando diferentes formatos.
Interpolar (en este contexto) significa sustituir una variable por su valor dentro de
una cadena de texto.
Veamos los estilos que proporciona Python para este cometido:
Nombre Símbolo Soportado
Los f-strings aparecieron en Python 3.6 y se suelen usar en código de nueva
creación. Es la forma más potente – y en muchas ocasiones más eficiente – de
formar cadenas de texto incluyendo valores de otras variables.
La interpolación en cadenas de texto es un concepto que existe en la gran
mayoría de lenguajes de programación y hace referencia al hecho de sustituir los
nombres de variables por sus valores cuando se construye un «string».
Para indicar en Python que una cadena es un «f-string» basta con precederla de
una f e incluir las variables o expresiones a interpolar entre llaves {...}.
Supongamos que disponemos de los datos de una persona y queremos formar
una frase de
bienvenida con ellos:
>>> name = ‘Elon Musk’
>>> age = 49
>>> fortune = 43_300
>>> f’Me llamo {name}, tengo {age} años y una fortuna de {fortune} millones’
‘Me llamo Elon Musk, tengo 49 años y una fortuna de 43300 millones’
Formateando cadenas
Nivel intermedio
Los «f-strings» proporcionan una gran variedad de opciones de formateado:
ancho del texto, número de decimales, tamaño de la cifra, alineación, etc.
Dando formato a valores enteros:
Alineando valores:
>>> text1 = ‘how’
>>> text2 = ‘are’
>>> text3 = ‘you’
>>> f’{text1:<7s}|{text2:^11s}|{text3:>7s}’
‘how | are | you’
>>> f’{text1:-<7s}|{text2:·^11s}|{text3:->7s}’
‘how----|····are····|----you’
Modo «debug»
A partir de Python 3.8, los «f-strings» permiten imprimir el nombre de la variable y
su valor, como un atajo para depurar nuestro código. Para ello sólo tenemos que
incluir un símbolo = después del nombre de la variable:
>>> serie = ‘The Simpsons’
>>> f’{serie=}’
"serie=’The Simpsons"
>>> imdb_rating = 8.7
>>> num_seasons = 30
>>> f’{imdb_rating=}’
‘imdb_rating=8.7’
>>> f’{serie[4:]=}’ # incluso podemos añadir expresiones!
"serie[4:]=’Simpsons’"
>>> f’{imdb_rating / num_seasons=}’
‘imdb_rating / num_seasons=0.29’
Ejercicios.
Realizar con un menú las siguientes ejercicios
Se tiene una cadena, determinar lo siguiente:
Las veces que aparece un carácter en la cadena
Reemplazar un carácter dado en la cadena
Determinar cual es el carácter que más se repite
Ordenar una cadena
Solución
Las veces que aparece un carácter en una cadena
Determinar cadena
Leer carácter
Contar carácter
Mostrar contador
Leer cadena
Recorrer cadena
Por cada carácter determinar si ya se contó
Si no se ha contado contarlo
Almacenar carácter en lista de contados y el contador en contados
Recorrer lista de contados y mostrar contados con su contador correspondiente
cad=input('Cadena para determinar caracter más repetido')
cnr=[]
con=[]
for i in range(len(cad)):
b=cad[i] in cnr
if b==False:
cnr.append(cad[i])
con.append(cad.count(cad[i]))
for i in range(len(cnr)):
print('Dato -> ',cnr[i], ' veces que se repite ->',con[i])
Leer cadena
Formar una lista con la cadena
Ordenar lista
Formar una cadena con la lista
Mostrar lista
Tuplas
Creación de tuplas
Podemos pensar en crear tuplas tal y como lo hacíamos con listas, pero usando
paréntesis
en lugar de corchetes:
>>> empty_tuple = ()
>>> tenerife_geoloc = (28.46824, -16.25462)
>>> three_wise_men = (‘Melchor’, ‘Gaspar’, ‘Baltasar’)
Tuplas de un elemento
Creación de tupla de un único elemento.
La intención primera sería hacerlo de la siguiente manera:
>>> type(one_item_tuple)
tuple
ejemplos:
>>> one_item_tuple = ‘Papá Noel’,
>>> three_wise_men = ‘Melchor’, ‘Gaspar’, ‘Baltasar’
>>> tenerife_geoloc = 28.46824, -16.25462
Conversión
Para convertir otros tipos de datos en una tupla podemos usar la función tuple():
>>> shopping = [‘Agua’, ‘Aceite’, ‘Arroz’]
>>> tuple(shopping)
(‘Agua’, ‘Aceite’, ‘Arroz’)
Esta conversión es válida para aquellos tipos de datos que sean iterables:
cadenas de caracteres, listas, diccionarios, conjuntos, etc. Un ejemplo que no
funciona es intentar convertir un número en una tupla:
>>> tuple(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ‘int’ object is not iterable
El uso de la función tuple() sin argumentos equivale a crear una tupla vacía:
>>> tuple()
()
Truco: Para crear una tupla vacía, se suele recomendar el uso de () frente a
tuple().
Con las tuplas podemos realizar todas las operaciones que se realizan con listas
salvo las que conlleven una modificación «in-situ», es decir, las siguientes
instrucciones no se pueden realizar:
• reverse()
• append()
• extend()
• remove()
• clear()
• sort()
Desempaquetado de tuplas
Intercambio de valores
A través del desempaquetado de tuplas se puede llevar a cabo el intercambio de
los valores de dos variables de manera directa:
>>> value1 = 40
>>> value2 = 20
>>> value1, value2 = value2, value1
>>> value1
20
>>> value2
40
Desempaquetado genérico
Sobre listas:
>>> writer1, writer2, writer3 = [‘Virginia Woolf’, ‘Jane Austen’, ‘Mary Shelley’]
>>> writer1, writer2, writer3
(‘Virginia Woolf’, ‘Jane Austen’, ‘Mary Shelley’)
Tuplas vs Listas
Aunque puedan parecer estructuras de datos muy similares, sabemos que las
tuplas carecen de ciertas operaciones, especialmente las que tienen que ver con
la modificación de sus valores, ya que no son inmutables.
Diccionarios
Creación de diccionarios
Para crear un diccionario se usa llaves {} rodeando asignaciones clave: valor que
están separadas por comas. Veamos algunos ejemplos de diccionarios:
>>> empty_dict = {}
>>> rae = {
... ‘bifronte’: ‘De dos frentes o dos caras’,
... ‘anarcoide’: ‘Que tiende al desorden’,
... ‘montuvio’: ‘Campesino de la costa’
... }
>>> population_can = {
... 2015: 2_135_209,
... 2016: 2_154_924,
... 2017: 2_177_048,
... 2018: 2_206_901,
... 2019: 2_220_270
... }
En el código anterior se observa la creación de un diccionario vacío, otro donde
sus claves y sus valores son cadenas de texto y otro donde las claves y los
valores son valores enteros.
Conversión
Diccionario vacío
Existe una manera particular de usar dict() y es no pasarle ningún argumento.
diccionario vacío:
>>> dict()
{}
El uso de {} de más recomendable que dict(), no sólo por ser más pitónico sino por
tener (en promedio) un mejor rendimiento en tiempos de ejecución.
También es posible utilizar la función dict() para crear diccionarios y no tener que
utilizar llaves y comillas:
Supongamos que queremos transformar la siguiente información en un
diccionario:
Atributo Valor
name Guido
surname Van Rossum
job Python creator
El inconveniente que tiene esta aproximación es que las claves deben ser
identificadores válidos en Python. Por ejemplo, no se permiten espacios:
Ejemplo:
>>> rae = {
... ‘bifronte’: ‘De dos frentes o dos caras’,
... ‘anarcoide’: ‘Que tiende al desorden’,
... ‘montuvio’: ‘Campesino de la costa’
... }
>>> rae[‘anarcoide’]
‘Que tiende al desorden’
Usando get()
Existe una función muy útil para «superar» los posibles errores de acceso por
claves inexistentes. Se trata de get() y su comportamiento es el siguiente:
1 >>> rae
2 {‘bifronte’: ‘De dos frentes o dos caras’,
3’anarcoide’: ‘Que tiende al desorden’,
• Claves: ciudades.
• Valores: habitantes (como enteros).
Ejemplo
• Entrada: Tokyo:38_140_000;Delhi:26_454_000;Shanghai:24_484_000;
Mumbai:21_357_000;São Paulo:21_297_000
• Salida: {‘Tokyo’: 38140000, ‘Delhi’: 26454000, ‘Shanghai’: 24484000,
‘Mumbai’: 21357000, ‘São Paulo’: 21297000}
Ejemplo
• Entrada: ‘boom’
• Salida: {‘b’: 1, ‘o’: 2, ‘m’: 1}
>>> rae.values()
dict_values([
‘De dos frentes o dos caras’,
‘Que tiende al desorden’,
‘Campesino de la costa’,
‘Instruir, juzgar o sentenciar una causa’
])
Obtener todos los pares «clave-valor» de un diccionario: Mediante la función
items():
>>> rae.items()
dict_items([
(‘bifronte’: ‘De dos frentes o dos caras’),
(’anarcoide’: ‘Que tiende al desorden’),
(‘montuvio’: ‘Campesino de la costa’),
(‘enjuiciar’: ‘Instruir, juzgar o sentenciar una causa’)]
Nota: Para este último caso cabe destacar que los «items» se devuelven como
una lista de tuplas, donde cada tupla tiene dos elementos: el primero representa la
clave y el segundo representa el valor.
Longitud de un diccionario
Para conocer el número de elementos («clave-valor») que tiene un diccionario con
la función len():
>>> rae
{‘bifronte’: ‘De dos frentes o dos caras’,
’anarcoide’: ‘Que tiende al desorden’,
‘montuvio’: ‘Campesino de la costa’,
‘enjuiciar’: ‘Instruir, juzgar o sentenciar una causa’}
>>> len(rae)
4
Nota: En este último caso, recuerde el uso de los «f-strings» para formatear
cadenas de texto.
Diccionarios 163__
Ejercicio de aplicación
Ejercicio de aplicación.
Promedio de calificaciones
Cantidad de estudiantes que aprobaron la materia
Cantidad de estudiantes que perdieron la materia
Analisis
Ejemplo
CE
8
Cod Est N1 N2 N3 Nf
0 1 3 3,5 4 3,5 = 3*,3+3,5*,3+4*,4
1 2 4 4,5 4,5 4,3
2 3 2,5 3,5 3 3
3 4 5 4 5 4,5
4 5 2,5 3 3 2,8
5 6 3 3 2 2,6
6 7 5 4 5 4,5
7 8 3 3 2 2,6
Ordenar
Cod Est N1 N2 N3 Nf
4 5 4 5 4,5
7 5 4 5 4,5
2 4 4,5 4,5 4,3
1 3 3,5 4 3,5
3 2,5 3,5 3 3
5 2,5 3 3 2,8
6 3 3 2 2,6
8 3 3 2 2,6
Mostrar lista
Promedio (SNf/CE)
Definir variables
Leer Datos de los estudiantes - listaEstudiantes listaCalificaciones
Calcular nota definitiva - listaDefinitiva
Ordenar definitiva y realizar cambios correspondientes – ordenaListaDefinitiva y
las demás listas
Obtener listado de notas- Mostrar todas las listas
Obtener estadísticas – Realizar estadísticas
Pasos genéricos
Leer estudiante y calificaciones
Calcular nota definitiva
Ordenar calificaciones
Mostrar listado general con calificación final
Realizar estadísticas
Ordenar calificaciones
Ordenar por lista lfin en orden descendente e intercambiar las listas
correspondientes
Realizar estadísticas
Estudiantes aprobados
Promedio de notas
Estudiantes con nota mayor
Estudiantes con nota menor
Funciones
leerCalificaciones
calcularDefinitiva
ordenarCalificaciones
mostrarListado
estadísticas
def leerCalificaciones(mcalif):
ce=int(input('Cantidad de estudiantes ->'))
lcod=[]
for i in range(ce):
print ('Informaci estudiante ',i+1)
lc=[]
lcod.append(int(input('Codigo estudiante-> ')))
lc.append(float(input('Calificacion 1 -> ')))
lc.append(float(input('Calificacion 2 -> ')))
lc.append(float(input('Calificacion 3 -> ')))
mcalif.append(lc)
return lcod
def calcularDefinitiva(lc,mc):
ldef=[]
for i in range(len(lc)):
ldef.append(mc[i][0]*.30+mc[i][1]*.30+mc[i][2]*.40)
return ldef
def ordenarCalificaciones(lc,mc,lf):
for i in range(len(lc)):
for j in range(i,len(lc)):
if lf[j]>lf[i]:
aux=lf[i]
lf[i]=lf[j]
lf[j]=aux
# para mentener referencia se debe hacer intercambiar
la listas
# relacionadas mc y lc
laux=mc[i].copy()
mc[i]=mc[j].copy()
mc[j]=laux.copy()
aux=lc[i]
lc[i]=lc[j]
lc[j]=aux
def promedioCalificaciones(lf):
prom=sum(lf)/len(lf)
print('\npromedio calificaciones = ',prom)
def ganadosPerdidos(lf):
cg=0
cp=0
for i in range(len(lf)):
if lf[i]>3:
cg=cg+1
else:
cp=cp+1
print('Estudiantes que ganaron la materia ',cg)
print('Estudiantes que perdieron la materia = ',cp)
def estudiantesNotaMayorMenor(lc,lf):
mayor=max(lf)
menor=min(lf)
print('Estudiantes con nota mayor ',mayor)
for i in range(len(lc)):
if mayor==lf[i]:
print('codigo -> ',lc[i])
def mostrarCalificaciones(lc,mc,lf):
for i in range(len(lf)):
print(f'Codigo estudiante {lc[i]}')
print(f'n1 = {mc[i][0]}\n n2= {mc[i][1]}\n n3= {mc[i][2]}')
print('calificacion final -> ',lf[i])
mcal=[]
lcod=leerCalificaciones(mcal)
print(lcod)
print(mcal)
lfin=calcularDefinitiva(lcod,mcal)
ordenarCalificaciones(lcod,mcal,lfin)
mostrarCalificaciones(lcod,mcal,lfin)
promedioCalificaciones(lfin)
ganadosPerdidos(lfin)
estudiantesNotaMayorMenor(lcod,lfin)
En Python, puedes usar los bloques try y except para manejar estos errores
como excepciones.
finally:
# Este bloque se ejecutará siempre
EL bloque try es el bloque con las sentencias que se quiere ejecutar. Sin embargo,
podrían llegar a haber errores de ejecución y el bloque se dejará de ejecutarse.
El bloque except se ejecutará cuando el bloque try falle debido a un error. Este
bloque contiene sentencias que generalmente nos dan un contexto de lo que salió
mal en el bloque try.
Siempre se debe especificar el tipo de error que se espera, como una excepción
dentro del bloque except dentro de <tipo de error> como lo muestra el ejemplo:
except ValueError:
print(‘Error: Entrada de valor inválida’
except ZeroDivisionError:
print(‘Error: Se presenta una división por cero ‘)
Se puede usar except sin especificar el <tipo de error>. Pero no es una práctica
recomendable, ya que no se estará al tanto de los tipos de errores que puedan
ocurrir.
Cuando se ejecute el código dentro del bloque try, existe la posibilidad de que ocurran
diferentes errores.
Por ejemplo, se podría acceder a una lista utilizando un índice fuera de rango, usar una
clave incorrecta en un diccionario y tratar de abrir un archivo que no existe - todo esto
dentro de un bloque try.
En este caso, se podría esperar lo siguiente: IndexError, KeyError y FileNotFoundError. Y
se tendría que añadir un bloque except por cada tipo de error que se pueda anticipar.
El bloque else se ejecutará solo si el bloque try se ejecuta sin errores. Esto puede
ser útil cuando se quiera continuar el código del bloque try. Por ejemplo, si se abre
un archivo en el bloque try, se podría leer su contenido dentro del bloque else.
El bloque finally siempre es ejecutado sin importar que pase en los otros bloques,
esto puede ser útil cuando se quiera liberar recursos después de la ejecución de
un bloque de código, ( try, except o else ).
Nota: Los bloques else y finally son opcionales. En muchos casos puedes solo ocupar el
bloque try para tratar de ejecutar algo y capturar los errores como excepciones en el
bloque except.
Ejemplo.
Generalmente en la entrada de datos se puede presentar errores, en el aplicativo de las
calificaciones, si en la entrada de cantidad de estudiantes se digita un valor diferente a
entero, se va a presentar un error, en tal caso el programa cancela y muestra un mensaje
donde la excepción que se presenta es:
ValueError
Para evitar la cancelación del programa se debe capturar la excepción con el bloque
except y darle un tratamiento
Para evitar este error de entrada de enteros y reales se tiene las siguientes funciones
def leerInt(cadena):
while True:
try:
dato=int(input(cadena))
return dato
except ValueError:
print('Error de sintaxis: Digitar valor entero')
def leerFloat(cadena):
while True:
try:
dato=float(input(cadena))
return dato
except ValueError:
print('Error de sintaxis: Digitar valor real')
def leerInt(cadena):
while True:
try:
dato=int(input(cadena))
return dato
except ValueError:
print('Error de sintaxis: Digitar valor entero')
def leerFloat(cadena):
while True:
try:
dato=float(input(cadena))
return dato
except ValueError:
print('Error de sintaxis: Digitar valor real')
def leerCalificaciones(mcalif):
# ce=int(input('Cantidad de estudiantes ->'))
ce=leerInt('Cantidad de esuudiantes -> ')
lcod=[]
for i in range(ce):
print ('Información estudiante ',i+1)
lc=[]
lcod.append(leerInt('Codigo estudiante-> '))
lc.append(leerFloat('Calificacion 1 -> '))
lc.append(leerFloat('Calificacion 2 -> '))
lc.append(leerFloat('Calificacion 3 -> '))
mcalif.append(lc)
return lcod
def calcularDefinitiva(lc,mc):
ldef=[]
for i in range(len(lc)):
ldef.append(mc[i][0]*.30+mc[i][1]*.30+mc[i][2]*.40)
return ldef
def ordenarCalificaciones(lc,mc,lf):
for i in range(len(lc)):
for j in range(i,len(lc)):
if lf[j]>lf[i]:
aux=lf[i]
lf[i]=lf[j]
lf[j]=aux
# para mentener referencia se debe hacer intercambiar
la listas
# relacionadas mc y lc
laux=mc[i].copy()
mc[i]=mc[j].copy()
mc[j]=laux.copy()
aux=lc[i]
lc[i]=lc[j]
lc[j]=aux
def promedioCalificaciones(lf):
prom=sum(lf)/len(lf)
print('\npromedio calificaciones = ',prom)
def ganadosPerdidos(lf):
cg=0
cp=0
for i in range(len(lf)):
if lf[i]>3:
cg=cg+1
else:
cp=cp+1
print('Estudiantes que ganaron la materia ',cg)
print('Estudiantes que perdieron la materia = ',cp)
def estudiantesNotaMayorMenor(lc,lf):
mayor=max(lf)
menor=min(lf)
print('Estudiantes con nota mayor ',mayor)
for i in range(len(lc)):
if mayor==lf[i]:
print('codigo -> ',lc[i])
def mostrarCalificaciones(lc,mc,lf):
for i in range(len(lf)):
print(f'Codigo estudiante {lc[i]}')
print(f'n1 = {mc[i][0]}\n n2= {mc[i][1]}\n n3= {mc[i][2]}')
print('calificacion final -> ',lf[i])
#programa principal
mcal=[]
lcod=leerCalificaciones(mcal)
print(lcod)
print(mcal)
lfin=calcularDefinitiva(lcod,mcal)
ordenarCalificaciones(lcod,mcal,lfin)
mostrarCalificaciones(lcod,mcal,lfin)
promedioCalificaciones(lfin)
ganadosPerdidos(lfin)
estudiantesNotaMayorMenor(lcod,lfin)
Ejercicio.
Con las calificaciones finales y el código del estudiante formar un
diccionario, en donde la clave sea el código del estudiante y el
valor la calificación final.
def formarDiccionarios(lc,mc,lf):
dic1={}
dic2={}
for i in range(len(lc)):
dic1[lc[i]]=lf[i]
dic2[lc[i]]=mc[i]
print('Diccionario 1\n',dic1)
print('Diccionario 2\n',dic2)
return dic1,dic2
Diccionario 1
{4: 4.0, 22: 2.0, 77: 2.0, 55: 1.0}
Diccionario 2
{4: [4.0, 4.0, 4.0], 22: [2.0, 2.0, 2.0], 77: [2.0, 2.0, 2.0], 55: [1.0, 1.0, 1.0]}
Ordenar diccionario por clave
Se hace uso de la función keys() para obtener la lista de claves del diccionario
Se ordena en orden ascendente o descendente
Se crea un nuevo diccionario vacío
Se recorre las claves de diccionario ordenado
Por cada iteración de la clave ordenada se va adicionando información al
diccionario
Mostrar diccionario
def ordenarDiccionarios(dic1,dic2):
codigos_ord=sorted(dic1.keys())
dic_ordenado1={}
dic_ordenado2={}
for key in codigos_ord:
dic_ordenado1[key]=dic1[key]
dic_ordenado2[key]=dic2[key]
def ordenarDiccionarioValor(dic1):
dic_ordenado = dict(sorted(dic1.items(),key=lambda item:item[1]))
print(dic_ordenado)
Las funciones Lambda son funciones anónimas que solo pueden contener una
expresión.
Combinar diccionarios
Dados dos (o más) diccionarios, es posible «mezclarlos» para obtener una combinación
de los mismos. Esta combinación se basa en dos premisas:
1. Si la clave no existe, se añade con su valor.
2. Si la clave ya existe, se añade con el valor del «último» diccionario en la mezcla.
Python ofrece dos mecanismos para realizar esta combinación. Se parte de los siguientes
diccionarios para ejemplificar su uso:
>>> rae1 = {
... ‘bifronte’: ‘De dos frentes o dos caras’,
... ‘enjuiciar’: ‘Someter una cuestión a examen, discusión y juicio’
... }
>>> rae2 = {
... ‘anarcoide’: ‘Que tiende al desorden’,
... ‘montuvio’: ‘Campesino de la costa’,
... ‘enjuiciar’: ‘Instruir, juzgar o sentenciar una causa’
... }
Sin modificar los diccionarios originales: Mediante el operador **:
>>> {**rae1, **rae2}
{‘bifronte’: ‘De dos frentes o dos caras’,
‘enjuiciar’: ‘Instruir, juzgar o sentenciar una causa’,
‘anarcoide’: ‘Que tiende al desorden’,
‘montuvio’: ‘Campesino de la costa’}
A partir de Python 3.9 podemos utilizar el operador | para combinar dos diccionarios:
En este caso «último» hace referencia al diccionario que se encuentra más a la derecha
en la expresión.
Nota: Tener en cuenta que el orden en el que se especifican los diccionarios a la hora de
su combinación (mezcla) es relevante en el resultado final. En este caso el orden de los
factores sí altera el producto.
El diccionario que se afecta en el ejemplo es rae1
Borrar elementos
Python ofrece, al menos, tres formas para borrar elementos en un diccionario:
Por su clave: Mediante la sentencia del:
>>> rae = {
... ‘bifronte’: ‘De dos frentes o dos caras’,
... ‘anarcoide’: ‘Que tiende al desorden’,
... ‘montuvio’: ‘Campesino de la costa’}
>>> del(rae[‘bifronte’])
>>> rae
{‘anarcoide’: ‘Que tiende al desorden’, ‘montuvio’: ‘Campesino de la costa’}
Por su clave (con extracción): Mediante la función pop() podemos extraer un elemento
del diccionario por su clave. Vendría a ser una combinación de get() + del:
>>> rae = {
... ‘bifronte’: ‘De dos frentes o dos caras’,
... ‘anarcoide’: ‘Que tiende al desorden’,
... ‘montuvio’: ‘Campesino de la costa’
... }
>>> rae.pop(‘anarcoide’)
‘Que tiende al desorden’
>>> rae
{‘bifronte’: ‘De dos frentes o dos caras’, ‘montuvio’: ‘Campesino de la costa’}
>>> rae.pop(‘bucle’)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: ‘bucle’
Nivel intermedio
Al igual que ocurría con las listas, si se hace un cambio en un diccionario, se verá
reflejado en todas las variables que hagan referencia al mismo. Esto se deriva de su
propiedad de ser mutable. Ejemplo concreto:
>>> original_rae = {
... ‘bifronte’: ‘De dos frentes o dos caras’,
... ‘anarcoide’: ‘Que tiende al desorden’,
... ‘montuvio’: ‘Campesino de la costa’
... }
>>> copy_rae = original_rae
>>> original_rae[‘bifronte’] = ‘bla bla bla’
>>> original_rae
{‘bifronte’: ‘bla bla bla’,
‘anarcoide’: ‘Que tiende al desorden’,
‘montuvio’: ‘Campesino de la costa’
}
>>> copy_rae
{‘bifronte’: ‘bla bla bla’,
‘anarcoide’: ‘Que tiende al desorden’,
‘montuvio’: ‘Campesino de la costa’
}
Una posible solución a este problema es hacer una «copia dura». Para ello Python
proporciona la función copy():
>>> original_rae = {
... ‘bifronte’: ‘De dos frentes o dos caras’,
... ‘anarcoide’: ‘Que tiende al desorden’,
... ‘montuvio’: ‘Campesino de la costa’
... }
>>> copy_rae = original_rae.copy()
>>> original_rae[‘bifronte’] = ‘bla bla bla’
>>> original_rae
{‘bifronte’: ‘bla bla bla’,
‘anarcoide’: ‘Que tiende al desorden’,
‘montuvio’: ‘Campesino de la costa’}
>>> copy_rae
{‘bifronte’: ‘De dos frentes o dos caras’,
‘anarcoide’: ‘Que tiende al desorden’,
‘montuvio’: ‘Campesino de la costa’}
Ejercicio:
En el ejercicio de calificaciones usando diccionarios obtener un listado con el código del
estudiante, calificaciones y calificación final ordenados ascendentemente.
Para este ejercicio se debe tener en cuenta que los diccionarios manejan dos elementos,
clave y valor, el ejercicio plantea manejar 3 elementos. Código estudiante, calificaciones y
nota final ordenado por nota final, lo cual directamente no se puede realizar.
Solución
Pasos generales del ordenamiento
def formarDiccionarios(lc,mc,lf):
dic1={}
dic2={}
for i in range(len(lc)):
dic1[lc[i]]=lf[i]
dic2[lc[i]]=mc[i]
print('Diccionario 1\n',dic1)
print('Diccionario 2\n',dic2)
return dic1,dic2
def ordenarDiccionarioValor(dic1):
dic_ordenado = dict(sorted(dic1.items(),key=lambda item:item[1]))
print('Diccionario ordenado por valor \n',dic_ordenado)
return dic_ordenado
def combinarDiccionarios(dic1,dic2):
dic1.update(dic2)
print('Diccionario ordenado por valor calificaciones \n',dic1)
def mostrarCalificaciones2(dic1,dic2):
for key,value in dic1.items():
print('Codigo estudiante ',key)
print('calificaciones ',value)
print('calificacion final ',dic2[key])
dic1,dic2=formarDiccionarios(lcal,mcal,lfin)
dic1=ordenarDiccionarioValor(dic1)
dic3=dic1.copy()
combinarDiccionarios(dic1,dic2)
mostrarCalificaciones2(dic1,dic2)
programa completo
def leerInt(cadena):
while True:
try:
dato=int(input(cadena))
return dato
except ValueError:
print('Error de sintaxis: Digitar valor entero')
def leerFloat(cadena):
while True:
try:
dato=float(input(cadena))
return dato
except ValueError:
print('Error de sintaxis: Digitar valor real')
def leerCalificaciones(mcalif):
# ce=int(input('Cantidad de estudiantes ->'))
ce=leerInt('Cantidad de esuudiantes -> ')
lcod=[]
for i in range(ce):
print ('Información estudiante ',i+1)
lc=[]
lcod.append(leerInt('Codigo estudiante-> '))
lc.append(leerFloat('Calificacion 1 -> '))
lc.append(leerFloat('Calificacion 2 -> '))
lc.append(leerFloat('Calificacion 3 -> '))
mcalif.append(lc)
return lcod
def leerCalificaciones2():
# ce=int(input('Cantidad de estudiantes ->'))
lcod=[99,33,77,66,88,44]
mcalif=[[3,3,3],[5,5,5],[4,4,4],[5,5,5],[2,2,2],[2,2,2]]
print (lcod)
print (mcalif)
return lcod,mcalif
def calcularDefinitiva(lc,mc):
ldef=[]
for i in range(len(lc)):
ldef.append(mc[i][0]*.30+mc[i][1]*.30+mc[i][2]*.40)
return ldef
def formarDiccionarios(lc,mc,lf):
dic1={}
dic2={}
for i in range(len(lc)):
dic1[lc[i]]=lf[i]
dic2[lc[i]]=mc[i]
print('Diccionario 1\n',dic1)
print('Diccionario 2\n',dic2)
return dic1,dic2
def ordenarDiccionarios(dic1,dic2):
codigos_ord=sorted(dic1.keys())
dic_ordenado1={}
dic_ordenado2={}
for key in codigos_ord:
dic_ordenado1[key]=dic1[key]
dic_ordenado2[key]=dic2[key]
def ordenarDiccionarioValor(dic1):
dic_ordenado = dict(sorted(dic1.items(),key=lambda item:item[1]))
print('Diccionario ordenado por valor \n',dic_ordenado)
return dic_ordenado
def combinarDiccionarios(dic1,dic2):
dic1.update(dic2)
print('Diccionario ordenado por valor calificaciones \n',dic1)
def mostrarCalificaciones2(dic1,dic2):
for key,value in dic1.items():
print('Codigo estudiante ',key)
print('calificaciones ',value)
print('calificacion final ',dic2[key])
#programa principal
lcod,mcal=leerCalificaciones2()
print('Codigos Estudiantes \n',lcod)
print('Matriz de calificaciones \n',mcal)
lfin=calcularDefinitiva(lcod,mcal)
dic1,dic2=formarDiccionarios(lcod,mcal,lfin)
ordenarDiccionarios(dic1,dic2) #ordenamiento por clave
dic1=ordenarDiccionarioValor(dic1) #ordenamiento por valor
dic3=dic1.copy() #protege el diccionario ordenado por valor
combinarDiccionarios(dic1,dic2) #en dic1 quedan la califiaciones
mostrarCalificaciones2(dic1,dic3) #
Conjuntos
Creación de conjuntos
Para crear un conjunto basta con separar sus valores por comas y rodearlos de llaves {}:
>>> lottery = {21, 10, 46, 29, 31, 94}
>>> lottery
{10, 21, 29, 31, 46, 94}
La excepción la tenemos a la hora de crear un conjunto vacío, ya que, siguiendo la
lógica de apartados anteriores, deberíamos hacerlo a través de llaves:
>>> wrong_empty_set = {}
>>> type(wrong_empty_set)
dict
Conversión
Para convertir otros tipos de datos en un conjunto se puede usar la función set() sobre
cualquier iterable:
>>> set(‘aplatanada’)
{‘a’, ‘d’, ‘l’, ‘n’, ‘p’, ‘t’}
Obtener un elemento
En un conjunto no existe un orden establecido para sus elementos, por lo tanto no se
puede acceder a un elemento en concreto.
De este hecho se deriva igualmente que no se puede modificar un elemento existente,
ya que ni siquiera tenemos acceso al mismo. Python sí nos permite añadir o borrar
elementos de un conjunto.
Añadir un elemento
Para añadir un elemento a un conjunto se utiliza la función add(). Como ya se ha
indicado, al no importar el orden dentro del conjunto, la inserción no establece a priori la
posición donde se realizará.
Ejemplo de adición
• Entrada: ((4, 3), (8, 2), (7, 5), (8, 2), (9, 1))
• Salida:
{8, 9, 4, 7}
{1, 2, 3, 5}
Borrar elementos
Para borrar un elemento de un conjunto podemos utilizar la función remove(). Siguiendo
con el ejemplo anterior, vamos a borrar al último «beatle» añadido:
>>> beatles
{‘Best’, ‘Harrison’, ‘Lennon’, ‘McCartney’, ‘Starr’}
>>> beatles.remove(‘Best)
>>> beatles
{ ‘Harrison’, ‘Lennon’, ‘McCartney’, ‘Starr’}
Longitud de un conjunto
El número de elementos (cardinalidad) que tiene un conjunto se lo obtiene con la función
len():
>>> beatles
{ ‘Harrison’, ‘Lennon’, ‘McCartney’, ‘Starr’}
>>> len(beatles)
4
Pertenencia de elemento
Al igual que con otros tipos de datos, Python ofrece el operador in para determinar si un
elemento pertenece a un conjunto:
>>> beatles
{ ‘Harrison’, ‘Lennon’, ‘McCartney’, ‘Starr’}
>>> ‘Lennon’ in beatles
True
>>> ‘Fari’ in beatles
False
A partir de dos conjuntos 𝐴 = {1, 2} y 𝐵 = {2, 3}, ejemplificar las distintas
Teoría de conjuntos
operaciones que se pueden hacer entre ellos basadas en los Diagramas de Venn y la
Teoría de Conjuntos:
>>> A = {1, 2}
>>> B = {2, 3}
Diagramas de Venn
>>> A & B
{2}
>>> A.intersection(B)
{2}
>>> A | B
{1, 2, 3}
>>> A.union(B)
{1, 2, 3}
>>> A - B
{1}
>>> A.difference(B)
{1}
>>> A ^ B
{1, 3}
>>> A.symmetric_difference(B)
{1, 3}
incluidos en 𝐴.
• Un conjunto 𝐴 es un superconjunto de otro conjunto 𝐵 si todos los elementos de 𝐵
están incluidos en 𝐴.
Ejemplo con los siguientes conjuntos:
>>> A = {2, 4, 6, 8, 10}
>>> B = {4, 6, 8}
En Python podemos realizar comprobaciones de inclusión (subconjuntos y
superconjuntos)
𝐵⊂𝐴
utilizando operadores clásicos de comparación:
𝐵⊆𝐴
True
>>> B <= A
True
Ejercicio:
Se tienen dos matrices con datos numéricos, formar dos conjuntos con los primos de cada
matriz y realizar las operaciones de unión e intersección de conjuntos con estos dos
conjuntos
def leermatrices():
m1=[[5,7,5,],[3,3,2],[4,7,11]]
m2=[[5,7,4],[5,3,13],[2,19,13]]
return m1,m2
def leerMatriz():
m=[]
nf=int(input('Cantidad de filas -> '))
nc=int(input('Cantidad de columnas -> '))
for i in range(nf):
l1=[]
for j in range(nc):
l1.append(int(input(f'dato ({i},{j}) = ')))
m.append(l1)
return m
def primo(valor):
c=1
cd=0
while c<=valor :
if valor%c==0:
cd+=1
c+=1
if cd==2:
return True
else:
return False
def PrimosMatriz(m):
setprimos=set()
for i in range(len(m)):
for j in range(len(m[i])):
if primo(m[i][j]):
setprimos.add(m[i][j])
return setprimos
def unionConjuntos(pr1,pr2):
print('union de conjuntos ')
print('conjunto uno \n',pr1)
print('conjunto uno \n',pr2)
print('Union de conjuntos pr1 U pr1 forma 1',pr1|pr2)
print('Union de conjuntos pr1 U pr1 forma 2',pr1.union(pr2))
def interseccionConjuntos(pr1,pr2):
print('Intersección de conjuntos ')
print('conjunto uno \n',pr1)
print('conjunto uno \n',pr2)
print('Intersección de conjuntos pr1 & pr1 forma 1',pr1&pr2)
print('Intersección de conjuntos pr1 & pr1 forma 1',pr1.intersection(pr2))
#programa principal
m1,m2=leermatrices()
print('matriz uno \n',m1)
print('matriz dos \n',m2)
setPrimo1=PrimosMatriz(m1)
print('primos matriz 1 \n',setPrimo1)
setPrimo2=PrimosMatriz(m2)
print('primos matriz 2 \n',setPrimo2)
unionConjuntos(setPrimo1,setPrimo2)
interseccionConjuntos(setPrimo1,setPrimo2)
Ficheros
Aunque los ficheros encajarían más en un apartado de «entrada/salida» ya que
representan un medio de almacenamiento persistente, también podrían ser vistos como
estructuras de datos, puesto que permiten guardar la información y asignarles un cierto
formato.
Un fichero es un conjunto de bytes almacenados en algún dispositivo. El sistema de
ficheros es la estructura lógica que alberga los ficheros y está jerarquizado a través de
directorios (o carpetas). Cada fichero se identifica unívocamente a través de una ruta que
nos permite acceder a él.
Lectura de un fichero
Python ofrece la función open() para «abrir» un fichero. Esta apertura se puede realizar en
3 modos distintos:
23 29
23 31
26 34
23 33
22 29
22 28
22 28
La función open() recibe como primer argumento la ruta al fichero que queremos
manejar (como un «string») y devuelve el manejador del fichero, que en este caso lo
asigna a una variable llamada f pero se le podría haber puesto cualquier otro nombre.
Nota: Es importante dominar los conceptos de ruta relativa y ruta absoluta para el
trabajo con ficheros.
Hay que tener en cuenta que la ruta al fichero que abrimos (en modo lectura) debe
existir, ya que de lo contrario obtendremos un error:
>>> f = open(‘foo.txt’)
Una vez abierto el fichero ya se puede proceder a leer su contenido. Para ello Python
ofrece la posibilidad de leer todo el fichero de una vez o bien leerlo línea a línea.
Lectura completa de un fichero
Siguiendo con nuestro ejemplo de temperaturas, veamos cómo leer todo el contenido del
fichero de una sola vez. Para esta operación, Python nos provee, al menos, de dos
funciones:
read() Devuelve todo el contenido del fichero como una cadena de texto (str):
>>> f = open(‘files/temps.dat’)
>>> f.read()
‘23 29 \n23 31\n26 34\n23 33\n22 29\n22 28\n22 28\n’
readlines() Devuelve todo el contenido del fichero como una lista (list) donde cada
elemento es una línea:
>>> f = open(‘files/temps.dat’)
>>> f.readlines()
[‘23 29\n’, ‘23 31\n’, ‘26 34\n’, ‘23 33\n’, ‘22 29\n’, ‘22 28\n’, ‘22 28\n’]
Importante: Nótese que, en ambos casos, los saltos de línea \n siguen apareciendo en
los datos leídos, por lo que habría que «limpiar» estos caracteres. Para ello se
recomienda utilizar las funciones ya vistas de cadenas de texto.
>>> f = open(‘files/temps.dat’)
>>> for line in f: # that easy!
... print(line)
...
23 29
23 31
26 34
23 33
22 29
22 28
22 28
Truco: Igual que pasaba anteriormente, la lectura línea por línea también incluye el salto
de línea \n lo que provoca un «doble espacio» entre cada una de las salidas. Bastaría con
aplicar line.split() para eliminarlo.
Escritura en un fichero
Para escribir texto en un fichero hay que abrir dicho fichero en modo escritura. Para ello
se utiliza un argumento adicional en la función open() que indica esta operación:
>>> f = open(‘files/canary-iata.dat’, ‘w’)
Nota: Si bien el fichero en sí mismo se crea al abrirlo en modo escritura, la ruta hasta ese
fichero no. Eso quiere decir que se debe asegurar que las carpetas hasta llegar a dicho
fichero existen. En otro caso se obtien un error de tipo FileNotFoundError.
Ahora ya se puede hacer uso de la función write() para enviar contenido al fichero abierto.
Ejemplo llevar el contenido de una lista en fichero especificado. En este caso partimos de
los códigos IATA de aeropuertos de las Islas Canarias.
1 >>> canary_iata = (‘TFN’, ‘TFS’, ‘LPA’, ‘GMZ’, ‘VDE’, ‘SPC’, ‘ACE’, ‘FUE’)
2
3 >>> for code in canary_iata:
4 ... f.write(code + ‘\n’)
5 ...
6
7 >>> f.close()
Nótese:
Línea 4 Escritura de cada código en el fichero. La función write() no incluye el salto de
línea por defecto, así que lo añadimos de manera explícita.
Línea 7 Cierre del fichero con la función close(). Especialmente en el caso de la escritura
de ficheros, se recomienda encarecidamente cerrar los ficheros para evitar pérdida de
datos.
Añadido a un fichero
La única diferencia entre añadir información a un fichero y escribir información en un
fichero es el modo de apertura del fichero. En este caso utilizamos ‘a’ por «append»:
>>> f = open(‘more-data.txt’, ‘a’)
En este caso el fichero more-data.txt se abrirá en modo añadir con lo que las llamadas a
la función write() hará que aparezcan nueva información al final del contenido ya existente
en dicho fichero.
Usandos contextos
Python ofrece gestores de contexto como una solución para establecer reglas de entrada
y salida a un determinado bloque de código.
En el caso que nos ocupa, usaremos la sentencia with y el contexto creado se ocupará de
cerrar adecuadamente el fichero que hemos abierto, liberando así sus recursos:
29 23
31 23
34 26
33 23
29 22
28 22
28 22
Línea 1 Apertura del fichero en modo lectura utilizando el gestor de contexto definido por
la palabra reservada with.
Línea 2 Lectura del fichero línea a línea utilizando la iteración sobre el manejador del
fichero.
Línea 3 Limpieza de saltos de línea con strip() encadenando la función split() para separar
las dos temperaturas por el carácter espacio.
Línea 4 Imprimir por pantalla la temperatura mínima y la máxima.
Nota: Es una buena práctica usar with cuando se manejan ficheros. La ventaja es que el
fichero se cierra adecuadamente en cualquier circunstancia, incluso si se produce
cualquier tipo de error
Hay que prestar atención a la hora de escribir valores numéricos en un fichero, ya que el
método write() por defecto espera ver un «string» como argumento:
Importante: Para evitar este tipo de errores, se debe convertir a str aquellos valores que
queramos usar con la función write() para escribir información en un fichero de texto. Los
f-strings son tu aliado.
Ejercicio
Dado el fichero temperatures.txt con 12 filas (meses) y 31 columnas (temperaturas de
cada día), se pide:
26.29
23.65
25.84
24.35
27.03
24.52
27.90
26.39
26.32
25.71
27.32
26.00
Dentro del manejo de archivos es muy importante tener en cuenta las siguientes
funciones asociadas con cadenas
Función split() para dividir una cadena
Función sprit() para limpiar cadena
Esto porque en los archivos, lo que se almacena y recupera son string o cadenas.
Limpiar cadenas
Cuando se lee datos del usuario o de cualquier fuente externa de información, es
bastante probable que se incluyan en esas cadenas de texto, caracteres de relleno al
comienzo y al final. Python ofrece la posibilidad de eliminar estos caracteres u otros que
no interesen.
La función strip() se utiliza para eliminar caracteres del principio y del final de un «string».
También existen variantes de esta función para aplicarla únicamente al comienzo o
únicamente al final de la cadena de texto.
Ejemplo. Procesar un fichero con números de serie de un determinado artículo. Cada
línea contiene el valor que interesa pero se han «colado» ciertos caracteres de relleno
que debemos limpiar:
Nota: Si no se especifican los caracteres a eliminar, strip() usa por defecto cualquier
combinación de espacios en blanco, saltos de línea \n y tabuladores \t.
Para hacer «limpieza» por la izquierda (comienzo) y por la derecha (final) se utilizan la
función lstrip() y rstrip() respectivamente:
Ejemplo
Lista 6: «Left strip»
>>> serial_number.lstrip()
‘48374983274832 \n\n\t \t \n’
os.path.exists()
os operating system
El módulo del sistema operativo (os) proporciona múltiples funciones para interactuar con
el sistema operativo. Para comprobar si existe un archivo o carpeta podemos utilizar
el camino.existe () función que acepta la ruta al archivo o directorio como argumento.
Devuelve un valor booleano basado en la existencia de la ruta.
/home/daniel/.bashrc
O con rutas relativas, dependiendo del directorio en el que esté ejecutando el script:
.bashrc
# Running the script in my home folder
In [1]: import os
In [2]: os.path.exists('testfile.txt')
Out[2]: True
In [3]: os.path.exists('testdirectory')
Out[3]: True
In [4]: os.path.exists('hey-i-dont-exist')
Out[4]: False
os.path.isfile()
Si solo quisiera probar la existencia de un archivo (no un directorio), llamaría
al os.path.isfile () función.
In [1]: import os
In [2]: os.path.isfile('testfile.txt')
Out[2]: True
In [3]: os.path.isfile('testdirectory/')
Out[3]: False
In [4]: os.path.isfile('i-dont-even-exist')
Out[4]: False
In [5]: os.path.isfile('testdirectory/otherfile.txt')
Out[5]: True
Copy
Ejercicio.
El ejercicio anterior está determinado con menús para hacer un seguimiento lógico de la
información.
import os
sw1=False
def leerCalificacionesEstaticas():
# ce=int(input('Cantidad de estudiantes ->'))
lcod=[99,33,77,66,88,44]
mcalif=[[3,3,3],[5,5,5],[4,4,4],[5,5,5],[2,2,2],[2,2,2]]
print (lcod)
print (mcalif)
return lcod,mcalif
def leerCalificacionesTeclado(mcalif):
# ce=int(input('Cantidad de estudiantes ->'))
ce=leerInt('Cantidad de estudiantes -> ')
lcod=[]
for i in range(ce):
print ('Información estudiante ',i+1)
lc=[]
lcod.append(leerInt('Codigo estudiante-> '))
lc.append(leerFloat('Calificacion 1 -> '))
lc.append(leerFloat('Calificacion 2 -> '))
lc.append(leerFloat('Calificacion 3 -> '))
mcalif.append(lc)
return lcod
def leerCalificacionesArchivo():
fcal=open('calificaciones.dat')
lc=[]
lm=[]
lf=[]
lm1=[]
#fcal.readlines
# print(fcal.read())
for line in fcal:
lc1=fcal.readline().strip().split()
lc.append(int(lc1[0]))
lm1=[]
lm1.append(float(lc1[1]))
lm1.append(float(lc1[2]))
lm1.append(float(lc1[3]))
lm.append(lm1)
lf.append(float(lc1[4]))
def leerCalificacionesArchivo2():
try:
while True:
archivo=input('nombre del archivo ')
if os.path.exists(archivo):
fcal=open(archivo)
lc=[]
lm=[]
lf=[]
lm1=[]
lc1=fcal.readlines()
for cal in lc1:
lc1=cal.strip().split()
lc.append(int(lc1[0]))
lm1=[]
lm1.append(float(lc1[1]))
lm1.append(float(lc1[2]))
lm1.append(float(lc1[3]))
lm.append(lm1)
lf.append(float(lc1[4]))
print(lc)
print(lm)
print(lf)
return lc,lm,lf
else:
print('archivo no existe ')
print('Continuar S/N')
resp=input('opcion -> ')
if resp=='n' or resp=='N':
print('no se abre archivo')
return None,None,None
except FileNotFoundError:
print('Error problemas al abrir archivo ')
def leerInt(cadena):
while True:
try:
dato=int(input(cadena))
return dato
except ValueError:
print('Error de sintaxis: Digitar valor entero')
def leerFloat(cadena):
while True:
try:
dato=float(input(cadena))
return dato
except ValueError:
print('Error de sintaxis: Digitar valor real')
def calcularDefinitiva(lc,mc):
ldef=[]
for i in range(len(lc)):
ldef.append(mc[i][0]*.30+mc[i][1]*.30+mc[i][2]*.40)
return ldef
def ordenarCalificaciones(lc,mc,lf):
for i in range(len(lc)):
for j in range(i,len(lc)):
if lf[j]>lf[i]:
aux=lf[i]
lf[i]=lf[j]
lf[j]=aux
# para mentener referencia se debe hacer intercambiar
la listas
# relacionadas mc y lc
laux=mc[i].copy()
mc[i]=mc[j].copy()
mc[j]=laux.copy()
aux=lc[i]
lc[i]=lc[j]
lc[j]=aux
def promedioCalificaciones(lf):
prom=sum(lf)/len(lf)
print('\npromedio calificaciones = ',prom)
def ganadosPerdidos(lf):
cg=0
cp=0
for i in range(len(lf)):
if lf[i]>3:
cg=cg+1
else:
cp=cp+1
print('Estudiantes que ganaron la materia ',cg)
print('Estudiantes que perdieron la materia = ',cp)
def EstudiantesGanadosMateria(lc,lf):
cg=0
sg=0
for i in range(len(lf)):
if lf[i]>=3:
print('Codigo ',lc[i],' Calificacion -> ',lf[i])
cg=cg+1
sg=sg+lf[i]
if cg>0:
pr=sg/cg
print('Estudiantes que ganaron la materia ',cg)
print('Promedio de calificacion = ',pr)
def EstudiantesPerdieronMateria(lc,lf):
cp=0
sp=0
for i in range(len(lf)):
if lf[i]<3:
print('Codigo ',lc[i],' Calificacion -> ',lf[i])
cp=cp+1
sp=sp+lf[i]
if cp>0:
pr=sp/cp
print('Estudiantes que perdieron la materia ',cp)
print('Promedio de calificacion = ',pr)
def estudiantesNotaMayor(lc,lf):
mayor=max(lf)
def estudiantesNotaMenor(lc,lf):
menor=min(lf)
def mostrarCalificaciones(lc,mc,lf):
for i in range(len(lf)):
print(f'Codigo estudiante {lc[i]}')
print(f'n1 = {mc[i][0]}\n n2= {mc[i][1]}\n n3= {mc[i][2]}')
print('calificacion final -> ',lf[i])
def almacenarCalificaciones(lcod,mcal,lfin):
fcal=open('calificaciones.dat','w')
for i in range(len(lcod)):
fcal.write(str(lcod[i])+' '+str(mcal[i][0])+' '+str(mcal[i]
[1])+' '+str(mcal[i][2])+' '+str(lfin[i])+'\n')
fcal.close()
def listadoGeneral(lcod,mcal,lf):
lfin=calcularDefinitiva(lcod,mcal)
ordenarCalificaciones(lcod,mcal,lfin)
mostrarCalificaciones(lcod,mcal,lfin)
promedioCalificaciones(lfin)
ganadosPerdidos(lfin)
estudiantesNotaMayor(lcod,lfin)
estudiantesNotaMenor(lcod,lfin)
def almacenarCalificaciones2(lcod,mcal,lfin):
try:
while True:
archivo=input('nombre del archivo ')
if os.path.exists(archivo):
print('archivo existe. desea sobreescribirlo? ')
resp=input('S/N')
if resp=='s' or resp=='S':
fcal=open(archivo,'w')
else:
fcal=open(archivo,'a')
for i in range(len(lcod)):
fcal.write(str(lcod[i])+' '+str(mcal[i][0])+'
'+str(mcal[i][1])+' '+str(mcal[i][2])+' '+str(lfin[i])+'\n')
break
else:
print('archivo no existe ')
print('Continuar S/N')
resp=input('opcion -> ')
if resp=='n' or resp=='N':
return
fcal=open(archivo,'w')
for i in range(len(lcod)):
fcal.write(str(lcod[i])+' '+str(mcal[i][0])+'
'+str(mcal[i][1])+' '+str(mcal[i][2])+' '+str(lfin[i])+'\n')
print('se han grabado ',len(lcod),' Registros ')
os.system('pause')
sw=True
except FileNotFoundError:
print('Error problemas al abrir archivo ')
finally:
fcal.close()
def menuResultados(lc,mc,lf):
while True:
print ('Menu Resultados')
print('------------------------------')
print('1. Listado calificaciones ')
print('2. Ordenar Calificaciones ')
print('3. Estudiantes nota mayor ')
print('4. Estudiante nota menor ')
print('5. Estudiantes que ganaron ')
print('6. Estudiantes que perdieron')
print('7. Promedio Calificaciones ')
print('8. Listado general ')
print('9. Salir ')
print('------------------------------ ')
if opcion==1:
mostrarCalificaciones(lc,mc,lf)
elif opcion==2:
ordenarCalificaciones(lc,mc,lf)
elif opcion==3:
estudiantesNotaMayor(lc,lf)
elif opcion==4:
estudiantesNotaMenor(lc,lf)
elif opcion==5:
EstudiantesGanadosMateria(lc,lf)
elif opcion==6:
EstudiantesPerdieronMateria(lc,lf)
elif opcion==7:
promedioCalificaciones(lf)
elif opcion==8:
listadoGeneral(lc,mc,lf)
elif opcion==9:
break
def menuEvaluaciones():
while True:
print ('Menu Resultados')
print('------------------------------')
print('1. Evaluación 1 ')
print('2. Evaluación 2 ')
print('3. Evaluación 3 ')
print('4. Salir ')
print('------------------------------ ')
if opcion==1:
menuCalificaciones()
elif opcion==2:
menuEvaluaciones()
elif opcion==3:
menuTrabajos()
elif opcion==4:
break
def menuTrabajos():
while True:
print ('Menu Trabajos')
print('------------------------------')
print('1. Vectores ')
print('2. Matrices ')
print('3. Matrices Vectores ')
print('4. Cadenas')
print('5. Aplicación ')
print('6. Salir ')
print('------------------------------ ')
if opcion==1:
menuCalificaciones()
elif opcion==2:
menuEvaluaciones()
elif opcion==3:
menuTrabajos()
elif opcion==4:
break
def menuLeerCalificaciones():
while True:
print ('Menu Entrada de datos')
print('------------------------------')
print('1. Leer Calificaciones teclado ')
print('2. Definir calificaciones estáticas ')
print('3. Cargar Calificaciones Archivo ')
print('4. Salir')
print('------------------------------ ')
if opcion==1:
lc,mc=leerCalificacionesTeclado()
elif opcion==2:
lc,mc=leerCalificacionesEstaticas()
elif opcion==3:
lc,mc,lf=leerCalificacionesArchivo2()
elif opcion==4:
break
return lc,mc
def menuCalificaciones():
b=False
sw1=False
while True:
print ('Menu Calificaciones')
print('------------------------------')
print('1. Leer Calificaciones ')
print('2. Calcular Definitivas ')
print('3. Resultados Generales ')
print('4. Archivar información ')
print('5. Salir')
print('------------------------------ ')
if opcion==1:
if b==False:
lc,mc=menuLeerCalificaciones()
b=True
else:
print('ya se tienen calificaciones. ')
os.system("pause")
elif opcion==2:
if b==False:
print('no se han leido las calificaciones. Realizar
opcion 1.')
os.system("pause")
else:
lf=calcularDefinitiva(lc,mc)
elif opcion==3:
if b==False:
print('no se han leido las calificaciones. Realizar
opcion 1.')
os.system("pause")
else:
menuResultados(lc,mc,lf)
elif opcion==4:
if b==False:
print('no se tienen calificaciones. Realizar opcion
1.')
os.system("pause")
else:
if sw1==False:
almacenarCalificaciones2(lc,mc,lf)
sw1=True
elif opcion==5:
if sw1==False:
print('La información de calificaciones no se ha
actualizado en archivo ')
resp=input('Desea almacenarla s/n ')
if resp=='s' or resp=='S':
almacenarCalificaciones2(lc,mc,lf)
sw1=True
break
def menuGeneral():
while True:
print ('Menu Principal')
print('------------------------------')
print('1. Ejercicio calificaciones ')
print('2. Ejercicios examenes ')
print('3. Trabajos')
print('4. Salir ')
print('------------------------------ ')
if opcion==1:
menuCalificaciones()
elif opcion==2:
menuEvaluaciones()
elif opcion==3:
menuTrabajos()
elif opcion==4:
break
#programa principal
sw=False
menuGeneral()
Ejercicio
Trabajo con conjuntos y cadenas
Cadena1 con los dígitos sin repetidos y sin comunes de las dos
cadenas
def llenarCadena1(cad1,cad2):
cadena=''
for car in cad1:
if car.isdigit()==True:
c=car in cad2
if c==False:
b=car in cadena
if b==False:
cadena+=car
for car in cad2:
if car.isdigit()==True:
c=car in cad1
if c==False:
b=car in cadena
if b==False:
cadena+=car
return cadena
def llenarCadena2(cad1,cad2):
cadena=''
for car in cad1:
if car.isalpha()==True:
b=car in cad2
if b==True:
c=car in cadena
if c==False:
cadena+=car
return cadena
cadena1='ax1bxx2cda6dc'
cadena2='a7911cdfg328'
cad1=llenarCadena1(cadena1,cadena2)
cad2=llenarCadena2(cadena1,cadena2)
print('cadena 1 ',cad1)
print('cadena 2 ',cad2)
l1=list(cad1)
l1.sort()
cad3="".join(l1)
print(cad3)
l2=list(cad2)
l2.sort()
cad4="".join(l2)
print(cad4)
Solución 2 con conjuntos
def llenarCadena1(cad1,cad2):
sc1=set(cad1)
sc2=set(cad2)
sd1=set()
for car in cad1:
if car.isdigit():
sd1.add(car)
sd2=set()
for car in cad2:
if car.isdigit():
sd2.add(car)
sdif=sd1.symmetric_difference(sd2)
l1=list(sdif)
l1.sort()
cad3="".join(l1)
return cad3
def llenarCadena2(cad1,cad2):
sc1=set(cad1)
sc2=set(cad2)
sd1=set()
for car in cad1:
if car.isalpha():
sd1.add(car)
sd2=set()
for car in cad2:
if car.isalpha():
sd2.add(car)
sdif=sd1.intersection(sd2)
l1=list(sdif)
l1.sort()
cad3="".join(l1)
return cad3
cadena1='ax1bxx2cda6dc'
cadena2='a7911cdfg328'
cad1=llenarCadena1(cadena1,cadena2)
cad2=llenarCadena2(cadena1,cadena2)
print('cadena 1 ',cad1)
print('cadena 2 ',cad2)
Ejercicio
Realizar un programa que permita manjar la clasificación de un torneo
de fútbol, con una cantidad dada de equipos. El programa debe
permitir manejar la siguiente información:
Cantidad de equipos
Nombre del equipo
Puntos por cada partido
Goles favor
Goles contra
Por cada fecha se tiene uno de los siguientes valores que significan
la cantidad de puntos obtenida.
0 partido perdido
1 partido empatado
3 partido ganado
Se solicita:
La primera vez que se hace la entrada de la información puede ser por teclado o en forma
estática.
A partir de la segunda, la información se la carga desde un archivo
El siguiente ejercicio no tiene en cuenta los goles a favor y los goles en contra, dato
importante para obtener orden en la clasificación cuando hay puntajes similares.
El nombre del archivo que se le va a dar para almacenar la información, debe ser sin
extensión o .txt
En los nombres de los equipos debe tener presente no incluir espacios en blanco
Esta realizado con menús, los cuales establecen un orden para su ejecución.
import os
sw1=False
def leerInformacionEstaticas():
# ce=int(input('Cantidad de estudiantes ->')
Ce=10
lequipos=['equipo1','equipo2','equipo3','equipo4',
'equipo5','equipo6','equipo7','equipo8','equipo9','equipo10']
partidos=[[0,1,0,0,0,1,3,3,1,0],[0,1,1,1,0,1,3,3,1,0],
[0,1,0,0,0,1,3,3,1,0],[0,1,1,1,0,1,3,3,1,0],
[0,1,3,3,0,1,1,1,1,0],[0,1,0,0,0,1,3,3,1,0],
[0,1,1,0,0,1,3,1,1,0],[0,1,1,3,0,1,0,0,1,0],
[3,1,3,3,0,1,1,0,1,0],[3,1,0,3,0,1,1,3,1,1]]
print (lequipos)
print (partidos)
return lequipos,partidos
def leerInformacionTeclado():
# ce=int(input('Cantidad de estudiantes ->'))
ce=leerInt('Cantidad de equipos-> ')
lequipos=[]
partidos=[]
for i in range(ce):
print ('Información equipos ',i+1)
lp=[]
lequipos.append(leerInt('nombre del equipo -> '))
print('puntos por partido')
for i in range(11):
lp.append(leerInt(f'partido {i} -> '))
partidos.append(lp)
return lequipos,partidos
def leerInformacionArchivo2():
try:
while True:
archivo=input('nombre del archivo ')
if os.path.exists(archivo):
fcal=open(archivo)
lequipo=[]
lpartidos=[]
lm1=[]
lequipo1=fcal.readlines()
for equi in lequipo1:
lequi=equi.strip().split()
lequipo.append(lequi[0])
lm1=[]
for i in range(1,11):
lm1.append(int(lequi[i]))
lpartidos.append(lm1)
print('información equipos ')
for i in range(11):
print('equipo ',lequipo)
print('partidos ',lpartidos)
return lequipo,lpartidos
else:
print('archivo no existe ')
print('Continuar S/N')
resp=input('opcion -> ')
if resp=='n' or resp=='N':
print('no se abre archivo')
return None,None
except FileNotFoundError:
print('Error problemas al abrir archivo ')
def leerInt(cadena):
while True:
try:
dato=int(input(cadena))
return dato
except ValueError:
print('Error de sintaxis: Digitar valor entero')
def leerFloat(cadena):
while True:
try:
dato=float(input(cadena))
return dato
except ValueError:
print('Error de sintaxis: Digitar valor real')
def calcularPuntuacion(le,lp):
lfinal=[]
for equi in lp:
sum=0
for r in equi:
sum+=r
lfinal.append(sum)
print(le)
print(lfinal)
return lfinal
def calcularClasificacion(le,lpar,lf):
for i in range(len(le)):
for j in range(i,len(le)):
if lf[j]>lf[i]:
aux=lf[i]
lf[i]=lf[j]
lf[j]=aux
# para mentener referencia se debe hacer intercambiar
la listas
# relacionadas mc y lc
laux=lpar[i].copy()
lpar[i]=lpar[j].copy()
lpar[j]=laux.copy()
aux=le[i]
le[i]=le[j]
le[j]=aux
def promedioPuntuacion(lf):
prom=sum(lf)/len(lf)
print('\npromedio de puntuaciones = ',prom)
def equiposMayorPuntuacion(lc,lf):
mayor=max(lf)
def equiposMenorPuntuacion(lc,lf):
menor=min(lf)
def mostrarPuntuacion(lc,mc,lf):
for i in range(len(lf)):
print(f'equipo {lc[i]}')
print(mc[i])
print('puntuación final -> ',lf[i])
def almacenarCalificaciones(lcod,mcal,lfin):
fcal=open('calificaciones.dat','w')
for i in range(len(lcod)):
fcal.write(str(lcod[i])+' '+str(mcal[i][0])+' '+str(mcal[i]
[1])+' '+str(mcal[i][2])+' '+str(lfin[i])+'\n')
fcal.close()
def almacenarInformacion2(lcod,mpar):
try:
while True:
archivo=input('nombre del archivo ')
if os.path.exists(archivo):
print('archivo existe. desea sobreescribirlo? ')
resp=input('S/N')
if resp=='s' or resp=='S':
fcal=open(archivo,'w')
else:
fcal=open(archivo,'a')
else:
print('archivo no existe ')
print('Continuar S/N')
resp=input('opcion -> ')
if resp=='n' or resp=='N':
return
fcal=open(archivo,'w')
for i in range(len(lcod)):
registro=lcod[i]
for j in range(len(mpar[i])):
registro=registro+' '+str(mpar[i][j])
registro=registro+'\n'
fcal.write(registro)
print('se han grabado ',len(lcod),' Registros ')
os.system('pause')
sw=True
break
except FileNotFoundError:
print('Error problemas al abrir archivo ')
finally:
fcal.close()
def menuLeerInformacion():
while True:
print ('Menu Entrada de datos')
print('------------------------------')
print('1. Leer partidos teclado ')
print('2. Definir partidos estáticas ')
print('3. Cargar Partidos Archivo ')
print('4. Salir')
print('------------------------------ ')
if opcion==1:
le,lp=leerInformacionTeclado()
elif opcion==2:
le,lp=leerInformacionEstaticas()
elif opcion==3:
le,lp=leerInformacionArchivo2()
elif opcion==4:
break
return le,lp
def menuTorneo():
b=False
sw1=False
while True:
print('-----------------------------')
print ('Menú Torneo Futbol')
print('------------------------------')
print('1. Leer Información equipos ')
print('2. Calcular puntuación ')
print('3. Obtener Clasificación ')
print('4. Almacenar información ')
print('5. Mostrar Puntuación ')
print('6. Salir ')
print('------------------------------ ')
if opcion==1:
if b==False:
lc,mc=menuLeerInformacion()
if len(lc)>0:
b=True
else:
print('no se tienen información. Opcion 1 ')
os.system('pause')
else:
print('ya se tiene información. ')
os.system("pause")
elif opcion==2:
if b==False:
print('no se han leido información. Realizar opcion
1.')
os.system("pause")
else:
lf= calcularPuntuacion(lc,mc)
elif opcion==3:
if b==False:
print('no se han leido información. Realizar opcion
1.')
os.system("pause")
else:
calcularClasificacion(lc,mc,lf)
elif opcion==4:
if b==False:
print('no se tienen información. Realizar opcion 1.')
os.system("pause")
else:
if sw1==False:
almacenarInformacion2(lc,mc)
sw1=True
elif opcion==5:
if b==False:
print('no se tienen información. Realizar opcion 1.')
os.system("pause")
else:
if sw1==False:
mostrarPuntuacion(lc,mc,lf)
sw1=True
elif opcion==6:
if sw1==False:
print('La información no se ha actualizado en
archivo ')
resp=input('Desea almacenarla s/n ')
if resp=='s' or resp=='S':
almacenarInformacion2(lc,mc)
sw1=True
#programa principal
sw=False
menuTorneo()