Apunte Programaci N Mejoras (V1.daniel)
Apunte Programaci N Mejoras (V1.daniel)
Apunte Programaci N Mejoras (V1.daniel)
2021
Universidad de Concepción
3. Funciones 20
3.1. Crear y llamar a una función . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2. Funciones con retorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.3. Ejercicios usando funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.4. Soluciones propuestas de los ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . 24
4. Strings 27
4.1. Operaciones y funciones básicas con strings . . . . . . . . . . . . . . . . . . . . . . 28
4.2. Indexación y cómo recorrer un string . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.2.1. Sub-cadena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
iii
iv
5. Listas 35
5.1. Crear listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.1.1. Lista de listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.2. Operadores básicos en listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.3. Indexación en listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.4. Funciones básicas para listas numéricas . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.5. Métodos más comunes con listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.5.1. Método split . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.5.2. Método join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.6. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.7. Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6. Arreglos 45
6.1. Introducción al paquete Numpy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.2. Creación manual de arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6.2.1. Vectores con el comando array . . . . . . . . . . . . . . . . . . . . . . . . . 47
6.2.2. Matrices con el comando array . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.3. Indexación en arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.4. Funciones y operaciones con arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.4.1. Creaciones de arreglos por medio de funciones . . . . . . . . . . . . . . . . 50
6.4.2. Atributos de un arreglo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.4.3. Operaciones con arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.6. Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7. Archivos 56
7.1. Creación de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
7.2. Lectura de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7.3. Agregar información a un archivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7.4. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
7.5. Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Universidad de Concepción
ÍNDICE DE CUADROS
v
CAPÍTULO
Computador, con raı́z del latı́n computare, es como llamamos al aparato que la ma-
yorı́a dispone en sus hogares. Este, como dice su nombre, realiza cómputos en frac-
ciones de segundo que permiten la realización de diversas tareas.
Entender cómo funciona un computador se vuelve necesario al momento de enfren-
tarse a problemas o nuevos desafios. Ası́, en este capı́tulo se describen las partes más
importantes que constituyen un computador y sus funciones dentro del mismo.
1
2 Capı́tulo inicial: Cómo funciona un computador
1.1. Procesador
El procesador, también conocido como CPU, es quien lleva a cabo casi la totalidad
del trabajo que un computador necesita, lo cual consiste en realzar cálculos y cum-
plir instrucciones; todo lo que ocurre en el dispositivo pasa por el procesador.
1.2. Almacenamiento
Las unidades de almacenamiento son las encargadas de guardar los datos, esto en
lenguaje binario. Hoy, dada la alta velocidad de transferencia de datos que los usua-
rios requieren, suelen ser de uso común los discos SSD y memorias M.2, dejando ya
de lado los clásicos discos duros mecánicos (HDD).
Para efectuar sus computos y dar vida al computador, el procesador debe ser ali-
mentado constantemente de datos. Si bien estos tiene su unidad de almacenamien-
to, para el uso cotidiano, ese envı́o de datos serı́a muy lento y dificultarı́a un uso
efectivo del dispositivo.
La memoria RAM, de la sigla en inglés Random Access Memory, fue concebida como
solución al problema antes expuesto. Esta actúa como mediadora entre el almace-
namiento y el procesador, permitiendo cargar datos para su uso en el corto plazo,
agilizando el funcionamiento del sistema. Esta memoria almacena los datos de aque-
llo que el procesador se encuentre ejecutando en el momento, en tiempo real, por
ejemplo, este libro.
INTRODUCCIÓN A LA PROGRAMACIÓN
BÁSICA EN PYTHON
4
Capı́tulo 1: Introducción a la programación básica en Python 5
2.1. Variables
Para iniciar es necesario entender qué es una variable dentro del contexto de progra-
mación, dado que, a pesar de ser un nombre común dentro de distintas disciplinas,
para nuestro intereses se refiere a algo particular.
Las variables son usadas para almacenar información, con la finalidad de ser ma-
nipulada y referenciada. Estas son comunmente alojadadas en la memoria RAM de
nuestros dispositivos (VALIDAR CON EL PROFE).
Al generar una variable dentro de un entorno de programación, esta ha de contener
Identificador único.
Tipo de dato.
Valor.
Ası́, la instrucción dada se puede resumir en: podemos llamar .a.al objeto número
entero 2. La variable a es como una etiqueta que permite referenciar al objeto ”2”,
más cómoda de recordar y utilizar que el identificador del objeto.
En Python, las variables actúan como etiquetas que establecen referencia a los datos,
ya que estos son guardados en objetos. (REVISAR Y PREGUNTAR AL PROFE)
Tipo Significado
int Un número entero
float Un número en punto flotante
complex Un número complejo
str String o cadena de sı́mbolos
list Una lista
Cuadro 2.1: Tipos de datos más comunes
Para conocer el tipo de dato que es una variable se usa el comando type()
Los tipos de datos en un lenguaje de programación determinan los valores y las
operaciones que se pueden aplicar a una variable. Por ejemplo div y mod son
válidas para números enteros pero no para valores de punto flotante.
Python usa tipado dinámico, es decir, una variable puede tomar un tipo de dato a
través de la asignación de un valor como resultado de la evaluación de una expresión
aritmética, y luego, dentro del mismo programa, esa misma variable puede cambiar
el tipo de dato al asignarle otro valor, resultado de la evaluación de otra expresión.
Operación Sintaxis
a+b a+b
a−b a-b
ab a*b
a/b a/b
ab a**b
a div b a//b
a mod b a %b
De las operaciones presentadas en el cuadro 2.2 es probable que las últimas dos sean
poco recordadas o desconocidas. Por ello, a continuación, presentamos una breve
explicación.
División entera (a div b): Consiste en realizar la división obteniendo como re-
sultado solo la parte entera del cociente.
Módulo (a mod b): Esta operación entrega el resto de realizar una división
entera.
Ahora, como ejemplo de aplicación de la sintaxis, calcularemos el siguiente valor:
32 (1 + 3 − 2) mod (5 div 2)
Los operadores de comparación, como bien dice su nombre, se usan para comparar
datos entre sı́, si son numéricos se puede ver si son mayores o menores que otros,
mientras que si son de cualquier tipo se puede comparar si son iguales o distintos.
A continuación, se muestra el cuadro con las sintaxis de estas comparaciones:
Sintaxis Significado
== Igual
!= Distinto
< Menor
> Mayor
<= Menor o igual
>= Mayor o igual
Cuadro 2.4: Operadores de comparación en Python
Al igual que los operadores lógicos, estas comparaciones nos entregan un valor de
verdad. Veremos el siguiente ejemplo:
Ahora se mostrará el uso de cada uno de estos comandos, como observación, sólo
se puede convertir de un tipo a otro si es posible hacerlo, por ejemplo, no se puede
convertir un string a un número tipo float si está formado con letras.
Mientras que las estructuras de repetición en Python son while y for, la es-
tructura while se le agrega una o más condiciones, y mientras esa condición se
siga cumpliendo, el bucle seguirá en marcha. El ciclo se detendrá cuando la condi-
ción deje de cumplirse. En cambio, la estructura for se le debe asignar un rango
con el cual se trabajará.
1 n=int(input(’n= ’))
2 suma=0
3 for k in range(1,n+1):
4 suma=suma+(2**k)/(5+k**3)
5 print(suma)
Código 2.8: Solución ejemplo 3.2 Estructura for
Para resolver esto se utiliza un doble ciclo for, uno para el producto y otro para la
suma:
1 n=int(input(’n= ’))
2 producto=1
3 for k in range(1,n+1):
4 suma=0
5 for i in range(1,k+1):
6 suma=suma+i
7 producto=producto*suma
8 print(producto)
Código 2.9: Solución ejemplo 3.3 Estructura for
Ejemplo de entrada: 0 0 2 0
Ejemplo de salida: 4
Ejemplo de entrada: 3
Ejemplo de salida: 10, es par.
Ejemplo de entradas: 3, 5, 2
Ejemplo de salida: 59049
FUNCIONES
Las funciones en python son muy útiles para crear subprogramas que deben rea-
lizar una misma acción en varias ocasiones, debido a que estas cumplen el rol de
realizar esa acción sin la necesidad de programar todo cada vez que se necesite.
En este capı́tulo se verá en forma simple, el cómo crear y utilizar las funciones.
20
Capı́tulo 2: Funciones 21
Los parámetros son variables que reciben valores desde la llamada de la función
y que permiten la ejecución de la tarea para la cual la función fue construida.
Para llamar a una función, es decir, utilizarla en algún momento del programa, sólo
se tiene que escribir el nombre de la función junto con los parámetros a usar entre
paréntesis.
Sı́ se admite que una función no tenga parámetros, aun ası́, se deben necesaria-
mente colocar los paréntesis.
Ejemplo 1: Desplegar un saludo
1 def sumadepotencia(a,b):
2 s=0
3 for i in range(0,a+1):
4 s=s+b**i
5 return s
6 c=sumadepotencia(4,5)
7 print(c) #El resultado que despliega es 781
Código 3.3: Ejemplo de función con retorno
0, 1, 1, 2, 3, 5, 8, 13 . . .
Ejemplo de entrada: 5, 7
Ejemplo de salida: 11
Ejemplo de entrada: 0, 1, 2, 5
Ejemplo de salida: y = 2.0x - 1.0
Ejercicio 2.3: Serie de taylor Construir un programa tal que despliegue una apro-
ximación del valor de sin(x) y de cos(x) donde x es un valor real a ingresar, usando
sumas parciales de las series de Taylor:
∞ ∞
X (−1)n 2n+1 X (−1)n
sin(x) = x , cos(x) = x2n
n=0
(2n + 1)! n=0
(2n)!
Entradas: 2 entradas, una para la cantidad de sumas parciales p > 1 y otra para el
valor x
Salidas: El resultado de la aproximación para sin(x) y el para cos(x)
STRINGS
Se sabe que a las cadenas de sı́mbolos se les llama strings, en este capı́tulo se verán
varias formas en las que se puede trabajar con ellas, ejemplos de cómo usar la inde-
xación de una, los métodos relacionados a estas, y unos ejercicios donde se mezclará
lo aprendido en este capı́tulo y los dos anteriores.
27
28 Capı́tulo 3: Strings
Concatenación: Para unir dos strings en uno solo, se usa el operador “+”
Es decir, si se tiene lo siguiente: ‘Uno’+‘Dos’, el resultado será: ‘UnoDos’
Largo de una cadena: Cuando se habla del largo de una cadena, hacemos referen-
cia a la cantidad de sı́mbolos que tiene, para calcularlo se usa el comando len()
donde el string a calcular su cantidad de sı́mbolos se coloca dentro de los paréntesis,
como ejemplo, si hacemos: len(‘ABCD12$’) el resultado serı́a 7
1 a=input(’Ingresar cadena: ’)
2 for i in range(0,len(a)):
3 print(a[i])
Código 4.1: Solución de recorrer una cadena de izquierda a derecha
1 a=input(’Ingresar cadena: ’)
2 for i in range(-1,-len(a)-1,-1):
3 print(a[i])
Código 4.2: Solución de recorrer una cadena de derecha a izquierda
4.2.1. Sub-cadena
Además de poder accerder a un elemento especı́fico de una cadena usando los ı́ndi-
ces, se puede acceder a una sub-cadena o segmento de una cadena al colocar un
intervalo como ı́ndice, Estos intervalos son de la forma: [a:b:c] donde a es el
número del ı́ndice por donde empieza el intervalo, b es el ı́ndice donde termina y
c indica cómo se irán tomando los elementos. si sólo se coloca [a:b] entonces se
asume el c como 1.
Ejemplo 2.1: El siguiente programa despliega la cadena ‘aea’ que son elementos del
string ‘cadena1234’ con ı́ndices 1, 3 y 5 respectivamente. No considera el elemento
con ı́ndice 7 porque el último elemento del intervalo no se considera.
1 a=’Cadena1234’
2 print(a[1:7:2])
Código 4.3: Ejemplo 1 de sub-cadena
Ejemplo 2.2: Usando la misma cadena del ejemplo anterior se desplegará ‘4321’
dos veces, uno sin usar el comando len y otro donde sı́ se usa:
1 a=’cadena1234’
2 print(a[-1:-5:-1])
3 print(a[len(a)-1:5:-1])
Código 4.4: Ejemplo 2 de sub-cadena
Métodos de análisis:
Métodos de transformación:
Nombre Uso
Retorna la cadena con su primera letra en
capitalize()
mayúscula.
Alinea una cadena en el centro, tomando un
argumento en los paréntesis que indica la can-
center()
tidad de caracteres respecto de la cual se pro-
ducirá la alineación.
Misma función de alineación, pero ahora hacia
ljust()
la izquierda.
rjust() En este caso la alineación es hacia la derecha.
Retorna una copia de la cadena con todas sus
lower()
letras en minúsculas.
De manera parecida a la anterior, pero ahora
upper()
en mayúsculas.
Remueve los espacios en blanco que preceden
strip()
y suceden a la cadena.
Reemplaza una subcadena por otra. Se deben
ingresar ambas cadenas dentro de los parénte-
sis en el orden del cambio, y separándolas con
replace() una coma. La cantidad máxima de cambios (en
caso de que halla más de una subcadena igual
a la que se quiera cambiar), se coloca después
de las dos cadenas.
Cuadro 4.2: Algunos métodos de transformación para strings
Ejercicio 3.2: Verificación de clave Un banco ha decidido que las claves de sus
clientes tuvieran una alta complejidad para ası́ disminuir los hackeos de cuenta. Es-
ta clave debe tener al menos 25 caracteres, y ser una combinación de minúsculas,
mayúsculas y números, además de no tener espacios. Crea un programa que verifi-
que si una clave ingresada satisface estas condiciones, en caso de que lo cumpla o
no, que se despliegue el mensaje diciéndolo.
Entradas: Sólo 1 la cual es la clave por verificar
Salidas: Un mensaje diciendo si la clave cumple o no cumple las condiciones.
1 Con=input(’Ingresar c: ’)
2 #Se comprobará que tenga al menos 25 carácteres
3 if len(Con) < 25:
4 print(’Clave inválida’)
5 else:
6 # Se probará si tiene números
7 c=0
8 for i in range(0,len(Con)):
9 V=Con[i].isnumeric()
10 if V == False:
11 c=c+1
12 if c == len(Con) or c == 0:
13 print(’Clave inválida’)
14 else:
15 # Ahora se verá que tenga minúsculas, mayúsculas y no ←-
tenga espacios
16 if Con.upper() != Con and Con.lower() != Con and Con.←-
replace(’ ’,’’) == Con:
17 print(’Clave válida’)
18 else:
19 print(’Clave inválida’)
Código 4.6: Solución ejercicio 3.2
LISTAS
Una lista es otro tipo de dato, que a la vez es una estructura que pue puede almace-
nar una gran variedad de elementos de iguales o distintos tipos de datos. Debido a
esto resultan de mucha utilidad en la creación de programas.
35
36 Capı́tulo 4: Listas
Otra manera de crear una lista es la de elemento por elemento, la cual se puede
hacer de diferentes formas, que se verán más adelante.
Suma entre listas: Los elementos de la lista sumada, pasarán a ser elementos de
la primera lista, ordenadas de la misma manera y después del último elemento que
tenı́a originalmente la primera lista.
Ejemplo:
1 # La operación suma:
2
3 [1,2,’a’]+[’a’,3,34,’b’]
4
5 # Entrega como resultado: [1, 2, ’a’, ’a’, 3, 34, ’b’]
Código 5.1: Suma de listas
Lista por un natural: Si se multiplica una lista por un número natural, el resultado
entrega una lista con los mismos elementos, pero repetidos las veces que indica el
número por el cual se multiplicó, en el mismo orden.
Ejemplo:
1 # La operación multiplicación:
2
3 3*[’a’,3]
4
5 # Entrega como resultado:[’a’, 3, ’a’, 3, ’a’, 3]
Código 5.2: Natural por una lista
Cabe mencionar, que al igual que las cadenas, el comando len() se puede usar en
las listas, y entrega la cantidad de elementos que tiene la lista.
Ejemplo 2: Si se quiere obtener un elemento de una lista que está dentro de otra
lista, se debe colocar primero la posición en la que está esa lista en la lista más
grande y después la posición del elemento a buscar en la lista pequeña, como se ve
en el ejemplo:
1 # Si se quiere obtener el elemento ’1’ de:
2 LL=[1,2,[’1’,1,’c’],’a’]
3 # La lista más chica tiene el ı́ndice 2 como elemento
4 # El ’1’ tiene como ı́ndice 0 en la sub-lista
5
6 ElementoPedido=LL[2][0]
Código 5.4: Ejemplo 2 Índices de elementos en listas
Función min: La función min() lo que hace es calcular el mı́nimo valor que está
en la lista colocada dentro de los paréntesis.
1 L=[1.5,2.7,9,-3.4]
2 Minimo=min(L)
3 print(Minimo)
4 #Despliega -3.4
Código 5.5: Ejemplo de la función min
1 L=[1.5,2.7,9,-3.4]
2 Maximo=max(L)
3 print(Maximo)
4 #Despliega 9
Código 5.6: Ejemplo de la función max
Función sum: Calcula la suma total de todos los elementos de la lista ingresada.
1 L=L=[1.5,-3.4,0.9,4]
2 Suma=sum(L)
3 print(Suma)
4 #Despliega 3.0
Código 5.7: Ejemplo de la función sum
Nombre Uso
Añade un elemento puesto dentro de los
append() paréntesis al final de la lista (string, o numéri-
co).
clear() Elimina todos los elementos de la lista.
Añade todos los elementos de una lista ingre-
extend()
sada dentro de los paréntesis a la otra.
Cuenta todas las veces que un elemento es-
count()
pecı́fico aparece en la lista.
Entrega el número del ı́ndice del primer ele-
index() mento de la lista igual al ingresado, si no hay
ninguno, marca error
Se ingresan 2 variables, primero el ı́ndice don-
de se quiere guardar un nuevo dato para la lis-
insert() ta, y el segundo, es el nuevo dato. Si se ingresa
un ı́ndice fuera de rango, el dato lo añade al
final.
Extrae el elemento solicitado de la lista y des-
pop()
pués lo elimina de ella.
Borra el primer elemento de la lista que coin-
remove()
cida con el puesto dentro de los paréntesis.
Ordena los elementos de la lista de forma in-
reverse()
versa. (“Da la vuelta a la lista”)
Ordena los elementos de la lista de menor a
sort() mayor los datos numéricos (int y float), y al-
fabéticamente los strings
Cuadro 5.1: Métodos para listas
Ejemplo 1: Se creará una lista donde cada elemento es una palabra de la frase
“ Esta es una cadena de ejemplo”, como se quiere separar por espacios, se puede
usar el comando por defecto.
1 A=’a-b-c-d-e’
2 L=A.split(’-’,3)
3 print(L)
4 # Se despliega: [’a’, ’b’, ’c’, ’d-e’]
Código 5.9: Ejemplo 2 método split
separador.join(cadena.split(separador))
5.6. Ejercicios
Ejercicio 4.1: Conjunto potencia Crear un programa en Python capaz de generar
el conjunto potencia (o de partes) de un conjunto de 3 elementos.
Entrada: Una cadena con 3 elementos separados por espacios (se asumirá que el
ingreso sea correcto).
Salida: El conjunto de partes del conjunto con los datos ingresados.
Ejemplo de entrada: 1 2 3
Ejemplo de salida:
{’’, {’1’}, {’2’}, {’3’}, {’1’, ’2’}, {’1’, ’3’}, {’2’, ’3’}, {’1’, ’2’, ’3’}}
Ejercicio 4.3: Notas y estudiantes Un profesor quiere ordenar todas las notas
finales con respecto a cada estudiante en una sola lista, para esto le pide a un co-
nocido que le creara un programa en Python donde él pueda ingresar cada nombre
de sus estudiantes con sus respectivas 2 notas, y que el programa le despliegue una
lista donde cada elemento es una lista que tiene el nombre y la nota promedio de
cada estudiante y que estén ordenadas por el valor de la nota (escalada del 1.0 al
7.0) de mayor a menor, y que además se despliegue una lista con los nombres de
quienes reprobaron. (Hay que tener en cuenta que la lista de alumnos es de 30)
5.7. Soluciones
1 C=input(’Ingresar elementos del conjunto: ’)
2
3 # Crear lista de elementos
4 L=C.split()
5
6 # Crear lista de subconjuntos
7 K=[’’]
8 for i in range(0,len(L)):
9 K.append([L[i]])
10 for l in range(0,len(L)-1):
11 for s in range(l+1,len(L)):
12 K.append([L[l],L[s]])
13 K.append(L)
14 K=str(K).replace(’[’,’{’).replace(’]’,’}’)
15 print(K) #Despliega lo pedido
Código 5.12: Solución ejercicio 4.1
1 n=input(’Ingresar datos: ’)
2
3 # Verificación de que sean datos numéricos positivos
4 while True:
5 L=n.split(’,’)
6 c=0
7 for i in range(0,len(L)):
8 if L[i].replace(’.’,’’,1).isnumeric() == True:
9 c=c+1
10 if c == len(L):
11 Ln=[]
12 for i in range(0,len(L)):
13 Ln.append(float(L[i]))
14 break
15 else:
16 n=input(’Error, Ingresar datos de nuevo: ’)
17 # Cálcular el rango
18 R=max(Ln)-min(Ln)
19
20 # Calcular la varianza
21 N=len(Ln)
22 promedio=sum(Ln)/N
23 Sdif=0
24 for i in range(0,N):
25 Sdif=Sdif+(Ln[i]-promedio)**2
26 varianza=Sdif/N
27
28 # Desplegar la lista
29 print([R,varianza])
Código 5.13: Solución ejercicio 4.2
ARREGLOS
Los arreglos en Python son los equivalentes de las matrices y vectores de las ma-
temáticas. Una gran motivación para usar arreglos, es que hay mucha teorı́a detrás
de ellos que puede ser usada en el diseño de algoritmos para resolver problemas
verdaderamente interesantes.
Los arreglos tienen una gran utilidad (superior a las listas) ya que es una estructura
de datos que sirve para almacenar grandes secuencias de números (generalmente
de tipo float)
Sin embargo, tienen restricciones que se deben tomar muy en cuenta antes de tra-
bajar con ellos:
Todos los elementos del arreglo deben tener el mismo tipo de dato
En general, el tamaño del arreglo es fijo (no va cambiando su tamaño como las
listas a través de métodos)
Para trabajar con arreglos en Python, es necesario importar el paquete Numpy.
45
46 Capı́tulo 5: Arreglos
Ejemplo: Una de las funciones de Numpy es median lo que hace es calcular la me-
diana de un conjunto de números. Para llamar a esta función y calcular la mediana
de un conjunto x se puede hacer lo siguiente:
1 import numpy as np
2 x=[1,2,3,1]
3 s=np.median(x)
4 print(s)
5 #Se despliega 1.5
Código 6.1: Ejemplo 1 de llamar una función en Numpy
Para llamar sólo a la función y evitar escribir el (np.) cada vez que se usa la función,
es la siguiente:
1 from numpy import median
2 x=[1,2,3,1]
3 s=median(x)
4 print(s)
5 #Se despliega 1.5
Código 6.2: Ejemplo 2 de llamar una función en Numpy
Las listas también se pueden definir en una variable y luego convertirla en vector
con sólo colocar el nombre de la variable asignada, es decir:
1 import numpy as np
2 # Escribir:
3 L=[1,2,3,4]
4 V=np.array(L)
5 # Es lo mismo que hacer:
6 V=np.array([1,2,3,4])
Código 6.4: Convertir una lista en vector con su variable asignada
Y al igual que los vectores, también se puede definir primero la lista de listas en
una variable y luego convertirla en matriz con sólo colocar la variable dentro de los
paréntesis del array.
Entonces, los ı́ndices de cada uno de sus elementos se pueden escribir como:
1 import numpy as np
2 A=np.array([[1,5,-2],[0,4,-5]])
3 a11=A[0][0] # Aquı́ a11 = 1
4 a12=A[0][1] # a12 = 5
5 a13=A[0][2] # a13 = -2
6 a21=A[1][0] # a21 = 0
7 a22=A[1][1] # a22 = 4
8 a23=A[1][2] # a23 = -5
Código 6.6: Índices de una matriz en Python
Y se quiere calcular AB
1 import numpy as np
2 A=np.array([[1,3,0],[-2,0,1]])
3 B=np.array([[1,-1],[0,1],[2,5]])
4 print(A.dot(B))
Código 6.8: Producto matricial
6.5. Ejercicios
Ejercicio 5.1: Matrices nilpotentes Una matriz A cuadrada, se dice que es nilpo-
tente si existe un número k ∈ N tal que Ak es la matriz nula (Θ), en cuyo caso se
le llama ı́ndice de nilpotencia al k0 = mı́n{k ∈ N : Ak = Θ}. Realice un programa
en Python que compruebe que una matriz es o no es nilpotente con ı́ndice de nil-
potencia menor o igual a 50.
Entrada: Se debe ingresar un número entero n > 1 que indique el tamaño de la
matriz a estudiar, seguido de n2 números en punto flotante que serán los elementos
de la matriz.
Salida: La salida será un mensaje que afirme que es una matriz nilpotente con el
respectivo valor de su ı́ndice de nilpotencia, en caso de que no se encuentre un ı́ndi-
ce de nilpotencia menor que 50, deberá indicar en un mensaje que no se encontró
tal valor.
" #
0 1
Ejemplo de entrada: n = 2 y la matriz:
0 0
Ejemplo de salida: Es una matriz nilpotente con un ı́ndice de nilpotencia k0 = 2
Ejercicio 5.2: Redefinir una matriz Uno de los pasos que se requieren en los al-
goritmos para resolver un sistema de ecuaciones lineales consiste en intercambiar
las filas de una matriz cuadrada para colocar en la diagonal principal los elementos
de mayor magnitud de cada columna. Escriba un programa Python que permita in-
gresar una matriz cuadrada de n × n, que luego intercambie las filas, desde arriba
hacia abajo, de manera que el elemento de mayor magnitud de cada columna se
ubique en la diagonal y sustituya con ceros el resto de la fila hacia la derecha.
Entrada: La entrada al programa consiste en una secuencia de n2 + 1 números
enteros, el primero es el valor de n (n ≥ 3) y luego n2 números enteros, correspon-
dientes a los elementos de la matriz.
Salida: La salida será una matriz de n × n cuya estructura corresponde a la descrip-
ción del enunciado.
2 7 6
Ejemplo de entrada: n = 3 y la matriz:
4 5 3
9 8 1
9 0 0
Ejemplo de salida: 2 7 0
4 5 3
6.6. Soluciones
1 import numpy as np
2 n=int(input(’Ingrese el orden de la matriz: ’))
3 while n <= 1:
4 n=int(input(’Ingrese un valor correcto: ’))
5 O=np.zeros((n,n))
6 A=O
7 for i in range(0,n):
8 for j in range(0,n):
9 A[i][j]=float(input(f’Ingresar valor del elemento ({i,j})←-
: ’))
10 A2=A
11 for k in range(1,50):
12 c=0
13 for i in range(0,n):
14 for j in range(0,n):
15 if A2[i][j] == 0:
16 c=c+1
17 if c == n**2:
18 print(’Es nilpotente, su ı́ndice de nilpotencia es:’,k)
19 break
20 elif k == 49:
21 print(’No se encontró ı́ndice para probar su nilpotencia’)
22 A2=A2.dot(A)
Código 6.10: Solución ejercicio 5.1
1 import numpy as np
2 ## Funciones a usar ##
3 def LyV(mini,msg):
4 m=int(input(msg))
5 while m < mini:
6 print(’Error, valor fuera de rango’)
7 m=int(input(msg))
8 return m
9 def construccion (n):
10 B=np.zeros((n,n))
11 for i in range(n):
12 for j in range(n):
13 B[i][j]=int(input(f’Ingrese el valor del elemento ({i←-
,j}): ’))
14 return B
15 def hacerlecambios1(C,B,n,i):
16 maxi=abs(B[0][i])
17 j=0
18 while j < n:
19 if abs(B[j][i]) > maxi:
20 maxi=abs(B[j][i])
21 C[i][i]=B[j][i]
22 h=j
23 j=j+1
24 if i > 0:
25 for k in range(i):
26 C[i][k]=B[h][k]
27 for l in range(n):
28 B[h][l]=B[i][l]
29 B[i][l]=C[i][l]
30 return C,B
31 ###### Programa principal ######
32 n=LyV(3,’Ingrese el orden de la matriz: ’)
33 B=construccion(n)
34 C=np.zeros((n,n))
35 print(B)
36 for i in range(n):
37 C,B=hacerlecambios1(C,B,n,i)
38 print(C)
Código 6.11: Solución ejercicio 5.2
ARCHIVOS
Trabajar con archivos es muy útil debido a su facilidad de manejar y los datos del
archivo y a la persistencia de estos, es decir, para no perder la información útil y
para facilitar la ejecución de un programa.
56
Capı́tulo 6: Archivos 57
En este caso se escibre algo netamente indicado en el programa, sin embargo, tam-
bién puede depender de quien ejecute el programa.
Ejemplo 2: Para crear un archivo de texto de una cantidad n de lı́neas con texto,
donde en cada lı́nea esté escrito lo que el usuario desea escribir, con una longitud
máxima de 20 carácteres por lı́nea, se realiza el siguiente programa:
1 n=int(input(’Cantidad de lı́neas a escribir: ’))
2 while n <= 0:
3 n=int(input(’Ingresar una cantidad de lı́neas correcta: ’))
4 A=open(’archivo.text’,’w’, encoding=’utf-8’)
5 for i in range(n):
6 lineai=input(f’Escritura en la lı́nea {i+1}: ’)
7 while len(lineai) > 20:
8 print(’Cantidad de carácteres no permitida’)
9 lineai=input(f’Escritura en la lı́nea {i+1}: ’)
10 A.write(f’{ lineai }\n’)
11 A.close()
Código 7.3: Ejemplo 2 de escribir en un archivo
En caso de no querer guardar toda la información de un archivo sino que una lı́nea
de él, se usa el método readline(), cada vez que se vuelve a usar este método
en el mismo archivo, se leerá la información que hay en la siguiente lı́nea. Hay que
tener en cuenta que también considera los saltos de lı́nea. Ejemplo: Considerando
que tenemos un archivo de texto llamado “code.tex”, que tiene escrito los siguientes
4 códigos:
1100
1011
1001
0101
Si se quiere crear un programa capaz de almacenar cada uno de estos códigos en
una lista llamada L, una forma de hacerlo es:
1 L=list()
2 archivo=open(’code.txt’,’r’, encoding=’utf-8’)
3 for i in range(4):
4 texto=archivo.readline()
5 texto=texto.replace(’\n’,’’) # Se eliminan los saltos de lı́nea
6 L.append(texto)
7 archivotexto.close()
8 print(L)
Código 7.6: Ejemplo del uso del método readline
Sin embargo, existe una forma un poco más rápida de resolver el ejemplo anterior, y
esa forma es haciendo el uso de otro método, llamado readlines(), el cual crea
una lista donde cada elemento es un string de toda la información de cada lı́nea del
archivo (incluyendo los saltos de lı́nea). Si se quiere hacer un programa que haga lo
mismo que el código 7.6, usando este nuevo método, serı́a:
1 archivo=open(’code.txt’,’r’, encoding=’utf-8’)
2 L=archivo.readlines()
3 for i in range(len(L)):
4 L[i]=L[i].replace(’\n’,’’)
5 archivo.close()
6 print(L)
Código 7.7: Ejemplo del uso del método readlines
Estos métodos de lectura siempre comienzan en donde esté la posición del puntero
(si no se ha usado ningún método de lectura antes, se comienza del principio del
archivo, si se ha usado uno antes, el nuevo comienza donde terminó el anterior. En
caso de haber leı́do todo el archivo, el puntero se colocará al final del archivo y ya no
podrá leer nada más si se usa otro método más de lectura), la posición de este puede
ser modificada manualmente para comenzar a leer de diferentes lugares usando el
método: seek(a) donde a es la nueva posición del puntero. La posición del pun-
tero se puede ver como el ı́ndice de la cadena del archivo total, y como los ı́ndices
de estos, igual empieza en 0.
Usando el archivo del ejemplo anterior, para desplegar sólo el segundo código como
string, es decir, ’1011’, podemos hacer el siguiente programa:
1 archivo=open(’code.txt’,’r’, encoding=’utf-8’)
2 archivo.seek(7)
3 L=archivo.read(8)
4 archivo.close()
5 print(L)
Código 7.8: Uso del método seek
Observación: Aunque estas tres maneras de abrir un archivo son para realizar
cosas especı́ficas (’w’= escribir, ’r’=leer ’a’=agregar), también existe una ma-
nera de abrir el archivo de forma que se pueda hacer más de una: ’r+’= leer y
escribir en el archivo. De esta forma, para hacer lo mismo que en el ejemplo recién
visto, y desplegar la cantidad de códigos que tiene, se realiza lo siguiente:
1 archivo=open(’code.txt’,’r+’, encoding=’utf-8’)
2 L=archivo.readlines()
3 archivo.writelines([’
\n1 0 1 1’])
4 archivo.close()
5 print(’La cantidad de códigos son:’,len(L)+1)
Código 7.10: Ejemplo de leer y escribir información en un archivo
7.4. Ejercicios
Ejercicio 6.1: Verificar números primos y encontrar siguiente Usando un ar-
chivo donde cada una de sus lı́neas sólo tenga escrito un número entero positivo, se
debe construir un programa en Python que verifique que cada uno de esos números
sean primos o no, en cualquiera de los casos, debe entregar un mensaje que diga si
lo es o no indicando la lı́nea en la que se encuentra el número, luego, se colocará al
final del archivo (en una nueva lı́nea) el número primo que viene después del primo
más grande encontrado en el archivo. El archivo se llamará “NumerosP.txt”.
Ejemplo de archivo a usar:
3
9
13
7
Ejemplo de salida:
En la lı́nea 1 hay un primo.
En la lı́nea 2 no hay un primo.
En la lı́nea 3 hay un primo.
En la lı́nea 4 hay un primo.
(Por último, se agrega el número 17 al archivo)
7.5. Soluciones
1 # Consideraremos que el archivo tiene los datos correctos,
2 # es decir, no se comprobará que sólo son números enteros¿0
3 # Función a usar:
4 def primo(p):
5 if p == 1:
6 M=’no hay un primo’
7 elif p == 2:
8 M=’hay un primo’
9 else:
10 c=0
11 for j in range(2,p//2+1):
12 if p % j == 0:
13 c=1
14 if c == 0:
15 M=’hay un primo’
16 else:
17 M=’no hay un primo’
18 return M
19 # Programa principal:
20 S=open(’NumerosP.txt’,’r+’,encoding=’utf-8’)
21 L,L2=S.readlines(),[]
22 for i in range(len(L)):
23 L[i]=int(L[i].replace(’\n’,’’))
24 print(f’En la lı́nea {i+1}’,primo(L[i]))
25 if primo(L[i]) == ’hay un primo’:
26 L2.append(L[i])
27 m=max(L2)
28 while True:
29 m=m+1
30 if primo(m) == ’hay un primo’:
31 S.writelines([’\n’+str(m)])
32 break
33 S.close()
Código 7.11: Solución ejercicio 6.1
65