Tema 1
Tema 1
19 de enero de 2024
2
ÍNDICE GENERAL
Index 1
1. El lenguaje Python 7
1.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1.1. Instalar herramientas . . . . . . . . . . . . . . . . . . . . . . . 8
1.2. El lenguaje Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2.1. Sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2.2. Tipos de lenguajes de programación . . . . . . . . . . . . . . . 13
1.2.3. Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2.4. Operaciones con datos escalares . . . . . . . . . . . . . . . . . 16
1.2.5. Convertir de un tipo de datos a otro . . . . . . . . . . . . . . 20
1.2.6. Operaciones con datos no escalares . . . . . . . . . . . . . . . 22
1.2.7. Corte, alı́as y mutabilidad . . . . . . . . . . . . . . . . . . . . 24
1.2.8. Entrada y salida por consola . . . . . . . . . . . . . . . . . . . 26
1.2.9. Funciones incorporadas . . . . . . . . . . . . . . . . . . . . . . 29
1.3. Librerı́as . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
1.3.1. Librerı́a math . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
1.3.2. Librerı́a random . . . . . . . . . . . . . . . . . . . . . . . . . . 32
1.3.3. Librerı́a time . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3
4 ÍNDICE GENERAL
3.5. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.6. Acoplamiento y Cohesión . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.7. Funciones puras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.8. Funciones recursivas . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.8.1. Cálculo del factorial . . . . . . . . . . . . . . . . . . . . . . . 71
3.9. Ejemplo de un árbol binario . . . . . . . . . . . . . . . . . . . . . . . 72
Siglas 79
Bibliografia 80
Índice alfabético 83
6 ÍNDICE GENERAL
CAPÍTULO 1
EL LENGUAJE PYTHON
1.1. Introducción
El lenguaje Python originalmente fue concebido por Guido Van Rossum. Una de
las caracterı́sticas principales de Python es un lenguaje interpretado, haciendo énfasis
en la legibilidad del código. Actualmente es administrado por la Python Software
Foundation. La licencia de uso es de código abierto y se denomina Python Software
Foundation License.
El lenguaje Python es un lenguaje muy fácil de aprender y entender. Existen va-
rias implementaciones de Python. CPython es la implementación oficial del lenguaje
de programación Python. Está escrita en C. JPython, escrita en Java y permite una
integración con el lenguaje Java. PyPy pensado en la eficiencia es un intérprete y un
compilador JIT, que significa compilar justo a tiempo con la finalidad de reducir la
cantidad de instrucciones que se interpretan.
También para los micro controladores existe una versión denominada MicroPyt-
hon.
En las áreas de inteligencia artificial, ciencia de datos, es el lenguaje preferido.
También se hace uso extensivo en matemáticas simbólicas y cálculos numéricos.
7
8 CapÍtulo 1. El lenguaje Python
2. Librerı́as y complementos.
Lenguaje de Programación
conda -V
python -V
Librerı́as y complementos
Para el contenido del texto no requerirá instalar librerı́as especiales, sin embargo
se explica como instalar estas.
Cuando tiene Python instalado, tendrá disponible el comando pip . A través de
este comando es posible instalar complementos, por ejemplo programas para ciencia
de datos, inteligencia artificial y otros. Esto se realiza con el siguiente comando:
Si quiere administrar de forma sencilla los paquetes instalados hay que instalarlos
con anaconda.
Entorno de Desarrollo
Otra opción es instalar jupyterlab que puede instalarse con anaconda, el comando
es:
1.2.1. Sintaxis
Un programa es una secuencia de pasos simples que contienen el control de flujo
del proceso. El control de flujo especifica cuando cada paso es ejecutado. Finalmente
una forma de terminar la secuencia de pasos.
Las computadoras almacenan y ejecuta estas instrucciones. Las calculadoras y
otro tipo de equipos electrónicos tienen un programa fijo.
Los pasos simples están construidos de un conjunto predefinido de instrucciones
básicas que son:
1. Aritmética y lógica.
2. Pruebas simples.
3. Mover datos.
mi_variable = contenido_asignado_a_la_variable
Ejemplos:
a=5
incrementoSalario=1.2
area=base*altura/2
12 CapÍtulo 1. El lenguaje Python
Las constantes son nombres de variables cuyo contenido no cambia por ejemplo:
PI=3.1416
mi variable = 5
Para asignar nombres a variables se debe tomar en cuenta que se deben utilizar
nombres descriptivos, si se quiere utilizar mas de una palabra se debe escribir con
guión bajo. Python reserva 33 palabras claves para su propio uso que no se pueden
usar como nombres de variables, estas son:
Los tipos de datos para objetos escalares son: enteros, booleanos, punto flotante,
caracteres.
Para averiguar de que tipo de dato es un dato se utiliza la instrucción type() Veamos
algunos ejemplos:
python
>>> type(2)
<class ’int’>
>>> type(42.0)
<class ’float’>
>>> type(False)
<class ’bool’>
La salida consiste de la palabra class que representa una clase (tipo) de datos y
luego sigue sigue el tipo de dato.
float representa los números con decimales que se denominan de punto flotante
bool son los datos que tienen solo dos valores, verdadero o falso en programación
se denominan boleanos o lógicos.
1.2. El lenguaje Python 15
Los datos no escalares también se denominan estructuras de datos que son or-
ganizaciones de datos que permiten realizar tareas con menores recursos y más efi-
cientemente. Como ejemplo tenemos cadenas (str), diccionarios(dict), listas(list), y
tuplas(tuple), que se explicaran más adelante. Claro esta que también tienen un tipo.
Veamos los ejemplos:
python
>>> a={’a’:1,’b’:2}
>>> b=[1,’a’,1,2,3]
>>> c=(1,2,3)
>>> d=’abc’
>>> type(a)
<class ’dict’>
>>> type(b)
<class ’list’>
>>> type(c)
<class ’tuple’>
>>> type(d)
<class ’str’>
Las listas son similares a las tuplas pueden almacenar datos escalares como datos
compuestos. La diferencia está en que las tuplas no se pueden modificar y las listas
si se pueden modificar. Para definir una lista los datos se escriben entre corchetes
cuadrados y separados por comas. Las tuplas se escribe entre paréntesis.
Por ejemplo si quiere escribir las notas de los estudiantes en una lista se escribe
como sigue:
notas=[60,70,50,75]
16 CapÍtulo 1. El lenguaje Python
Es deseable registrar el nombre conjuntamente con las notas, para esto se tiene
dos opciones:
nombreNota=[’Juan’,60,’Maria’,70,’Jose’,50,’Juana’,75]
nombreNota=[[’Juan’,60],[’Maria’,70],[’Jose’,50],[’Juana’,75]]
’abc’
"Estoy aprendiendo a programar"
’abc
’Estoy aprendiendo a programar"
hora-1
hora*60+minutos
minutos/60
5**2
(5+9)*(15-7)+32
a=7//3
b=3*a
resto=7-b
x=5
x+1
y=2*(x+2)
precedencia. Para los operadores matemáticos, Python sigue las convenciones ma-
temáticas.
Los paréntesis tienen el nivel superior de precedencia, y pueden usarse para forzar
a que una expresión sea evaluada en el orden que se quiera. Dado que las expresiones
entre paréntesis son evaluadas primero, por ejemplo 2 ∗ (3 − 1) primero evaluará 3 − 1
y luego se multiplica por 2.
Se pueden usar también paréntesis para hacer una expresión más sencilla de leer,
incluso si el resultado de la misma no varı́a por ello.
La exponenciación (elevar un número a una potencia) tiene el siguiente nivel más
alto de precedencia, de modo que 2 ∗ ∗1 + 1 es 3, no 4, y 3 ∗ 1 ∗ ∗3 es 3 y no 27.
La multiplicación y la División tienen la misma precedencia, que es superior a la
de la Suma y la Resta, que también tienen entre si el mismo nivel de precedencia.
Ası́ que 2 ∗ 3 − 1 es 5, no 4, y 6 + 4//2 es 8, no 5.
Los operadores con igual precedencia son evaluados de izquierda a derecha. Ası́
que la expresión 5 − 3 − 1 es 1 y no 3, ya que 5 − 3 se evalúa antes, y después se
resta 1 de 2.
En caso de duda, añada siempre paréntesis a sus expresiones para asegurarse de
que las operaciones se realizan en el orden que quiere.
Para hacer los valores más legibles podemos utilizar un guion bajo:
a=1_000_000
b=1_000_000_000
total=a+b
Existen formas simplificadas de escritura. Por ejemplo para sumar 1 a una variable
de puede escribir de dos formas:
Escritura regular Escritura simplificada
i=i+1 i+=1
El sı́mbolo de suma indica que hay que sumar 1 y el sı́mbolo igual que se se debe
almacenar en la variable i. Ası́ se obtienen las siguientes expresiones simplificadas:
1.2. El lenguaje Python 19
+=
-=
*=
/=
//=
Las operaciones con números enteros son exactas. Se puede trabajar con números
de cualquier magnitud. En cambio la precisión de los nos números de punto flotante
esta limitada por la representación que tiene en la computadora. Los número de con
decimales se almacenan en el formato IEEE 754 que son números binarios de doble
precisión.
Doble Precisión significa que son números binarios de 64 bits. El valor máximo
que puede tener cualquier número de punto flotante es aproximadamente 1,8103 .
Cualquier número mayor que este se indicará mediante la cadena inf en Python.
Están divididos como sigue:
Como ve al trabajar con números decimales los resultados no son exactos. Vea el
siguiente ejemplo:
10/3=0.3333333333333333
10/3+10/3=3.3333333333333333+3.3333333333333333=6.666666666666666
10/3+10/3=20/3
20/3=6.6666......7
20 CapÍtulo 1. El lenguaje Python
>>> a=’123’
>>> b=int(a)
>>> type(a)
<class ’str’>
>>> type(b)
<class ’int’>
>>>
Inicialmente la variable a tiene un número escrito como una cadena. Este número
se convierte a entero con la función int. Que pasa si la variable a convertir no contiene
un número entero:
>>>
>>> a=’12.3’
>>> b=int(a)
Se obtiene un error.
Para convertir los datos a otros formatos se utilizan las siguiente funciones:
1.2. El lenguaje Python 21
Cuando se convierte de cadena a lista se obtiene una lista con todos los caracteres
separados por un espacio.
>>> a=’hola’
>>> list(a)
[’h’, ’o’, ’l’, ’a’]
>>>
Para convertir esta lista otra vez a una cadena se debe utilizar la función join.
La forma de codificar es:
>>> ’’.join(a)
’hola’
>>> ’-’.join(a)
’h-o-l-a’
>>>
El operador + funciona con las cadenas, pero no realiza una suma en el sentido
matemático. En vez de eso, realiza una concatenación, que quiere decir que une
ambas cadenas, enlazando el final de la primera con el principio de la segunda. Por
ejemplo:
Operación aritmética Operación con cadenas
a=10 a=’10’
b=20 b=’20’
a+b a+b
resultado resultado
30 1020
El operador * también trabaja con cadenas multiplicando el contenido de una
cadena por un entero, que significa repetir la cadena. Por ejemplo:
primero = ’Test ’
n = 3
print(primero * n)
a=[1,2,3]
b=[5,7]
c=a+b
resultado
[1, 2, 3, 5, 7]
1.2. El lenguaje Python 23
a=[0]*5
resultado
[0,0,0,0,0]
Para manipular datos compuestos existen funciones tanto para cadenas como
listas.
Funciones para cadenas Funciones para listas
lower(): convierte la cadena a le-
tras minúsculas.
a=’aBc’
b=a.lower()
# el resultado en b
24 CapÍtulo 1. El lenguaje Python
abc
#lista
l=[1,2]
l.append(5)
# el resultado es
[1,2,5]
variable[inicio:fin:paso]
donde variable es la lista, cadena o tupla luego vienen los datos desde donde se
comienza, hasta donde y si es secuencial o con algún incremento. Cuando no se espe-
cifica el valor de inicio se considera el primer elemento y de la misma forma cuando
no se especifica el valor final se considera que es hasta el final. Para comprender
mejor veamos algunos ejemplos:
a=’abcdefghij’
b=a[:3]
Acá de la cadena a =′ abcdef ghij ′ se separan los tres primeros caracteres o sea
abc. Siempre se comienza a contar desde 0 y el carácter 3 no se toma en cuenta. Por
esta razón solo se extraen tres elementos y no cuatro.
a=’abcdefghij’
b=a[3:5]
a=’abcdefghij’
b=a[0:6:2]
La copia comienza con el caracter 0 de dos en dos o sea que se copia el primero
luego se salta uno, continúa con el siguiente salto uno y ası́ sucesivamente, hasta
llegar al a elemento 6, dando como resultado ace.
De manera similar se hace lo mismo en una tupla o lista:
a=[0,1,2,3,4,5,6,7,8,9]
b=a[3:5]
Mutabilidad
a=’hola’
a=’hola’
a=’H’+a[1:]
26 CapÍtulo 1. El lenguaje Python
a=[0,1,2,3,4,5,6,7,8,9]
a[3]=99
Alı́as
Alı́as significa dar un nombre sinónimo a un tipo de dato compuesto. Por ejemplo:
lista=[1,2,3,4]
alias=lista
a=[0]*3
b=[a,a,a]
b[1][1]=1
Para ingresar datos por teclado se utiliza la instrucción input() Por ejemplo:
a=input(’Ingrese su nombre’)
1.2. El lenguaje Python 27
Muy importante: Cuando Python lee datos del teclados lo ingresa (lee) siempre
como TEXTO. Siempre lee lı́nea por lı́nea, el fin de lı́nea se da cuando presiona
retorno de carro.
El texto entre apóstrofes es opcional.
Cuando queremos ingresar números enteros es necesario convertir de texto a
número. Para esto utilizamos la función int().
Por ejemplo a=int(input()).
Cuando hay que leer múltiples datos en una lı́nea hay que utilizar la función de
cadenas split().
Para leer por ejemplo tres palabras(textos sin espacios) en una lı́nea, es necesario
separar los datos de entrada en múltiples variables, o nombres.
Por ejemplo si se quiere ingresar en una lı́nea: primer nombre, apellido paterno
y apellido materno. Tenemos que definir tres variables digamos a,b,c.
a,b,c=input().split()
Ahora si no ingresa tres palabras separadas por un espacio dará error. Siempre
debe igualar el lado izquierdo con el derecho.
Para ingresar múltiples números en una lı́nea una vez ingresados es necesario
convertirlos a números enteros. Si se ingresa dos números el código serı́a:
a,b=input().split()
a=int(a)
b=int(b)
a,b=map(int,input().split())
Esto significa: leer y separar en el espacio, luego usar la función int en cada uno
de los textos obtenidos. La función map se utiliza para que todos los valores pasen
por una función en este caso la función es int. Indica que se asigne el primer valor
para a y el segundo valor para b.
28 CapÍtulo 1. El lenguaje Python
Salida de datos
print(’hola a todos’)
a=10
print(a)
a=10
print(a, end=’-’)
a=10
print(f’El resultado es: {a}’)
La variable a imprimir se coloca entre llaves. Ahora lo que se quiere, es dar formato
a la variable que se va a imprimir. Para poner los resultados con un formato especifico,
existen diferentes caracteres que permiten alinear, definir el número decimales, etc.
Descripción Caracter de formato
Alineación a la derecha >
Alineación a la izquierda <
Centrado ˆ
Especificar el número de caracteres (n) que ocupará :n
Imprimir un número en n espacios rellenando con ceros :0n
Especificar el número de decimales(n) :.nf
Especificar el espacio (a) y el número de decimales(n) :a.nf
1.2. El lenguaje Python 29
Función Descripción
round(numero[, ndigitos]) redondea el número numero al
número determinado en ndigitos.
abs(x) regresa el valor absoluto del número x, utilizado
para asegurar que el resultado deseado sea positivo.
bin(x) convierte el número x en binario.
oct(x) convierte el número x en Octagonal.
hex(x) convierte el número x en Hexadecimal.
max(arg1, arg2, ...) regresa el argumento que tenga mayor
valor definido con respecto al resto de los argumentos.
min(arg1, arg2, ...) regresa el argumento que tenga menor
valor definido con respecto al resto de los argumentos.
1.3. Librerı́as
El lenguaje Python tiene múltiples librerı́as para realizar diversas tareas de forma
más simple. Un librerı́a que también se denomina módulo contiene una serie de
métodos para realizar diferentes acciones. La forma de invocar librerı́as es utilizando
la instrucción import seguida del nombre de la librerı́a. Por ejemplo para las funciones
trigonométricas se requiere la librerı́a math y la instrucción para incluir en nuestro
programa es:
import math
math.sin(20)
import math
radianes = 0.7
altura = math.sin(radianes)
grados = 45
radianes = grados / 360.0 * 2 * math.pi
math.sin(radianes)
La expresión math.pi toma la variable pi del módulo math. El valor de esa variable
es una aproximación de π, con una precisión de unos 15 dı́gitos.
Función Código Ejemplo
Valor absoluto abs math.abs(-3)
Funcion exponencial exp math.exp(1)
Potencia pow(a,b) math.pow(3,4)
Raiz Cuadrada sqrt math.sqrt(2)
Coseno cos math.cos(0.7)
Seno sin math.sim(0.7)
Tangente tan math.tan(1)
Conversión de radianes a grados degree math.degree(0.7)
Valor de pi pi math.pi
Valor de e e math.e
Arco seno asin math.asin(0.56)
Arco coseno acos math.acos(0.7)
MUY IMPORTANTE los resultados del módulo math son de punto flotante
(float) que implica solo 15 decimales de precisión.
La diferencia entre utilizar la función pow y doble asterisco es que pow devuelve
un número de tipo float y la operación potencia un número entero.
Por ejemplo si se quiere medir cuanto tiempo demora una secuencia de código:
import time
inicio=time.time()
#las instrucciones del codigo a medir
.....
fin=time.time()
demora=fin-inicio
maneja = True
toma = False
ambos = maneja and toma
print(ambos)
i f condicion :
instruccion
i f condicion : instruccion
instruccion ...
instruccion else :
... instruccion
instruccion
...
i f condicion :
instruccion
instruccion
...
e l i f condicion :
instruccion
instruccion
...
else :
instruccion
instruccion
...
En la primera columna cuando expresión es verdadera se ejecutan las instruccio-
nes que siguen. La instrucción Python para esto es if.
En la la segunda columna las instrucciones que siguen al if se ejecutan cuando
la expresión da un resultado verdadero. La instrucción else indica las instrucciones
que hay que ejecutar cuando el resultado de evaluar la expresión es falso.
La sintaxis es colocar dos puntos después de la condición ası́ como después del
else.
La instrucción elif se utiliza cuando en los que la expresión se evalúe como falso
se quiere preguntar por otra condición.
36 CapÍtulo 1. El lenguaje Python
1.4.2. Indentación
Indentar significa dejar espacios o tabuladores al margen izquierdo. Indentar es
muy importante porque permite definir bloques de código. En las instrucciones que
hacen referencia a las operaciones que dependen de ellas se las identifican por la
indentación. Vea el siguiente ejemplo:
# La segunda
# mal i n d e n t a d o
#b i e n i n d e n t a d o # instruccion esta
# da e r r o r
i f condicion : # fuera del bloque
i f condicion :
instruccion i f condicion :
instruccion
instruccion instruccion
instruccion
... instruccion
...
...
Como ve en el ejemplo de la izquierda todas las instrucciones después de la ins-
trucción if se encuentran perfectamente alineadas con una a indentación. El segundo
caso está mal indentado dado que no todas las instrucciones esta alineadas en forma
irregular. Tampoco se deben mezclar espacios con tabuladores. En el tercer caso la
segunda instrucción ya no pertenece al bloque de instrucciones del if porque esta
escrita a la altura de la instrucción if.
El ejemplo muestra la comparación de dos números:
x = f l o a t ( input ( ’ I n g r e s e un numero x : ’ ) )
y = f l o a t ( input ( ’ I n g r e s e un numero y : ’ ) )
i f x == y :
print ( ’ x e s i g u a l a y ’ )
i f y != 0 :
print ( ’ por l o que , x / y e s ’ , x/y )
elif x < y:
print ( ’ x e s menor ’ )
else :
print ( ”y e s menor” )
print ( ” g r a c i a s ! ” )
1.4. Operadores lógicos 37
Suponga que quiere comparar tres valores a, b, c, esto se puede hacer de tres
formas:
#forma 2
#forma 3
#forma 1 i f a>b :
i f a>b>c :
i f a>b and b > c : if b > c :
.....
....
#forma 2
print ( ’ par ’ i f x %2==0 e l s e ’ impar ’ )
v o c a l e s= ’ a e i o u ’
x= ’ e ’
a=x in v o c a l e s
Se tiene una cadena con todas las vocales. La instrucción a=x in vocales dará el
verdadero si el contenido de x se encuentra en vocales. El mismo ejemplo se podrı́a
definir en una lista:
v o c a l e s =[ ’ a ’ , ’ e ’ , ’ i ’ , ’ o ’ , ’ u ’ ]
x= ’ e ’
a=x in v o c a l e s
El operador de pertenencia puede utilizarse en cadenas, listas, tuplas y dicciona-
rios.
EL siguiente ejemplo imprime en pantalla todos los números y sus cuadrados que
sean menores a 100:
i =1
while i ∗ i < 1 0 0 : #su cuadrado e s menor que 100
print ( i , i ∗ i )
i+=1
Hay que tomar en cuenta, primero se ha definido una variable que sirve para
controlar la finalización del ciclo. Al final del mismo se incrementa la misma en uno.
Un error frecuente es que la variable que controla el ciclo no se modifica y el programa
nunca termina.
range(inicio,fin,incremento)
Hay que aclarar que al igual que en los cortes el ultimo valor no se procesa. El
ejemplo de los números cuadrados escrito con un for es como sigue:
f or i in range ( 1 , 1 0 ) :
print ( i , i ∗ i )
Este programa lista los número cuadrados hasta 9 ∗ 9 los primeros 9 desde el 1
hasta el 9 inclusive. el 10 ya no lo toma en cuenta.
Existen dos funciones que se puede aplicar a los ciclos for, estas son: reversed y
enumerate. La función reversed significa en orden inverso y la instrucción enume-
rate indicando el orden. En el ejemplo de los nombres enumerate adicionalmente
enumerarı́a los nombre que se listan, el código es como sigue:
nombres =[ ’ Juan ’ , ’ J o s e ’ , ’ Maria ’ , ’ J o s e ’ ]
f or numero , nombre in enumerate ( nombres ) :
print ( numero , nombre )
Al recorrer devuelve dos valores el número y el nombre. El número comienza con
0.
nombres =[ ’ Juan ’ , ’ J o s e ’ , ’ Maria ’ , ’ J o s e ’ ]
f or numero , nombre in enumerate ( reversed ( nombres ) ) :
print ( numero , nombre )
En el ejemplo devuelve los nombres comenzando desde el último, y el úumero que
coloca comienza siempre en 0.
1.5. Estructuras de control 41
Termina el ciclo.
Ahora suponga que se quiere colocar un mensaje cuando no es divisible por ningún
número de la lista.
Una forma de hacer esto es:
if esdivisible :
print ( ’ no e s d i v i s i b l e por l o s numeros de l a l i s t a ’ )
Para eliminar la variable de control esdivisible la forma más simple y más fácil de
entender es utilizando la instrucción else, que se ejecuta cuando el ciclo no termina
normalmente. El código es como sigue:
suma = 0
f or i in range ( 1 0 ) :
i f i ==4:
continue
i f i ==7:
continue
suma+=i
1.6. Eficiencia
import s y s
entrada = sys . stdin . r e a d l i n e ( )
print ( e n t r a d a )
Cuando se leen los datos de esta forma no se quita el fin de lı́nea por lo que es
conveniente agregar el método strip() si es necesario.
La salida de datos se hace por medio del método stdout.write. Hay que hacer
notar que solo puede escribir cadenas de texto y es necesario que uno agregue el fin
de lı́nea. El ejemplo siguiente solicita el nombre y luego lo muestra por pantalla.
import s y s
s y s . s t d o u t . w r i t e ( ’ I n g r e s e su nombre : \n ’ )
nombre = s y s . s t d i n . r e a d l i n e ( )
s y s . s t d o u t . w r i t e ( ’ Hola ’ +nombre+ ’ \n ’ )
Ejemplos:
s y s . s t d o u t . w r i t e ( s t r ( n ) + ’ \n ’ )
s y s . s t d o u t . w r i t e ( ’ ’ . j o i n (map( str , l i s t a ) ) + ’ \n ’ )
46 CapÍtulo 1. El lenguaje Python
1.7. Ejercicios
1. Hallar la distancia entre dos puntos del plano cartesiano. La entrada consisten
en dos lı́neas cada una con dos números que representan las coordenadas (x, y).
Solución:
2. Los números cuadrados son los que se obtiene de elevar un número entero al
cuadrado. Se quiere hacer una lista de los últimos dos dı́gitos en los que pueden
terminar.
Solución:
conjunto=set()
for i in range(100):
conjunto.add((i*i)%100)
print(conjunto)
Se ha creado una variable que es un conjunto que almacena los dos últi-
mos dı́gitos. Los conjuntos no admiten números repetidos. el resultado es
:{0, 1, 4, 9, 16, 21, 24, 25, 29, 36, 41, 44, 49, 56, 61, 64, 69, 76, 81, 84, 89, 96}
terminaciones=[]
1.7. Ejercicios 47
p=1
for i in range(10):
p*=3
if (p%10) in terminaciones:
continue
terminaciones.append(p%10)
print(terminaciones)
Solución:
t=123456789
horas=t//3600
segundos_restantes=t%3600
minutos=segundos_restantes//60
segundos=segundos_restantes%60
print(f’Horas:{horas},Minutos:{minutos},Segundos:{segundos}’)
5. Dada una cadena obtenga una lista ordenada de todos los caracteres de la
cadena.
Solución
48 CapÍtulo 1. El lenguaje Python
6. Un acrónimo es una palabra formada por la primera letra de una frase. Por
ejemplo el acrónimo de: memoria de solo lectura es MDSL. Escriba un programa
para hallar el acrónimo de un texto.
Solución:
7. Clasifique los objetos en tres grupos, menor a 15, entre 15 y 20, mayor a 20.
Son 10 datos que se ingresan en un ciclo for. Luego se imprimen en tres filas
los datos ingresados. La primera fila son los datos menores a 15. La segunda
los que están entre 15 y 20. Finalmente la tercera con los mayores a 20.
l1=[]
l2=[]
l3=[]
for i in range(10):
n=int(input())
if n<15:
l1.append(n)
elif n>20:
l3.append(n)
else:
1.7. Ejercicios 49
l2.append(n)
print(l1)
print(l2)
print(l3)
n=15
s=0
for i in range(15+1):
s+=i
#por la formula
f=(n+1)*n//2
if s==f:
print(’Iguales’)
else:
print(’No iguales’)
50 CapÍtulo 1. El lenguaje Python
CAPÍTULO 2
Los jueces virtuales son programas que se utilizan para verificar sin un programa
funciona correctamente. Existen múltiples jueces virtuales donde se puede practicar
la programación y solución de problemas. Algunos de ellos son:
EL juez OnlineJudge (de Valladolid, 2022) es uno de los programas más co-
nocidos y contiene todos los problemas de las competencias mundiales de pro-
gramación. Muchos libros tales como: Competitive Programming 3: The New
Lower Bound of Programming Contests (Halim y Halim, 2013) hacen referencia
a los problemas de este juez.
51
52 CapÍtulo 2. Jueces virtuales de programación
Los datos que su programa debe procesar están almacenados en el servidor donde
se ejecuta el juez. Estos datos no se muestran a los usuarios y deben ser leı́dos por
su programa. Las formas más comunes en las que se presentan los datos son:
4 n=int ( input ( ) )
3 f or c a s o s in
1 2 range ( int ( input ( ) ) ) :
3 4 x , y=map( int , input ( )
5 6 . split ())
import s y s
1 2 f or c a s o s in s y s . s t d i n :
3 4 x , y=map( int , c a s o s . s p l i t ( ) )
5 6 i f x==y==0:
0 0 print ( ’ f i n de d a t o s ’ )
break
import s y s
1 2
f or c a s o s in s y s . s t d i n :
3 4
x , y=map( int , c a s o s . s p l i t ( ) )
5 6
print ( ’ f i n de d a t o s ’ )
n=int ( input ( ) )
5
l i s t a =l i s t (map( int ,
1 2 3 4 5
input ( ) . s p l i t ( ) ) )
Con relación al proceso por cada caso de prueba se debe escribir el resultado
solicitado. No se guardan los resultados para imprimir al final.
2.2.1. Ejemplo
Los casos de prueba consisten de un número y una lista terminan cuando no hay
más datos, es decir fin de archivo.
Ejemplo de datos Programa
from s y s import s t d i n
5
f or l i n e a in s t d i n :
1 2 3 4 5
n=int ( l i n e a )
4
l i s t a =l i s t (map( int ,
1 2 3 4
stdin . readline ( ) . s p l i t ()))
Cuando realizamos el ciclo for se lee el número n, para leer la lista es necesario
leer la lı́nea siguiente de stdin. No debe mezclarse flujos de entrada estandard con
instrucciones input. En un proceso interactivo con el teclado puede funcionar pero
no ası́ cuando la lectura viene de otro lugar tal como puede ser un archivo de disco.
2.3. Ejercicio
Un ejercicio tı́pico tiene la siguiente estructura:
Enunciado
Le dan una lista de números y se pide que imprima el promedio con dos decimales
Entrada
Salida
Por cada caso de prueba escriba en la salida una lı́nea con el promedio con dos
decimales
Ejemplo de entrada
2
3
10 15 7
4
6 2 8 6
Ejemplo de salida
10.67
5.50
Entrada.- Describe como se presentan los datos que hay que leer. Los rangos
de los números que se dan tiene la finalidad de que usted pueda escoger una
solución que para el número máximo de datos a procesar resuelva el problema
en un tiempo razonable.
Los problemas se resuelven caso por caso. Se lee un caso de prueba y se imprime
el resultado del mismo.
Para ejemplo, primero hay que leer el número de casos de prueba. Por cada caso
de prueba leer, procesar y mostrar los resultados.
casos =int(input())
for i in range(casos):
#procesar los casos de prueba
#mostrar los resultados
Para cada caso de prueba nos indican que hay que leer una lı́nea con la cantidad
de números que tiene el caso de prueba. Luego una segunda lı́nea con los números
separados por un espacio.
casos =int(input())
for i in range(casos):
#procesar los casos de prueba
#mostrar los resultados
casos =int(input())
for i in range(casos):
#procesar los casos de prueba
k=int(input())
numeros=list(map(int,input().split()))
#mostrar los resultados
print(f’{sum(numeros)/k:.2f}’)
58 CapÍtulo 2. Jueces virtuales de programación
CAPÍTULO 3
FUNCIONES DEFINIDAS POR EL USUARIO
Una función es un bloque de código con un nombre asociado, que recibe cero o
más argumentos como entrada, sigue una secuencia de instrucciones, la cuales ejecuta
y devuelve un valor y/o realiza una tarea. Este bloque puede ser llamado cuando se
necesite.
Las de funciones tienen los siguientes propósitos
3.1. Definición
La sentencia def es una definición de función usada para crear funciones definidas
por el usuario.
59
60 CapÍtulo 3. Funciones definidas por el usuario
Donde:
Como ejemplo se muestra una función que devuelve la parte entera después de
hallar la raı́z cuadrada.
def r a i z E n t e r a ( x ) :
’ ’ ’ Funcion que h a l l a l a r a i z cuadrada
y d e v u e l v e l a p a r t e e n t r a redondeada
al entero superior ’ ’ ’
r=int ( x ∗∗0.5)+1
return r
3.2. Argumentos y parámetros 61
Advertencia: Los bloques de función deben estar indentados como otros bloques
estructuras de control. En esta función:
raizEntera (10)
#e l r e s u l t a d o e s 4
Las variables definidas en las funciones se consideran variables locales. No es
posible asignar valores directamente a variables definidas fuera de la función. Los
parámetros (argumentos) se definen como variables locales.
>>> resta()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: resta() takes exactly 2 arguments (0 given)
EL error indica que se invocó una función con el número de argumentos equivo-
cados, y que requiere exactamente 2.
En este ejemplo si no se pone un argumento tomará el valor por omisión, por ejemplo
si se invoca resta(10) los valores que toma la función son a = 10, b = 0. También es
posible poner llamar con resta(b=10), en este caso a toma el valor de 0.
3.3. Instrucción return 63
def f(*args):
return sum(args)
En éste ejemplo se tiene una función que recibe múltiples argumentos e imprime
la suma de los mismos. El llamado a la función con f (1, 2, 3, 4) devuelve 10.
Los parámetros son pasados a la función como una tupla. El siguiente código
muestra como recibe una lista pasada como un parámetro:
def f(*args):
print(args)
return None
l=[1,2,3,4]
f(l)
El resultado es:
([1, 2, 3,4],)
f(*l)
a=3
print ( f (5))
3.5. Ejemplo
Escriba una función para hallar la suma de una serie aritmética entre 1 y n.
Primero debemos recordar la fórmula de la suma:
n(1 + n)
suma =
2
def f (x ) :
r e t u r n n∗(1+n ) / / 2
from d a t e t i m e import d a t e t i m e
def s a l u d a r ( nombre ) :
h o r a A c t u a l = d a t e t i m e . now ( )
i f h o r a A c t u a l . hour < 1 2 :
s a l u d o = ”Buen d i a ”
e l i f 12 <= h o r a A c t u a l . hour < 1 8 :
s a l u d o = ” Buenas t a r d e s ”
else :
s a l u d o = ” Buenas noches ”
print ( f ’ { s a l u d o } {nombre} ’ )
def s a l u d o L i s t a ( nombres ) :
f or nombre in nombres :
s a l u d a r ( nombre )
def main ( ) :
s a l u d a r ( leerNonmbre ( ) )
s a l u d o L i s t a ( [ ” Juan ” , ” Maria ” , ” J o s e ” ] )
3.7. Funciones puras 67
main ( )
Este programa pide un nombre por pantalla y luego imprime un mensaje que
depende de la hora. Luego Hace lo mismo con una lista de nombres. ¿Que problemas
podemos encontrar en este programa?
Primero la función armar saludos no depende exclusivamente del parámetro nom-
bre, también depende de la hora. Esto causa dificultades a la hora de probar el código
dado que para un mismo parámetro la respuesta puede ser diferente. Lo que se busca
siempre es:
from d a t e t i m e import d a t e t i m e
def s a l u d a r ( s a l u d o , nombre ) :
print ( f ’ { s a l u d o } {nombre} ’ )
def s a l u d o L i s t a ( s a l u d o , nombres ) :
f or nombre in nombres :
s a l u d a r ( s a l u d o , nombre )
def main ( ) :
h o r a A c t u a l = d a t e t i m e . now ( )
i f h o r a A c t u a l . hour < 1 2 :
s a l u d o = ”Buen d i a ”
e l i f 12 <= h o r a A c t u a l . hour < 1 8 :
68 CapÍtulo 3. Funciones definidas por el usuario
s a l u d o = ” Buenas t a r d e s ”
else :
s a l u d o = ” Buenas noches ”
s a l u d a r ( s a l u d o , leerNonmbre ( ) )
s a l u d o L i s t a ( s a l u d o , [ ” Juan ” , ” Maria ” , ” J o s e ” ] )
main ( )
from d a t e t i m e import d a t e t i m e
def s a l u d a r ( s a l u d o , nombre ) :
return f ’ { s a l u d o } {nombre} ’
def s a l u d o L i s t a ( s a l u d o , nombres ) :
return [ s a l u d a r ( s a l u d o , nombre ) f or nombre in nombres ]
def main ( ) :
h o r a A c t u a l = d a t e t i m e . now ( )
i f h o r a A c t u a l . hour < 1 2 :
s a l u d o = ”Buen d i a ”
e l i f 12 <= h o r a A c t u a l . hour < 1 8 :
s a l u d o = ” Buenas t a r d e s ”
else :
3.7. Funciones puras 69
s a l u d o = ” Buenas noches ”
nombres =[” Juan ” , ” Maria ” , ” J o s e ” ]
print ( s a l u d a r ( s a l u d o , leerNonmbre ( ) ) )
print ( ”\n” . j o i n ( s a l u d o L i s t a ( s a l u d o , nombres ) ) )
main ( )
from d a t e t i m e import d a t e t i m e
def s a l u d a r ( s a l u d o , nombre ) :
return f ’ { s a l u d o } {nombre} ’
def s a l u d o L i s t a ( s a l u d o , nombres ) :
return [ s a l u d a r ( s a l u d o , nombre ) f or nombre in nombres ]
def armarSaludo ( ) :
h o r a A c t u a l = d a t e t i m e . now ( )
i f h o r a A c t u a l . hour < 1 2 :
s a l u d o = ”Buen d i a ”
e l i f 12 <= h o r a A c t u a l . hour < 1 8 :
s a l u d o = ” Buenas t a r d e s ”
else :
s a l u d o = ” Buenas noches ”
return s a l u d o
def main ( ) :
nombres =[” Juan ” , ” Maria ” , ” J o s e ” ]
70 CapÍtulo 3. Funciones definidas por el usuario
s a l u d o=armarSaludo ( )
print ( s a l u d a r ( s a l u d o , leerNonmbre ( ) ) )
print ( ”\n” . j o i n ( s a l u d o L i s t a ( s a l u d o , nombres ) ) )
main ( )
A diferencia de funciones con efectos colaterales la funciones puras son fáciles de
probar y más fáciles de utilizar en diferentes partes del programa. Un principio es
colocar todos los efectos colaterales en un solo lugar. Esto hace que cualquier efecto
este en un solo lugar.
Caso base El caso base debe ser tan simple que puede ser resuelto sin
una llamada recursiva.
Caso recursivo El caso recursivo involucra convertir el problema a otro
más simple que puede ser resuelto por una llamada recursiva, es decir
llamándose a si mismo.
def funcion(parametros):
if (parametros = algunValor):
caso base que termina la recursión
.........
3.8. Funciones recursivas 71
else
caso recursivo \
.........
Definir la instancia del problema que puede servir como caso base.
Verificar que, a medida que el problema disminuye se puede llegar al caso base.
7 20
4 9 18 25
24 27
EL nodo raı́z es 15, y tiene dos hijos el 7 a la izquierda y el 20 a la derecha. La
caracterı́stica es que el nodo de la izquierda es menor que el de la derecha. Lo mismo
se repite a medida que se desciende en el árbol. El 7 tiene dos hijos el 4 a la izquierda
y el 9 a la derecha.
Para construir este árbol primero se creará una función que permita crear un
árbol vacı́o:
def arbol():
return None
Ahora es necesario crear una función para insertar valores al árbol. El árbol se
divide en tres partes. La raı́z, también llamado nodo padre, el hijo izquierdo y el hijo
derecho. Cuando está vacı́o el valor a insertar es la raı́z y debe estar al centro y los
hijos izquierdo y derecho quedan en blanco, representados por None.
La representación es una tupla con tres valores: (N one, valorInsertar, N one) que
formará el nuevo árbol. Ahora si no es el primer nodo es necesario preguntar si se
colocará a la derecha o a la izquierda para devolver un nuevo árbol.
3.9. Ejemplo de un árbol binario 73
A=arbol()
A=insertar(A, 15)
A=insertar(A, 7)
A=insertar(A, 4)
A=insertar(A, 9)
A= insertar(A, 20)
A= insertar(A, 18)
A= insertar(A, 25)
A= insertar(A, 24)
A= insertar(A, 27)
Cuando se inserta una nueva tupla al 20 al lado derecho. Esto se repite hasta
tener todos los valores ingresados. El estado final de la variable A es:
74 CapÍtulo 3. Funciones definidas por el usuario
(((None,4,None),7,(None,9,None)),15,((None,18,None),20,
((None,24,None),25,(None,27,None))))
Ahora lo que queda es buscar si un valor existe o no. Para esto se utilice la
misma estrategia que para insertar. Cuando es vacı́o es no existe, y en los otros casos
se repite recursivamente para el hijo izquierdo o para el hijo derecho. El código es
como sigue:
75
76 CapÍtulo 4. Introducción informal a la complejidad AlgorÍtmica
es el código que se ejecuta en el interior del ciclo toma un tiempo O(1), es decir
constante. Su tiempo de proceso se considera O(n).
f or i in range ( n ) :
......
El primer ciclo toma un tiempo O(n) el segundo depende del primero y también
toma un tiempo O(n)dando un tiempo total de n∗n = n2 En general si tenemos
k ciclos anidados la complejidad es O(nk ).
f or i in range ( n ) :
f or j in range ( n ) :
......
f or i in range ( n ) :
......
......
def g ( n ) :
i f n==1: return
g ( n−1)
g ( n−1)
def g ( n ) :
i f n==1: return
g (n//2)
se tiene:
n n n
n+ + + · · · + k = log(n) = O(log(n)
2 4 2
En este caso k es el número de iteraciones para llegar al caso base.
Funciones cuadráticas,f (n) = n2 , aparecen por ejemplo en ver todos los pares
de ı́tems de un vector.
79
80 Siglas
BIBLIOGRAFÍA
81
82 BibliografÍa
ÍNDICE ALFABÉTICO
acoplamiento, 63 eficiencia, 73
alı́as, 22, 24 cuadrático, 74
Anaconda, 7 estimación, 76
and, 32 logarı́tmica, 75
reglas de cálculo, 73
break, 39 tiempo constante, 73
entorno de desarrollo, 7
cadenas, 14
entrada de datos, 24
ciclo
entrada eficiente, 43
else, 40
for, 37 factorial, 69
while, 36 ecuación de recurrencia, 69
cohesión, 63 función, 57
comentarios, 10 argumentos, 59
complejidades comunes, 75 argumentos variables, 61
constantes, 10 return, 61
continue, 40 sintaxis, 58
control de flujo, 32 valores por omisión, 60
convertir de un tipo a otro, 18 función pura, 64
corte, 22 función recursiva, 68
funciones incorporadas, 27
datos no escalares, 13 funciones para datos compuestos, 21
83
84 Índice alfabético
not, 32
palabras reservadas, 10
pip, 7