Este proyecto contiene ejercicios en Python 3 para practicar las nociones esenciales del lenguaje: estructuras de control (condiciones y bucles), manipulación de tipos básicos (cadenas, listas y diccionarios) y conceptos, tanto matemáticos como de programación. Se incluyen tests automáticos para que puedas comprobar si tu solución es correcta.
El objetivo es completar cada función propuesta para generar la solución deseada, ejecutando los tests hasta que no falle ninguno para saber que la solución desarrollada es válida. Los ejercicios no están ordenados de menor a mayor dificultad, puedes hacerlos en el orden que quieras (si te atascas, también puedes pasar a otro y volver a intentarlo más tarde).
Consta principalmente de dos ficheros:
exercises.py
: Fichero principal donde tienes que trabajar. Contiene una plantilla con las diferentes funciones que hay que implementar. Solo tienes que reemplazar elpass
de cada función por tu códigotests.py
: Fichero de tests automáticos que se ejecutan sobre cada función deexercises.py
. No tienes que modificar este fichero: en él están incluidos los tests que comprobarán si tus soluciones son válidas.
- Manual de instalación
- Manual de ejecución de tests automáticos
- Descripción de cada función
- Posibles problemas
El proyecto está listo para empezar a trabajar en el fichero exercises.py
, solo tienes que "duplicar" el proyecto en tu github de esta forma:
- Accede a la url del proyecto: https://github.com/Belco90/python-basic-exercises
- En la parte superior derecha, haz clic en el botón Fork: ¡Github te redireccionará al mismo proyecto pero duplicado en tu propia cuenta! Así podrás trabajar en él y subir tus cambios a tu propio repositorio (el proyecto python-basic-exercises habrá aparecido en tu perfil github, puedes comprobarlo más tarde).
- Ahora solo tienes que clonar tu proyecto en tu local, haciendo clic en Clone or download en el proyecto recién duplicado en tu github (¡no en el mío!) y copiando la url que hay dentro; después haces
git clone <url>
en la carpeta de tu ordenador que desees. Recuerda que:- Si estás usando windows, tendrás que acceder a la carpeta, después hacer clic con botón derecho y seleccionar Git bash here antes de clonar el proyecto.
- Si estás usando linux o mac, tendrás que acceder a la carpeta desde el terminal con el comando
cd
antes de clonar el proyecto.
Tienes varias opciones para ejecutar los tests automáticos:
-
Desde un terminal. Si estás usando el terminal y te encuentras en la ruta del proyecto, puedes lanzar los tests con el comando
python tests.py
(verás este mensaje cuando todos los tests pasen correctamente, si no verás un error por cada test fallido explicando qué ha pasado) -
Desde pycharm. Si usas pycharm, solo tienes que abrir el fichero tests.py, hacer clic derecho en la pestaña del fichero y seleccionar Run 'Unittests in tests.py' en el desplegable.
-
Desde pycharm (alternativa). Cuando hayas ejecutado los tests con la opción número 2, aparecerá una consola con el resultado de los tests en la parte de abajo de pycharm. Desde ahí podrás relanzar los tests clicando en botón de play verde.
Aquí puedes encontrar una descripción del funcionamiento de cada función.
Obtiene el número más grande de una lista de números recibida.
No puedes usar el método nativo max
ni modificar la lista recibida.
Argumentos:
numbers
: Lista de números
Valor de retorno: Mayor número encontrado.
Ejemplos:
>>> print get_largest_number([4, 500, 250, 499.9, 4.1, 3.9])
500
>>> print get_largest_number([1, 2, 4, 4, -3, 3, 1, -1])
4
Obtiene el número más pequeño de una lista de números recibida.
No puedes usar el método nativo min
ni modificar la lista recibida.
Argumentos:
numbers
: Lista de números
Valor de retorno: Menor número encontrado.
Ejemplos:
>>> print get_smallest_number([4, 500, 250, 499.9, 4.1, 3.9])
3.9
>>> print get_smallest_number([1, 2, 4, 4, -3, 3, 1, -1])
-3
Obtiene una lista solo con los números pares de la lista recibida.
No puedes modificar la lista recibida.
Argumentos:
numbers
: Lista de números
Valor de retorno: Lista de números pares encontrados.
Ejemplos:
>>> print get_even_numbers([1, 3, 3, 0, 4, 5, 17, 22, 209, 100, -2, -7, -90])
[0, 4, 22, 100, -2, -90]
>>> print get_even_numbers([1, 15, 27, -3, -5])
[]
Filtra la lista de números recibida para dejar solo los números pares.
Tienes que modificar la lista recibida (igual que get_even_numbers
pero modificando la lista original en lugar de devolver una nueva).
Argumentos:
numbers
: Lista de números
Valor de retorno: Nada
Ejemplos:
>>> print filter_even_numbers([1, 3, 3, 0, 4, 5, 17, 22, 209, 100, -2, -7, -90])
None
>>> print get_even_numbers([1, 15, 27, -3, -5])
None
Genera una cadena que contiene un rectángulo sólido de x
columnas e y
filas, hecho con el símbolo *.
Argumentos:
x
: Número de columnas (ancho)y
: Número de filas (altura)
Valor de retorno: Cadena que contiene el rectángulo sólido correspondiente
Ejemplos:
>>> print draw_solid_rectangle(1, 1)
*
>>> print draw_solid_rectangle(2, 2)
**
**
>>> print draw_solid_rectangle(3, 3)
***
***
***
>>> print draw_solid_rectangle(5, 9)
*****
*****
*****
*****
*****
*****
*****
*****
*****
>>> print draw_solid_rectangle(9, 5)
*********
*********
*********
*********
*********
>>> print draw_solid_rectangle(1, 5)
*
*
*
*
*
>>> print draw_solid_rectangle(5, 1)
*****
Genera una cadena que contiene el borde de un rectángulo de x
columnas e y
filas, hecho con el símbolo *.
Argumentos:
x
: Número de columnas (ancho)y
: Número de filas (altura)
Valor de retorno: Cadena que contiene el borde del rectángulo correspondiente
Ejemplos:
>>> print draw_rectangle_borders(1, 1)
*
>>> print draw_rectangle_borders(2, 2)
**
**
>>> print draw_rectangle_borders(3, 3)
***
* *
***
>>> print draw_rectangle_borders(5, 9)
*****
* *
* *
* *
* *
* *
* *
* *
*****
>>> print draw_rectangle_borders(9, 5)
*********
* *
* *
* *
*********
>>> print draw_rectangle_borders(1, 5)
*
*
*
*
*
>>> print draw_rectangle_borders(5, 1)
*****
Genera una cadena con una pirámide de height
filas, hecha con el símbolo *.
Tiene que devolver un str
con la pirámide (sin espacios al final de cada línea), si simplemente haces print
por pantalla no funcionará.
Argumentos:
height
: Número de filas (altura).
Valor de retorno: Cadena con la pirámide correspondiente.
Ejemplos:
>>> print draw_pyramid(1)
*
>>> print draw_pyramid(2)
*
***
>>> print draw_pyramid(5)
*
***
*****
*******
*********
Genera una cadena con una pirámide invertida de height
filas, hecha con el símbolo *.
Tiene que devolver un str
con la pirámide (sin espacios al final de cada línea), si simplemente haces print
por pantalla no funcionará.
Argumentos:
height
: Número de filas (altura).
Valor de retorno: Cadena con la pirámide invertida correspondiente.
Ejemplos:
>>> print draw_inverted_pyramid(1)
*
>>> print draw_inverted_pyramid(2)
***
*
>>> print draw_inverted_pyramid(5)
*********
*******
*****
***
*
Cuenta cuántas veces aparece cada carácter en una cadena.
No puedes usar la clase collections.Counter
.
Ten en cuenta que minúsculas y mayúsculas son carácteres diferentes (por ejemplo: 'A' es diferente de 'a').
Argumentos:
string
: Cadena a analizar
Valor de retorno: Diccionario con pares clave-valor de carácter y número de apariciones.
Ejemplos:
>>> print chars_counter("hello world!")
{'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1, '!': 1}
>>> print chars_counter("A man, a plan, a canal, Panama!")
{'a': 9, ' ': 6, 'n': 4, ',': 3, 'm': 2, 'l': 2, 'A': 1, 'c': 1, 'P': 1, 'p': 1, '!': 1}
Obtiene la lista recibida ordenada en orden ascendente (de menor a mayor).
No puedes usar el método nativo sorted
ni modificar la lista recibida.
Argumentos:
elements
: Lista para ordenar
Valor de retorno:
Nueva lista con los valores de elements
ordenados en orden ascendente.
Ejemplos:
>>> print sort_list_ascending([6, 4, 3, 1, 1, 2, 0, -1, 15, 7])
[-1, 0, 1, 1, 2, 3, 4, 6, 7, 15]
>>> print sort_list_ascending(['b', 'Z', 'c', 'a', 'A', 'e'])
['A', 'Z', 'a', 'b', 'c', 'e']
Comprueba si una fecha es válida o no.
No puedes usar nada de los módulos nativos datetime
ni calendar
.
Cuidado con los años bisiestos. Recuerda los 3 criterios relacionados con años bisiestos son:
- si un año es divisible entre 4, entonces sí es año bisiesto
- a no ser que el año sea divisible entre 100, entonces no es año bisiesto
- pero si un año es divisible entre 100 y también entre 400, entonces sí es año bisiesto
Argumentos:
day
: Número correspondiente al día de la fechamonth
: Número correspondiente al mes de la fechayear
: Número correspondiente al año de la fecha
Valor de retorno:
True
si la fecha es válida, False
en otro caso.
Ejemplos:
>>> print check_date(1, 1, 1)
True
>>> print check_date(4, 9, 1990)
True
>>> print check_date(4, 9, -1)
False
>>> print check_date(0, 9, 1991)
False
>>> print check_date(30, 13, 1991)
False
>>> print check_date(31, 5, 1989)
True
>>> print check_date(31, 4, 1989)
False
>>> print check_date(29, 2, 2017)
False
>>> print check_date(29, 2, 1900)
False
>>> print check_date(29, 2, 2020)
True
>>> print check_date(29, 2, 2000)
True
Comprueba si una cadena es palíndromo o no.
Un palíndromo es una cadena que da igual leerla de derecha a izquierda o de izquierda a derecha.
Ten cuidado con los espacios, los símbolos, las minúsculas y las mayúsculas.
Argumentos:
string
: Cadena a comprobar
Valor de retorno:
True
si la cadena recibida es palíndromo, False
en otro caso.
Ejemplos:
>>> print check_palindrome("y")
True
>>> print check_palindrome("nope")
False
>>> print check_palindrome("racecar")
True
>>> print check_palindrome("Madam")
True
>>> print check_palindrome("A man, a plan, a canal, Panama!")
True
>>> print check_palindrome("Was it a car or a cat I saw?")
True
>>> print check_palindrome("Was it a dog or a cat I saw?")
False
>>> print check_palindrome("No 'x' in Nixon")
True
>>> print check_palindrome("1234321")
True
>>> print check_palindrome("123321")
True
>>> print check_palindrome("123421")
False
Une la lista de cadenas recibidas en una sola cadena separada por comas, sin espacios ni comas a principio ni final.
No puedes usar el método str.join
ni modificar la lista recibida.
Argumentos:
strings
: Lista de cadenas a unir
Valor de retorno: Cadena con todas las cadenas recibidas unidas por coma.
Ejemplos:
>>> print join_strings(["red", "blue", "yellow", "green"])
red,blue,yellow,green
>>> print join_strings(["hello", "world"])
hello,world
>>> print join_strings(["oops"])
oops
Es posible que veas el mensaje No python interpreter configured for the project dependiendo de la versión de PyCharm que estés utilizando.
Si ves alguno de los mensajes señalados en la imagen de arriba al abrir un fichero python del proyecto o intentar ejecutar los tests, entonces tienes que seguir estos pasos:
- Cierras la ventanita del recuadro rojo 2 en caso de que se te haya abierto.
- Clicas en Configure Python Interpreter (señalado con la flecha en el recuadro rojo 1) o abres las preferencias y vas al apartado correspondiente (Preferences --> Project:
nombre de vuestro proyecto
--> Project Interpreter). Verás una ventana como esta:
- Ahora clicas en la rueda dentada marcada con la flecha roja y luego en Add local. Verás otra ventana como esta:
- Fíjate si en Base interpreter tienes ya seleccionada una versión de python. Si no lo está, clica y selecciona cualquiera que sea python 2.7. No hará falta que cambies nada más, simplemente clica en OK para crear tu intérprete python. Verás que se está generando y cuando acabe volverás a la ventana anterior con el intérprete generado y seleccionado, tal que así:
- Vuelve a clicar en OK para cerrar la ventana de preferencias y ya deberías tener todo correctamente configurado. Verás que ha aparecido una carpeta
venv
en tu proyecto (puedes ignorarla, ni se va a subir a tu repositorio) y si ahora intentas ejecutar los tests, se lanzarán correctamente: