Ejercicios Lección 8
Ejercicios de lo aprendido en la lección 8 POO
Estaciones del amor
Quinientos veinticinco mil seiscientos minutos
Quinientos veinticinco mil momentos tan queridos
Quinientos veinticinco mil seiscientos minutos
¿Cómo se mide, se mide un año? ...... — “ Estaciones de amor ”, Renta
Suponiendo que un año tiene 365 días, hay365×24×60=525,600minutos en ese mismo año (porque hay 24 horas en un día y 60 minutos en una hora). Pero ¿cuántos minutos hay en dos o más años? Bueno, depende de cuántos de esos sean años bisiestos con 366 días, según el calendario gregoriano , ya que algunos de ellos podrían tener1×24×60=1,440minutos adicionales. De hecho, ¿cuántos minutos han pasado desde que naciste? Bueno, ¡eso también depende de cuántos años bisiestos hayan transcurrido desde entonces! Existe un algoritmo para ello, pero no reinventemos esa rueda. Usemos una biblioteca en su lugar. Afortunadamente, Python viene con un datetime
módulo que tiene una clase llamada date
que puede ayudar, según docs.python.org/3/library/datetime.html#date-objects .
En un archivo llamado seasons.py
, implemente un programa que solicite al usuario su fecha de nacimiento en YYYY-MM-DD
formato y luego cante e imprima su edad en minutos, redondeado al entero más cercano, usando palabras en inglés en lugar de números, como en la canción de Rent . sin ninguna and
entre palabras. Dado que es posible que un usuario no sepa la hora a la que nació, supongamos, para simplificar, que el usuario nació a la medianoche (es decir, a las 00:00:00) de esa fecha. Y supongamos que la hora actual también es medianoche. En otras palabras, incluso si el usuario ejecuta el programa al mediodía, supongamos que en realidad es medianoche, en la misma fecha. Úselo datetime.date.today
para obtener la fecha de hoy, según docs.python.org/3/library/datetime.html#datetime.date.today .
Estructura tu programa según lo siguiente, no solo con una main
función sino también con una o más funciones adicionales:
from datetime import date
def main():
...
...
if __name__ == "__main__":
main()
Le invitamos a importar otras bibliotecas (integradas) o cualquiera que se especifique en las sugerencias a continuación. Salga por sys.exit
si el usuario no ingresa una fecha en el YYYY-MM-DD
formato. Asegúrese de que su programa no genere ninguna excepción.
Ya sea antes o después de implementar seasons.py
, implemente adicionalmente, en un archivo llamado test_seasons.py
, una o más funciones que prueben su implementación de cualquier función además main
de manera seasons.py
exhaustiva, cada uno de cuyos nombres debe comenzar con test_
para que pueda ejecutar sus pruebas con:
pytest test_seasons.py
Consejos
Tenga en cuenta que la
date
clase viene con bastantes métodos y "operaciones admitidas", según docs.python.org/3/library/datetime.html#date-objects . En particular, la clase implementa__sub__
, según docs.python.org/3/library/operator.html#operator.sub , la sobrecarga-
de tal manera que restar undate
objeto de otro devuelve untimedelta
objeto, que a su vez viene con varios (solo lectura). ) “atributos de instancia”, según docs.python.org/3/library/datetime.html#timedelta-objects .Tenga en cuenta que el
inflect
módulo viene con bastantes métodos, según pypi.org/project/inflect . Puedes instalarlo con:pip install inflect
Tarro de galletas
Fuente: Barrio Sésamo
Supongamos que desea implementar un tarro de galletas en el que almacenar cookies. En un archivo llamado jar.py
, implemente un class
llamado Jar
con estos métodos:
__init__
debe inicializar un tarro de galletas con el valor dadocapacity
, que representa la cantidad máxima de cookies que pueden caber en el tarro de galletas. Sin embargo, sicapacity
no es un valor no negativoint
,__init__
debería generar un valorValueError
.__str__
debería devolver unstr
connorte🍪
, dóndenortees la cantidad de galletas en el tarro de galletas. Por ejemplo, si hay 3 cookies en el tarro de galletas, entoncesstr
debería devolver"🍪🍪🍪"
deposit
Debería agregarn
galletas al tarro de galletas. Sin embargo, si agregar tantas excedería la capacidad del tarro de galletas,deposit
debería generar unValueError
.withdraw
Debes quitarn
las galletas del tarro de galletas. NOM Nom Nom. Sin embargo, si no hay tantas cookies en el tarro de galletas,withdraw
debería generar un archivoValueError
.capacity
debería devolver la capacidad del tarro de galletas.size
debería devolver la cantidad de cookies que realmente hay en el tarro de galletas, inicialmente0
.
Estructura tu class
según lo siguiente. No puede modificar los parámetros de estos métodos, pero puede agregar sus propios métodos.
class Jar:
def __init__(self, capacity=12):
...
def __str__(self):
...
def deposit(self, n):
...
def withdraw(self, n):
...
@property
def capacity(self):
...
@property
def size(self):
...
Ya sea antes o después de implementar jar.py
, implemente adicionalmente, en un archivo llamado test_jar.py
, cuatro o más funciones que en conjunto prueban su implementación Jar
a fondo, cada uno de cuyos nombres debe comenzar con test_
para que pueda ejecutar sus pruebas con:
pytest test_jar.py
Tenga en cuenta que no es tan fácil probar métodos de instancia como probar funciones solas, ya que los métodos de instancia a veces manipulan el mismo "estado" (es decir, variables de instancia). Para probar un método (por ejemplo, withdraw
), es posible que deba llamar a otro método primero (por ejemplo, deposit
). ¡Pero el método que llame primero podría no ser correcto!
Y así, los programadores a veces se burlan (es decir, simulan) el estado cuando prueban métodos, como ocurre con la propia biblioteca de objetos simulados de Python , de modo que se puede llamar solo a un método pero modificar primero el estado subyacente, sin llamar al otro método para hacerlo.
Sin embargo, para simplificar, no es necesario burlarse de ningún Estado. ¡Implemente sus pruebas como lo haría normalmente!
Consejos
from jar import Jar
def test_init():
...
def test_str():
jar = Jar()
assert str(jar) == ""
jar.deposit(1)
assert str(jar) == "🍪"
jar.deposit(11)
assert str(jar) == "🍪🍪🍪🍪🍪🍪🍪🍪🍪🍪🍪🍪"
def test_deposit():
...
def test_withdraw():
...
Camiseta CS50
Supongamos que desea implementar un “shirtificate” de CS50, un PDF con una imagen de una camiseta de CS50 que tomé , shirtificate.png , personalizada con el nombre de un usuario.
En un archivo llamado shirtificate.py
, implemente un programa que solicite al usuario su nombre y resultados, usando fpdf2 , una camiseta CS50 en un archivo llamado shirtificate.pdf
similar a este de John Harvard , con estas especificaciones:
- La orientación del PDF debe ser vertical.
- El formato del PDF debe ser A4, que mide 210 mm de ancho por 297 mm de alto.
- La parte superior del PDF debe decir "CS50 Shirtificate" como texto , centrado horizontalmente.
- La imagen de la camiseta debe estar centrada horizontalmente.
- El nombre del usuario debe estar encima de la camiseta, en texto blanco .
Todos los demás detalles te los dejamos a ti. Incluso puedes agregar bordes, colores y líneas . Tu camiseta no tiene por qué coincidir exactamente con la de John Harvard. Y no es necesario incluir nombres largos en varias líneas.
Antes de escribir cualquier código, lea el tutorial de fpdf2 para aprender a usarlo. Luego, hojee la API (interfaz de programación de aplicaciones) de fpdf2 para ver todas sus funciones y parámetros.
No es necesario enviar ningún archivo PDF con su código. Pero, si lo deseas, puedes (aunque no se espera) que compartas una camiseta con tu nombre en cualquiera de las comunidades de CS50 .
Consejos
Tenga en cuenta que fpdf2 viene con un
class
llamadoFPDF
, que tiene bastantes métodos, según py-pdf.github.io/fpdf2/fpdf/#fpdf.FPDF . Puedes instalarlo con:pip install fpdf2
Tenga en cuenta que puede ampliar
FPDF
y crear una instancia de su propia subclase para agregar un encabezado a cada página de un PDF, según py-pdf.github.io/fpdf2/Tutorial.html#tuto-2-header-footer-page-break -e-imagen . O puede agregarlo usted mismo como texto.Tenga en cuenta que puede desactivar los saltos de página automáticos, que de otro modo podrían provocar que su PDF se desborde de una página a dos, con
set_auto_page_break
, según py-pdf.github.io/fpdf2/Margins.html .Tenga en cuenta que la altura de una celda puede ser negativa para moverla hacia arriba.
Puede abrir
shirtificate.pdf
, una vez generado, haciendo clic en él en el explorador de archivos de VS Code.