
code time I
dificultad ⭐
Claude AI
Te ayudaré con ejercicios de Python organizados por niveles de dificultad. Los he diseñado para cubrir conceptos importantes que suelen evaluarse en entrevistas para posiciones junior.
NIVEL BÁSICO:
- Escribe una función que determine si un número es par o impar
- Crea un programa que calcule el factorial de un número
- Desarrolla una función que cuente las vocales en una cadena de texto
- Escribe un programa que genere la serie Fibonacci hasta n términos
- Crea una función que invierta una cadena de texto sin usar métodos incorporados
- Desarrolla un programa que determine si un año es bisiesto
- Escribe una función que encuentre el número más grande en una lista
- Crea un programa que convierta temperatura de Celsius a Fahrenheit y viceversa
- Desarrolla una función que cuente las palabras en una oración
- Escribe un programa que sume todos los números en una lista
- Crea una función que verifique si una palabra es palíndromo
- Desarrolla un programa que genere una tabla de multiplicar
- Escribe una función que elimine los espacios en blanco de una cadena
- Crea un programa que calcule el área de diferentes figuras geométricas
- Desarrolla una función que convierta un número decimal a binario
Code TIME!!!
determine si un número es par o impar
- un numero es par si este, es divisible por 2, es decir, x mod 2 = 0
- En python el operador modulo es: %
# determine si un número es par o impar: if ternario
n = int(input("digite un numero: "))
print(f'{n} es un numnero par') if x%2 == 0 else print(f'{n} es un numero impar')
# determine si un número es par o impar: lambda function
test = lambda x: True if x%2 == 0 else False
n = int(input("digite un numero: "))
print(f'{n} es un numnero par') if test(n) else print(f'{n} es un numero impar')
# determine si un número es par o impar: def
def es_par(x):
print(f'{n} es un numnero par ') if x%2 == 0 else print(f'{n} es un numero impar ')
n = int(input("digite un numero: "))
es_par(n)
Factorial de un número
- solo aplica para numeros positivos
# factorial de un numero: solucion imperativa
def factorial(x):
if x in (0, 1):
return 1
else:
aux = 1
for i in range(2, x + 1):
aux = aux * i
return aux
n = int(input("digite un numero: "))
print(f'el factorial de {n} es: {factorial(n)}')
# factorial de un numero: con reduce
from functools import reduce
n = int(input("digite un numero: "))
factorial = 1 if n in (0, 1) else reduce(lambda x, y: x * y, range(2, n + 1))
print(f'el factorial de {n} es: {factorial}')
# factorial de un numero: con recurcion
def factorial(x):
if x in (0, 1):
return 1
else:
return x * factorial(x - 1)
n = int(input("digite un numero: "))
print(f'el factorial de {n} es: {factorial(n)}'
# mas recurción
factorial = lambda x: 1 if x in (0, 1) else x * factorial(x - 1)
n = int(input("digite un numero: "))
print(f'el factorial de {n} es: {factorial(n)}')
contar las vocales en una cadena de texto
# contar las vocales en una cadena de texto: solución imperativa
# word.lower(), transforma word en minusculas (lower case).
vocales = ("a", "e", "i", "o", "u")
word = str(input("digite una palabra: "))
def contar_vocales(x):
aux = 0
for x in word.lower():
if x in vocales:
aux += 1
return aux
print(f'la palabra {word} tiene {contar_vocales(aux)} vocales')
A continuación contar las vocales en una cadena de texto, de una forma mas natural con sum() y count() function. word.count(x) retorna cuantas veces aparece x dentro de word, luego, otra cosa, por lo general, todo for lo puedo reemplazar por un list compresion. Continuando, contamos cuantas veces aparece la a, luego cuantas veces aparece la vocal e, y asi sucesivamente, para finalmente, sumar todo con sum().
# contar las vocales en una cadena de texto: sum() y count() function
vocales = ("a", "e", "i", "o", "u")
word = str(input("digite una palabra: "))
cantidad_vocales = sum(word.lower().count(x) for x in vocales)
print(f'la palabra {word}, tiene {cantidad_vocales} vocales')
# contar las vocales en una cadena de texto: len() function
vocales = ("a", "e", "i", "o", "u")
word = str(input("digite una palabra: "))
cantidad_vocales = len([x for x in word.lower() if x in vocales])
print(f'la palabra {word}, tiene {cantidad_vocales} vocales')
# se me ocurrio llenar una lista con ceros y unos.
# donde si se coincide con una vocal, agrego uno a la lista
# luego sumo toda los unos almacenados en la lista
vocales = ("a", "e", "i", "o", "u")
word = str(input("digite una palabra: "))
cantidad_vocales = sum((1 for x in word.lower() if x in vocales))
print(f'la palabra {word}, tiene {cantidad_vocales} vocales')
Escribe un programa que genere la serie Fibonacci hasta n términos
supongo que si n=10, no se me pide hallar f(10), mas bien, lo que se me pide son los diez primeros numeros de la serie
# serie Fibonacci hasta n términos: solución imperativa
n = 12
def fibonacci(count):
a, b, count = 0, 1, 0
while count < n:
a, b = b, a + b
count += 1
print(f"Fibonacci number {count} -> {a}")
fib = fibonacci(n)
# serie Fibonacci hasta n términos: solución imperativa + función generadora
n = 12
def fibonacci(count):
a, b = 0, 1
while count > 0:
a, b = b, a + b
yield a
count -= 1
fib = fibonacci(n)
for i, num in enumerate(fib, 1):
print(f"Fibonacci number {i} -> {num}")
# función generadora por compresión
stop = 12
fibo = lambda n: 1 if n <= 1 else fibo(n - 1) + fibo(n - 2)
data = (fibo(n) for n in range(stop))
for i, num in enumerate(data, 1):
print(f"Fibonacci number {i} -> {num}")
Crea una función que invierta una cadena de texto
Primeramente de forma imperativa con un bucle for, pues supongo que esto es lo que lo que piden, cuando hacen referencia a no usar funciones integradas. La verdad no voy a saer tan estricto ya veremos otras aproximaciones.
# inviertir una cadena de texto: forma imperativa
word = 'Ají traga la lagartija'
reves = ""
# range(start, stop, step)
for i in range(len(word) -1, -1, -1):
reves += word[i ]
print(reves)
Cundo se trabaja con string, muy probablemente uses los metodos: .join(), .split()
# inviertir una cadena de texto: forma natural
word = 'Ají traga la lagartija'
reves = "".join(c for c in reversed(word))
print(reves)
lo siguiente son los Slice de python, no estoy seguro que esto se pueda hacer en otros lenguajes.
# inviertir una cadena de texto: slice
word = str(input("ingrese un texto: "))
mirror = lambda word: print(f'{word} reves: {word[::-1]}')
mirror(word)
Desarrolla un programa que determine si un año es bisiesto
investigando, un poco, encuentro que un año es bisiesto cuando:
- es divisible por 4 y no por 100
- ser divisible por 400
entonces:
# test and test or test: se comporta como un if ternario
es_bisiesto = lambda x: x % 4 == 0 and x % 100 != 0 or x % 400 == 0
# años ramdon para probar la funcion lambda
d = {"bisiesto": [2016, 2016, 2020, 2024, 2028, 2032, 2036, 2040 ,2044, 2048]}
a = [2000, 1900, 2007, 2024, 2022, 1996, 1700]
b = [randint(1700,3000) for x in range(10)]
for x in a:
print(f'{x} es bisiesto') if es_bisiesto(x) else print(f'{x} no es bisiesto')
print("=======================================")
for x in d["bisiesto"]:
print(f'{x} es bisiesto') if es_bisiesto(x) else print(f'{x} no es bisiesto')
print("=======================================")
for x in b:
print(f'{x} es bisiesto') if es_bisiesto(x) else print(f'{x} no es bisiesto')
Escribe una función que encuentre el número más grande en una lista
se puede abordar con max, no veo mayor dificultad, exploraremos varios acercamientos
# el número más grande en una lista: forma imperativa
from random import randint
data = [randint(1, 100) for _ in range(10)]
def max_custom(data):
c = 0
for i in data:
if i > c:
c = i
return c
print(f'max: {max_custom(data)} de la lista original: {data}')
# el número más grande en una lista: max function
from random import randint
data = [randint(1, 100) for _ in range(10)]
print(f'max: {max(data)} de la lista original: {data}')
# el número más grande en una lista: reduce function
from random import randint
from functools import reduce
data = [randint(1, 100) for _ in range(10)]
test = lambda x, y: x if x > y else y
max_custom = lambda data: reduce(test, data)
print(f'max: {max_custom(data)} de la lista original: {data}')
# el número más grande en una lista: sorted function
from random import randint
data = [randint(1, 100) for _ in range(10)]
print(f'max: {sorted(data)[-1]} de la lista original: {data}')
data = [randint(1, 100) for _ in range(10)]
print(f'max: {sorted(data, reverse = True)[1]} de la lista original: {data}')
Crea un programa que convierta temperatura de Celsius a Fahrenheit y viceversa
Investigando:
C = (F -32) * 5/9
F = 9/5 * C + 32
por tanto el 90% del problema ya esta resuelto
to_celcius = lambda x: (x -32) * 5/9
to_farenheit = lambda x: 9/5 * x + 32
print(f'-50 C -> {to_farenheit(-50)} F')
print(f'0 C -> {to_farenheit(0)} F')
print(f'100 C -> {to_farenheit(100)} F')
print(f'212 F -> {to_celcius(212)} C')
print(f'32 F -> {to_celcius(32)} C')
Desarrolla una función que cuente las palabras en una oración
lo ideal sería leer un archivo de texto, bueno, esa es mi opinión.
# cuente las palabras en una oración: solución iterativa
file = "README.md"
path = "/content/sample_data/" + file
def palabras(path):
acc = 0
with open(path, "r") as f:
for line in f:
for word in line.split():
acc += 1
return acc
print(f'el archivo {file} tiene {palabras(path)} palabras')
# cuente las palabras en una oración: sum y len function
file = "README.md"
path = "/content/sample_data/" + file
def palabras(path):
with open(path, "r") as f:
return sum(len(line.split()) for line in f)
Al final, contar las palabras en una oración se reduce a:
# un bucle for
for word in line.split():
acc += 1
# len function
len(line.split())
es importante tener una noción, de como trabajar con archivos, intentaré profundizar en el tema en publicaciones posteriores.
Escribe un programa que sume todos los números en una lista
# sume todos los números en una lista: version iterativa
from random import randint
data = [randint(1, 100) for _ in range(10)]
def suma_custom(data):
aux = 0
for i in data:
aux += i
return aux
print(f'suma: {suma_custom(data)} de la lista original: {data}')
# sume todos los números en una lista: reduce function
from random import randint
from functools import reduce
suma = lambda x, y: x + y
data = [randint(1, 100) for _ in range(10)]
print(f'suma: {reduce(suma, data)} de la lista original: {data}')
# sume todos los números en una lista: sum function
from random import randint
data = [randint(1, 100) for _ in range(10)]
print(f'suma: {sum(data)} de la lista original: {data}')
# sume todos los números en una lista: accumulate function
from random import randint
from itertools import accumulate
data = [randint(1, 100) for _ in range(10)]
s = list(accumulate( data))
print(s)
print("=======================================")
print(f'suma: {s[-1]} de la lista original: {data}')
Crea una función que verifique si una palabra es palíndromo
“aji traga la lagartija”, “ojo”, son ejemplos de palindromos, ahora, pudieramos aboradar el problema de la siguiente forma:
- obtener la palabra o oracion
- eleiminar espacios en blanco: line.split()
- juntar todo: ““.join(line.split())
- convertir a minusculas: ““.join(line.split()).lower()
- reverse
- comparar
y una vez mas, si lo puedes escribir, ya tienes el 90% del problema resuelto
line_1 = "This directory includes a few sample datasets to get you started"
line_2 = "aji traga la lagartija"
line_3 = "ojo"
data = [line_1, line_2, line_3]
pre = lambda line: "".join(line.split()).lower()
palindromo = lambda line: pre(line)[::-1]
es_palindromo = lambda line: pre(line) == palindromo(line)
for line in data:
print(f'{line} es palindromo') if es_palindromo(line) else print(f'{line} no es palindromo')
Desarrolla un programa que genere una tabla de multiplicar
def tabla(a):
for i in range(1, 11):
print(f'{a} x {i} = {a*i}')
tabla(5)
Escribe una función que elimine los espacios en blanco de una cadena
cadena = "This directory includes a few sample datasets to get you started"
print(cadena.split())
print("".join(cadena.split())
se puede trabajar con bucles for y whiles tradicionales, pero es mas importante, considero yo, dominar split, join y demas metodos que aplican sobre type string
Crea un programa que calcule el área de diferentes figuras geométricas
las diferentes figuras seran:
- circulo
- triangulo
- rectangulo
- cuadrados
Primeramente con, ajuste de patrones o pattern matching, match-case para los panas, una estructura versatil, mas similar a haskell, que al vulgar switch-case que puedes encontrar en otros lenguajes.
def circulo():
r = int(input("digite el radio del circulo: "))
return "circulo", 3.1416 * r**2
def cuadrado():
l = int(input("digite el lado del cuadrado: "))
return "cuadrado", l**2
def triangulo():
b = int(input("digite la base del triangulo: "))
h = int(input("digite la altura del triangulo: "))
return "triangulo", (b*h)/2
def rectangulo():
b = int(input("digite la base del rectangulo: "))
h = int(input("digite la altura del rectangulo: "))
return "rectangulo", b*h
acciones = {
1: cirdulo,
2: cuadrado,
3: triangulo,
4: rectangulo
}
def menu_area():
while True:
print("1. Circulo")
print("2. Cuadrado")
print("3. Triangulo")
print("4. Rectangulo")
print("5. Salir")
print("digite una opcion: ", end="")
opcion = int(input())
match opcion:
case opcion if opcion in acciones:
fig, area = acciones.get(opcion)()
print(f'el area del {fig} es: {area}')
print("==============================")
case 5:
break
case _:
print("opcion invalida")
print("==============================")
menu_area()
Puede ser mas simple, lo siento, mas la verdad lo escribi de tal forma solo por practicar, creanme que la estructura match-case es versatil y hasta mágica.
Desarrolla una función que convierta un número decimal a binario
# decimal a binario: forma imperativa
n = int(input("digite un numero"))
count = 0
def to_binario (decimal):
count = 0
binario = 0
while decimal > 0:
binario += (decimal % 2) * 10**count
decimal //= 2
count += 1
return binario
print(bin(n))
print(f'el numero {decimal} en binario es: {to_binario(n)}')
# decimal a binario: forma imperativa
n = int(input("digite un numero"))
def to_binario(decimal):
binario = ""
while decimal > 0:
binario += "0" if decimal % 2 == 0 else "1"
decimal //= 2
return binario[::-1]
print(f'el numero {n} en binario es: {to_binario(n)}')
Otra forma de llevar un numero de decimal a binario, y que meparece práctico y divertido, es por medio de restas sucesivas de potencias de dos, ejemplo:
dado un numero decimal
d = 14
que lo podemos reescribir como
d = 14 = 8 + 4 + 2 = 1*2^3 + 1*2^2 + 1*2^1 + 0*2^0
binary(14) = 11110
Si se fijan, lo que estamosa haciendo es, encender y apagar bits en un orden, segun corresponda, para luego en el mismo orden en que encendí o apgue los bits, ir anotando dichos bits
from itertools import count, takewhile, repeat
from functools import reduce
n = int(input("digite un numero"))
d, b = n, '0b'
# genero las potencias de dos
base = takewhile(lambda x: x<=n,(2**x for x in count(0)))
# la operaión de apagar y encender bits
op = lambda acc, x: (acc[0] - x[0], acc[1] + '1') if acc[0] >= x[0] else (acc[0], acc[1] + '0')
# la magia
binario = reduce (op, zip(reversed(list(base)), repeat('')), [d, b])
print(binario)
print(bin(n))
print("====================================")
print(f'el numero {n} en binario es: {binario[1]}')