B: Ejercicios resueltos del módulo «Introducción a Python»


Ejercicio B.1:

Calculemos el valor del polinomio \(f(x) = a x^2 + bx + c\) (con valores \(a\), \(b\) y \(c\)) en un punto \(x\) a su elección.

[1]:
a = 2
b = 1
c = -2
x = 2

resultado = a * x ** 2 + b * x + c

print(resultado)
8

Ejercicio B.2:

Convierta una ascensión recta \(ar = 23.572\) a grados \(^{\circ}\), minutos \('\) y segundos \(''\).

[2]:
ar = 23.572
horas = ar // 1
restoHoras = ar - horas

minutosConDecimales = restoHoras * 60

minutos = minutosConDecimales // 1
restoMinutos = minutosConDecimales - minutos

segundos = restoMinutos * 60

print(f"La Ascensión Recta {ar} son {horas} horas, {minutos} minutos y {segundos} segundos.")

comprobacion = horas + minutos / 60 + segundos / 60**2

print(f"Comprobamos haciendo la operación inversa y sale {comprobacion}")
La Ascensión Recta 23.572 son 23.0 horas, 34.0 minutos y 19.199999999997033 segundos.
Comprobamos haciendo la operación inversa y sale 23.572

Ejercicio B.3:

Hagamos un bloque de código que identifique un grupo de edad para una edad expresada en años según las siguientes tabla:

  • Menor de 2 años: Bebé

  • Entre 2 y 11 años: Niño

  • Entre 11 y 18 años: Adolescente

  • Entre 18 y 40 años: Adulto joven

  • Entre 40 y 60 años: Adulto que se cree joven

  • Entre 60 y 100 años: Viejuno

  • Más de 100 años: ¿Qué come esta persona?

[3]:
edad = 42  # Cambiar a distintos valores para comprobar nuestro código

if edad < 2:
    print("Bebé")
elif edad < 12:
    print("Niño")
elif edad < 19:
    print("Adolescente")
elif edad < 41:
    print("Adulto joven")
elif edad < 61:
    print("Adulto que se cree joven")
elif edad < 101:
    print("Viejuno")
else:
    print("¿Qué come esta persona?")
Adulto que se cree joven

Ejercicio B.4:

Para la lista dada más abajo consigue que quede con los Planetas ordenados (por proximidad al Sol) usando sustituciones, cortes, etc.

[4]:
planetas = ["Mercurio", "Venus", "Plutón", "Tierra", "Júpiter", "Saturno",
            "Marte", "Urano", "Neptuno"]

planetas.remove("Plutón")  # ¿Qué hace este aquí?

planetas = planetas[0:3] + planetas[5:6] + planetas[3:5] + planetas[6:8]

print(planetas)
['Mercurio', 'Venus', 'Tierra', 'Marte', 'Júpiter', 'Saturno', 'Urano', 'Neptuno']

Ejercicio B.5:

Crear una lista llamada planetas que contenga diccionarios. Cada diccionario debe tener información sobre un planeta (nombre, distancia al Sol (en UAs), y si es terrestre o no. Por ejemplo, planetas[3]['terrestre'] debe dar True y planetas[2]['distanciaSol'] debe dar 1.0.

[5]:
planetas = [
    {'nombre': 'Mercurio',
     'distanciaSol': 0.39,
     'terrestre': True
    },
    {'nombre': 'Venus',
     'distanciaSol': 0.72,
     'terrestre': True
    },
    {'nombre': 'Tierra',
     'distanciaSol':1.0,
     'terrestre': True
    },
    {'nombre': 'Marte',
     'distanciaSol': 1.52,
     'terrestre': True
    },
    {'nombre': 'Júpiter',
     'distanciaSol': 5.2,
     'terrestre': False
    },
    {'nombre': 'Saturno',
     'distanciaSol': 9.54,
     'terrestre': False
    },
    {'nombre': 'Urano',
     'distanciaSol': 19.19,
     'terrestre': False
    },
    {'nombre': 'Neptuno',
     'distanciaSol': 30.06,
     'terrestre': False
    },
]

print(planetas[3]['terrestre'])
print(planetas[2]['distanciaSol'])

True
1.0

Ejercicio B.6:

Dada una distancia en UAs imprimir el nombre del planeta cuya órbita está más cerca. Necesitamos el ejercicio B.5 resuelto.

[6]:
distancia = 3.76

distanciaAOrbita = 10000000
planetaMasCercano = None

for planeta in planetas:
    if distancia > planeta['distanciaSol']:      # Esto es un poco chapuzas, lo arreglaremos luego
        d = distancia - planeta['distanciaSol']
    else :
        d = planeta['distanciaSol'] - distancia

    if d < distanciaAOrbita:
        distanciaAOrbita = d
        planetaMasCercano = planeta

print(planetaMasCercano['nombre'])
Júpiter

Ejercicio B.7:

En el ejercicio B.1 calculamos el valor de una función polinómica de grado 2. Construyamos una función llamada polinomio que admita como parametros x, a, b y c y devuelva el resultado de la evaluación del polinomio.

[7]:
def polinomio(x, a, b, c):
    return a * x**2 + b * x + c

polinomio(2, 2, 1, -2)
[7]:
8

Ejercicio B.8:

Hagamos una función evaluaPolinomio usando la función polinomio del ejercicio anterior devuelva una lista de tuplas \((x, f(x))\) evaluando el polinomio en diferentes \(x\). Como parámetros debe admitir xMin, xMax, xStep (incremento de evaluación entre xMin y xMax), a, b y c. Luego prueba las última líneas comentadas… ¡a ver que pasa!

Nota: Para que funcione la última parte del ejercicio (que grafica el resultado) hace falta instalar un paquete de Python llamado matplotlib. Para hacerlo abrimos un nuevo Anaconda prompt, activamos el entorno cursoAstronomia y ejecutamos:

> conda install -c conda-forge matplotlib

Es posible que tengamos que reiniciar el Kernel de JupiterLab para que tenga efecto la instalación del nuevo paquete: Kernel \(\rightarrow\) Restart Kernel....

[8]:
def evaluaPolinomio(xMin, xMax, xStep, a, b, c):
    x = xMin

    puntos = []  # Lista vacia

    while x < xMax:
        puntos.append( (x, polinomio(x, a, b, c)) )

        x = x + xStep

    return puntos

puntos = evaluaPolinomio(-1, 1, .1, 2, 1, -2)

import matplotlib.pyplot as plt    # Esto aún no hay que entenderlo. Lo veremos más adelante.
x, y = zip(*puntos)
plt.plot(x, y)
plt.show()
_images/B-3-ejerciciosResueltosIntroduccionPython_16_0.png

Ejercicio B.9:

Hagamos una función similar a la del ejercicio B.7 llamada polinomioN, pero que acepte un argumento x con valor por defecto 0.0 y un número indeterminado de argumentos que serían los coeficientes a, b, c del polinomio de grado igual al número de coeficientes menos uno (si te pasan 3 parámetros será un polinomio de grado 2).

[9]:
def polinomioN(*coef, x = 0.0):
    coeficienteActual = len(coef) - 1

    res = 0

    for c in coef:
        res = res + c * x ** coeficienteActual
        coeficienteActual = coeficienteActual - 1

    return res

print(polinomioN(3, 2, 1, -2, x=2.0))
32.0

Ejercicio B.10:

Creemos una función evaluaF similar a la del ejercicio B.8 que evalue en varios puntos (de xMin a xMax en pasos de xStep). Pasaremos como parámetro una nueva función raizCubica y sierra que viene definida por \(sierra(x) = x \pmod 1\).

[10]:
def raizCubica(x):
    return x**(1.0/3.0)

def sierra(x):
    return x%1

def evaluaF(func, xMin = 0, xMax = 4.0, xStep = 0.01):
    x = xMin

    puntos = []

    while x < xMax:
        puntos.append( (x, func(x)) )

        x = x + xStep

    return puntos

puntos1 = evaluaF(raizCubica)
puntos2 = evaluaF(sierra)

import matplotlib.pyplot as plt
x, y = zip(*puntos1)
plt.plot(x, y)
x, y = zip(*puntos2)
plt.plot(x, y)
plt.show()
_images/B-3-ejerciciosResueltosIntroduccionPython_20_0.png

Ejercicio B.11:

Si quisieramos listar todos los números primos menores de un valor n utilizar la función anteriormente definida esPrimo() para cada valor posible sería bastante ineficiente. Vamos a implementar una función que haga la criba de Eratóstenes que devuelva una lista de todos los primos menores de n.

[11]:
n = 20000

def esPrimo(numero):
    for n in range(2, numero):
        if (numero % n == 0):
            return False

    return True

def getPrimosMenores(n):
    primos = []

    for i in range(2, n):
        if (esPrimo(i)):
            primos.append(i)

    return primos

def cribaEratostenes(n):
    posiblesPrimos = [True for x in range(n)]   # Inicializamos una tabla con n "True". Esta tbla marcará i un numero es primo

    i = 2

    while i*i <= n:
        if posiblesPrimos[i]:             # Si el numero por el que vamos es primo
            for h in range(i*2, n, i):    # Recorremos los multiplos de este numero por encima
                posiblesPrimos[h] = False # Y los vamos tachando

        i = i + 1

    primos = []

    for i in range(2, n):
        if posiblesPrimos[i]:
            primos.append(i)

    return primos

import time

t1 = time.perf_counter()
primos = getPrimosMenores(n)
t2 = time.perf_counter()
print(f"Obtener los primos menores que {n} con la función esPrimo ha llevado {t2-t1} segundos.")
#print(primos)

t1 = time.perf_counter()
primos = cribaEratostenes(n)
t2 = time.perf_counter()
print(f"Obtener los primos menores que {n} con la criba de Eratóstenes ha llevado {t2-t1} segundos.")
#print(primos)


Obtener los primos menores que 20000 con la función esPrimo ha llevado 0.7798599090001517 segundos.
Obtener los primos menores que 20000 con la criba de Eratóstenes ha llevado 0.002030547000686056 segundos.

Ejercicio B.12:

Creemos una clase llamada Polinomio que nos permita encapsular la información de un polinomio de grado arbitrario n. Dicha clase debe almacenar la información de sus coeficientes y debe proveer métodos para:

  • obtener los coeficientes del polinomio,

  • para obtener el coeficiente con índice n,

  • para obtener el grado del polinomio,

  • para evaluar el polinomio en cualquier punto x y

  • para obtener una lista de puntos evaluados similar a la del ejercicio B.8.

[12]:
class Polinomio:
    coeficientes = []

    def __init__(self, *coeficientes):
        self.coeficientes = coeficientes

    def getCoeficiente(self, grado):
        return self.coeficientes[self.getGrado()-grado]

    def getGrado(self):
        return len(self.coeficientes) - 1

    def evalua(self, x):
        coeficienteActual = self.getGrado()

        res = 0
        for c in self.coeficientes:
            res = res + c * x ** coeficienteActual
            coeficienteActual = coeficienteActual - 1

        return res

    def evaluaF(self, xMin = -2, xMax = 2, xStep = 0.01):
        x = xMin

        puntos = []

        while x < xMax:
            puntos.append( (x, self.evalua(x)) )

            x = x + xStep

        return puntos

pol1 = Polinomio(1.25, 2, -1, -2)

print(f"Los coeficientes del polinomio: {pol1.coeficientes}")

print(f"El coeficiente de grado 2 es: {pol1.getCoeficiente(2)}")

print(f"El grado del polinomio es: {pol1.getGrado()}")

print(f"El polinomio en x=2.0 vale: {pol1.evalua(2.0)}")

puntos1 = pol1.evaluaF()

pol2 = Polinomio(2, 0, 0)
puntos2 = pol2.evaluaF()

import matplotlib.pyplot as plt
x, y = zip(*puntos1)
plt.plot(x, y)
x, y = zip(*puntos2)
plt.plot(x, y)
plt.show()
Los coeficientes del polinomio: (1.25, 2, -1, -2)
El coeficiente de grado 2 es: 2
El grado del polinomio es: 3
El polinomio en x=2.0 vale: 14.0
_images/B-3-ejerciciosResueltosIntroduccionPython_24_1.png