Ejercicios Lección 6
Practicaremos con ejercicios que aprendimos en la lección 6
Líneas de código
Una forma de medir la complejidad de un programa es contar su número de líneas de código (LOC), excluyendo líneas en blanco y comentarios. Por ejemplo, un programa como
# Say hello
name = input("What's your name? ")
print(f"hello, {name}")
tiene sólo dos líneas de código, no cuatro, ya que su primera línea es un comentario y su segunda línea está en blanco (es decir, solo espacios en blanco). No son tantos, por lo que es probable que el programa no sea tan complejo. Por supuesto, sólo porque un programa (o incluso una función) tenga más líneas de código que otro no significa necesariamente que sea más complejo. Por ejemplo, una función como
def is_even(n):
if n % 2 == 0:
return True
else:
return False
en realidad no es dos veces más complejo que una función como
def is_even(n):
return n % 2 == 0
aunque el primero tiene (más del) doble de líneas de código. De hecho, ¡podría decirse que el primero sería más simple si fuera más fácil de leer! Por lo tanto, las líneas de código deben tomarse con cautela .
Aun así, en un archivo llamado lines.py
, implemente un programa que espere exactamente un argumento de línea de comando, el nombre (o ruta) de un archivo Python, y genere el número de líneas de código en ese archivo, excluyendo comentarios y líneas en blanco. Si el usuario no especifica exactamente un argumento de línea de comando, o si el nombre del archivo especificado no termina en .py
, o si el archivo especificado no existe, el programa debería salir mediante sys.exit
.
Supongamos que cualquier línea que comience con #
, opcionalmente precedida por un espacio en blanco, es un comentario. (Una cadena de documentación no debe considerarse un comentario). Supongamos que cualquier línea que solo contenga espacios en blanco está en blanco.
Consejos
- Recuerde que a
str
viene con bastantes métodos, según docs.python.org/3/library/stdtypes.html#string-methods , incluidoslstrip
ystartswith
. - Tenga en cuenta que
open
puederaise
hacerloFileNotFoundError
, según docs.python.org/3/library/exceptions.html#FileNotFoundError . - Puede que le resulte útil probar su programa, por ejemplo, en parte del código fuente de la Semana 6, así como en sus propios programas.
#[Pizza Py
Quizás el lugar más popular para comer pizza en Harvard Square sea Pinocchio's Pizza & Subs , también conocido como Noch's, conocido por su pizza siciliana , que es "una pizza de masa gruesa o de plato hondo".
Los estudiantes tienden a comprar pizza por porción, pero Pinocchio's también tiene pizzas enteras en su menú , según este archivo CSV de pizzas sicilianas, sicilian.csv , a continuación:
Sicilian Pizza,Small,Large
Cheese,$25.50,$39.95
1 item,$27.50,$41.95
2 items,$29.50,$43.95
3 items,$31.50,$45.95
Special,$33.50,$47.95
Consulte también regular.csv para obtener un archivo CSV de pizzas normales.
Por supuesto, un archivo CSV no es el formato más fácil de ver para el cliente. Más bonita podría ser una tabla con formato ASCII art , como esta:
+------------------+---------+---------+
| Sicilian Pizza | Small | Large |
+==================+=========+=========+
| Cheese | $25.50 | $39.95 |
+------------------+---------+---------+
| 1 item | $27.50 | $41.95 |
+------------------+---------+---------+
| 2 items | $29.50 | $43.95 |
+------------------+---------+---------+
| 3 items | $31.50 | $45.95 |
+------------------+---------+---------+
| Special | $33.50 | $47.95 |
+------------------+---------+---------+
En un archivo llamado pizza.py
, implemente un programa que espera exactamente un argumento de línea de comando, el nombre (o ruta) de un archivo CSV en formato de Pinocho, y genera una tabla formateada como arte ASCII usando tabulate
, un paquete en PyPI en pypi.org/ proyecto/tabular . Formatee la tabla usando el grid
formato de la biblioteca. Si el usuario no especifica exactamente un argumento de línea de comando, o si el nombre del archivo especificado no termina en .csv
, o si el archivo especificado no existe, el programa debería salir mediante sys.exit
.
Consejos
Recuerde que el
csv
módulo viene con bastantes métodos, según docs.python.org/3/library/csv.html , entre los que se encuentranreader
, según docs.python.org/3/library/csv.html#csv.reader , yDictReader
, según docs.python.org/3/library/csv.html#csv.DictReader .Tenga en cuenta que
open
puederaise
hacerloFileNotFoundError
, según docs.python.org/3/library/exceptions.html#FileNotFoundError .Tenga en cuenta que el
tabulate
paquete viene con solo una función, según pypi.org/project/tabulate . Puedes instalar el paquete con:pip install tabulate
Flagelar
"Ah, bueno", dijo Tonks, cerrando de golpe la tapa del maletero, "al menos está todo dentro. Eso también podría necesitar un poco de limpieza". Apuntó su varita a la jaula de Hedwig. " Azotar ". Algunas plumas y excrementos desaparecieron.
— Harry Potter y la Orden del Fénix
Los datos también a menudo necesitan ser “limpiados”, por ejemplo reformateándolos, para que los valores tengan un formato consistente, si no más conveniente. Considere, por ejemplo, este archivo CSV de estudiantes, before.csv , a continuación:
name,house
"Abbott, Hannah",Hufflepuff
"Bell, Katie",Gryffindor
"Bones, Susan",Hufflepuff
"Boot, Terry",Ravenclaw
"Brown, Lavender",Gryffindor
"Bulstrode, Millicent",Slytherin
"Chang, Cho",Ravenclaw
"Clearwater, Penelope",Ravenclaw
"Crabbe, Vincent",Slytherin
"Creevey, Colin",Gryffindor
"Creevey, Dennis",Gryffindor
"Diggory, Cedric",Hufflepuff
"Edgecombe, Marietta",Ravenclaw
"Finch-Fletchley, Justin",Hufflepuff
"Finnigan, Seamus",Gryffindor
"Goldstein, Anthony",Ravenclaw
"Goyle, Gregory",Slytherin
"Granger, Hermione",Gryffindor
"Johnson, Angelina",Gryffindor
"Jordan, Lee",Gryffindor
"Longbottom, Neville",Gryffindor
"Lovegood, Luna",Ravenclaw
"Lupin, Remus",Gryffindor
"Malfoy, Draco",Slytherin
"Malfoy, Scorpius",Slytherin
"Macmillan, Ernie",Hufflepuff
"McGonagall, Minerva",Gryffindor
"Midgen, Eloise",Gryffindor
"McLaggen, Cormac",Gryffindor
"Montague, Graham",Slytherin
"Nott, Theodore",Slytherin
"Parkinson, Pansy",Slytherin
"Patil, Padma",Gryffindor
"Patil, Parvati",Gryffindor
"Potter, Harry",Gryffindor
"Riddle, Tom",Slytherin
"Robins, Demelza",Gryffindor
"Scamander, Newt",Hufflepuff
"Slughorn, Horace",Slytherin
"Smith, Zacharias",Hufflepuff
"Snape, Severus",Slytherin
"Spinnet, Alicia",Gryffindor
"Sprout, Pomona",Hufflepuff
"Thomas, Dean",Gryffindor
"Vane, Romilda",Gryffindor
"Warren, Myrtle",Ravenclaw
"Weasley, Fred",Gryffindor
"Weasley, George",Gryffindor
"Weasley, Ginny",Gryffindor
"Weasley, Percy",Gryffindor
"Weasley, Ron",Gryffindor
"Wood, Oliver",Gryffindor
"Zabini, Blaise",Slytherin
Fuente: en.wikipedia.org/wiki/List_of_Harry_Potter_characters
Aunque cada “fila” del archivo tiene tres valores (apellido, nombre y casa), los dos primeros se combinan en una “columna” (nombre), separada por comillas dobles, con el apellido y el nombre separados por una coma y un espacio. No es ideal si Hogwarts quiere enviar una carta modelo a cada estudiante, mediante combinación de correspondencia , ya que sería extraño comenzar una carta con:
Querido Potter, Harry,
En lugar de con, por ejemplo:
Querido Harry,
En un archivo llamado scourgify.py
, implemente un programa que:
- Espera que el usuario proporcione dos argumentos de línea de comandos:
- el nombre de un archivo CSV existente para leer como entrada, cuyas columnas se supone que son, en orden,
name
yhouse
, y - el nombre de un nuevo CSV para escribir como salida, cuyas columnas deben ser, en orden,
first
,last
yhouse
.
- el nombre de un archivo CSV existente para leer como entrada, cuyas columnas se supone que son, en orden,
- Convierte esa entrada en esa salida, dividiendo cada una
name
en unfirst
nombre ylast
nombre. Suponga que cada estudiante tendrá nombre y apellido.
Si el usuario no proporciona exactamente dos argumentos de línea de comando, o si el primero no se puede leer, el programa debería salir sys.exit
con un mensaje de error.
Consejos
- Tenga en cuenta que
csv
el módulo viene con bastantes métodos, según docs.python.org/3/library/csv.html , entre los cuales se encuentranDictReader
, según docs.python.org/3/library/csv.html#csv.DictReader yDictWriter
, según docs.python.org/3/library/csv.html#csv.DictWriter . - Tenga en cuenta que puede indicarle a
DictWriter
que lo escribafieldnames
en un archivowriteheader
sin argumentos, según docs.python.org/3/library/csv.html#csv.DictWriter.writeheader .
Camiseta CS50
Después de terminar CS50, los estudiantes del campus de Harvard tradicionalmente reciben su propia camiseta "Tomé CS50" . ¿No es necesario comprar uno en línea, pero te gustaría probarlo virtualmente?
En un archivo llamado shirt.py
, implemente un programa que espera exactamente dos argumentos de línea de comando:
- en
sys.argv[1]
, el nombre (o ruta) de un JPEG o PNG para leer (es decir, abrir) como entrada - en
sys.argv[2]
, el nombre (o ruta) de un JPEG o PNG para escribir (es decir, guardar) como salida
Luego, el programa debe superponer shirt.png (que tiene un fondo transparente) en la entrada después de cambiar el tamaño y recortar la entrada para que tenga el mismo tamaño, guardando el resultado como salida.
Abra la entrada con Image.open
, según Pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.open , cambie el tamaño y recorte la entrada con ImageOps.fit
, según Pillow.readthedocs.io/en/stable/reference/ImageOps. html#PIL.ImageOps.fit , usando los valores predeterminados para method
, bleed
y centering
, superponga la camiseta con Image.paste
, según Pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.paste y guarde el resultado. con Image.save
, según almohada.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.save .
En su lugar, el programa debería salir mediante sys.exit
:
- si el usuario no especifica exactamente dos argumentos de línea de comando,
- si los nombres de la entrada y la salida no terminan en
.jpg
,.jpeg
o.png
, sin distinguir entre mayúsculas y minúsculas, - si el nombre de la entrada no tiene la misma extensión que el nombre de la salida, o
- si la entrada especificada no existe.
Suponga que la entrada será una foto de alguien posando de la manera correcta, como estas demostraciones , de modo que, cuando se cambie el tamaño y se recorte, la camiseta parezca encajar perfectamente.
Si desea ejecutar su programa en una foto suya, primero arrastre la foto al explorador de archivos de VS Code, a la misma carpeta que shirt.py
. No es necesario enviar ninguna foto con su código. Pero, si lo deseas, puedes compartir una foto tuya con tu camiseta virtual en cualquiera de las comunidades de CS50 (pero no se espera que lo haga) .
Consejos
Tenga en cuenta que puede determinar la extensión de un archivo con
os.path.splitext
, según docs.python.org/3/library/os.path.html#os.path.splitext .Tenga en cuenta que
open
puederaise
hacerloFileNotFoundError
, según docs.python.org/3/library/exceptions.html#FileNotFoundError .Tenga en cuenta que el
Pillow
paquete viene con bastantes clases y métodos, según pypi.org/project/Pillow . Puede que le resulte útil leer su manual y sus referencias . Puedes instalar el paquete con:pip install Pillow
Puede abrir una imagen (por ejemplo,
shirt.png
) con código como:shirt = Image.open("shirt.png")
Puede obtener el ancho y el alto, respectivamente, de esa imagen con
tuple
un código como:size = shirt.size
Y puedes superponer esa imagen encima de otra (por ejemplo,
photo
) con código comophoto.paste(shirt, shirt)
donde el primero
shirt
representa la imagen que se superpondrá y el segundoshirt
representa una "máscara" que indica qué píxelesphoto
actualizar.Tenga en cuenta que puede abrir una imagen (por ejemplo,
shirt.png
) en VS Code ejecutandocode shirt.png
o haciendo doble clic en su icono en el explorador de archivos de VS Code.