Angepasste Trennlinie

Code-Stücke können hier veröffentlicht werden.
Antworten
crazyyzarc
User
Beiträge: 27
Registriert: Freitag 10. Juli 2015, 21:08
Wohnort: PyLand

Samstag 18. April 2020, 14:01

Hallo Zusammen,

ich wollte insbesondere Neulinge (ich ebenso) eine Methode vorstellen mit der man Zeilen beim Konsolendesign sparen kann.
Mich störte es wenn im Code selbst zu viele künstliche Trennzeichen (s. Beispiel 1) sind wie "====" "---" "><<><><>" etc. deshalb habe ich mir eine Funktion zusammengebastelt, die anhand der Länge die optimale Länge der Trennzeichen übernimmt.

Problembeispiel

Code: Alles auswählen

print("==========================")
print("Das Ergebnis")
print("==========================")

Mein Lösungsweg mit Strings

Beispiel mit einem String, der erstmal formatiert und nicht ausgegeben wird:

Code: Alles auswählen

rechnungs_betrag = 13.99
output = ("Hallo, die Rechnung liegt bei " + str(rechnungs_betrag) + " EUR")
dann berechnen wir die Länge des Strings:

Code: Alles auswählen

output_length = len(output)
und dann nehmen wir die Zeichenlänge des Strings und printen jedes mal ein "=" solange die maximale Länge nicht erreicht wurde. Zusätzlich entfernen wir das Escape Zeichen \n um ein Zeilenumbruch zu verhinden. Im else-Zweig der for Schleife fügen wir dann den formatierten output String in die print FUnktion ein

Code: Alles auswählen

for char in range(0, output_length):
    print("=", end="")
else:
    print(output)
Ausgabe:

Code: Alles auswählen

=======================================
Hallo, die Rechnung liegt bei 13,99 EUR
Mit Listen

Ebenso geht das mit Listen:

Code: Alles auswählen

output = ["Menü", "(N)eues Spiel starten", "(L)evel festlegen", "(B)eenden"]
Erstmal wird der längste String in der Liste ermittelt:

Code: Alles auswählen

for char in output:
    if len(char) > max_length:
        max_length = len(char)
und danach entsprechende Trennzeichen passgenau hinzugefügt:

Code: Alles auswählen

for i in range(0, max_length):
    print("=", end="")
else:
    print()
    print(output)
Ausgabe:

Code: Alles auswählen

=====================
Menü
(N)eues Spiel starten
(L)evel festlegen
(B)eenden
Wenn man dann sich hierzu eine eigene Funktion zusammenbastelt kann man langfristig bei Konsolenanwendungen Tipparbeit sparen und die Übersichtlichkeit des Programmiercodes verbessern. =)
Benutzeravatar
kbr
User
Beiträge: 1240
Registriert: Mittwoch 15. Oktober 2008, 09:27

Samstag 18. April 2020, 14:36

Du kannst strings auch multiplizieren:

Code: Alles auswählen

rechnungs_betrag = 13.99
output = f"Hallo, die Rechnung liegt bei {rechnungs_betrag} EUR"
print('=' * len(output), output, sep='\n')

=======================================
Hallo, die Rechnung liegt bei 13.99 EUR

Code: Alles auswählen

output = ["Menü", "(N)eues Spiel starten", "(L)evel festlegen", "(B)eenden"]
print('=' * max(len(item) for item in output))
print('\n'.join(output))

=====================
Menü
(N)eues Spiel starten
(L)evel festlegen
(B)eenden
Benutzeravatar
__blackjack__
User
Beiträge: 8553
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 18. April 2020, 14:54

Bei der Liste kann `map()` sinnvoll eingesetzt werden:

Code: Alles auswählen

In [36]: max(len(item) for item in output)                                      
Out[36]: 21

In [37]: max(map(len, output))                                                  
Out[37]: 21
“Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”
crazyyzarc
User
Beiträge: 27
Registriert: Freitag 10. Juli 2015, 21:08
Wohnort: PyLand

Samstag 18. April 2020, 15:38

kbr hat geschrieben:
Samstag 18. April 2020, 14:36
Du kannst strings auch multiplizieren:

Code: Alles auswählen

rechnungs_betrag = 13.99
output = f"Hallo, die Rechnung liegt bei {rechnungs_betrag} EUR"
print('=' * len(output), output, sep='\n')

=======================================
Hallo, die Rechnung liegt bei 13.99 EUR
Ja gut das geht ja noch erheblich kompakter.. :D ich hab dann wohl viel zu kompliziert gedacht bzw. war mir dieser Weg noch nicht bekannt. Danke für den Tipp
__blackjack__ hat geschrieben:
Samstag 18. April 2020, 14:54
Bei der Liste kann `map()` sinnvoll eingesetzt werden:

Code: Alles auswählen

In [36]: max(len(item) for item in output)                                      
Out[36]: 21

In [37]: max(map(len, output))                                                  
Out[37]: 21
Uii.. dann spare ich mir ja die for-schleife *_* Thanks
Das Thema Maps liegt aber noch bei mir in der Zukunft :)
Antworten