Letters in morse

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
1of7470000000
User
Beiträge: 10
Registriert: Donnerstag 8. Februar 2018, 22:04

Freitag 9. Februar 2018, 00:38

Code: Alles auswählen

dict1 ={"a": " o - ", "b": " - o o o ", "c": " - o - o ", "d": " - o o ", "e": " o ", "f": " o o - o ", "g": " - - o ", "h": " o o o o ", "i": " o o ", "j": " o - - ", "k": " - o - ", "l": " o - o o ", "m": " - - ", "n": " - o ", "o": " - - - ", "p": " o - - o ", "q": " - - o ", "r": " o - o ", "s": " o o o ", "t": " - ", "u": " o o - ", "v": " o o - ", "w": " - - o ", "x": " - o o - ", "y": " - o - - ", "z": " - - o o ", " ": " "}

def trans(x):
    print(dict1[x])
    
input1= input()
for i in input1:
    trans(i)


__deets__
User
Beiträge: 3289
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 11. Februar 2018, 21:26

Die Benennung von “dict1” ist ungünstig. Warum eine 1? Warum nicht 100? Und WAS das macht erkennt man auch nicht. MORSE_TABLE oder so etwas währe günstiger.

Und auch wenn es grundsätzlich löblich ist Funktionen zu definieren - trans ist keine gute. Sie macht gleichzeitig zu wenig (nur einen Buchstaben übersetzen) und zu viel (das Ergebnis ausgeben). Bessere wäre sie würde eine komplette Übersetzung anfertigen, aber das Ergebnis als Liste zurück geben, mit der man dann verfahren kann wie man will - zB ausgeben, über ein Netzwerk schicken, in eine Datei schreiben.
1of7470000000
User
Beiträge: 10
Registriert: Donnerstag 8. Februar 2018, 22:04

Dienstag 13. Februar 2018, 14:23

Hallo,

danke für dein Feedback. Ich habe die Funktion überarbeitet. Du hattest völlig Recht, die Funktion tut zu wenig, außerdem habe ich es als Herausforderung gesehen, das „nochmal anders“, zusammengefasster hinzubekommen.
Ich will abermals nicht herum diskutieren, deine Einlassung war 100% richtig, nur erklären weshalb ich sie überhaupt damals so gemacht hatte: Das „intime“ beim programmieren ist, dass man fast zusehen kann, wie jemand denkt. Mein Gedanke war: Tue dies und tue es für jedes Zeichen, welches der Benutzer eingibt.

Auch für den zweiten Teil deiner Aussage gebe ich dir Recht. Return als Ausgabe ist auch für die Verarbeitbarkeit besser als print. Ich habe am Ende zwar ein print- Statement, aber ich habe im Kommentar angegeben, dass dies optional ist (lediglich Testzwecke).

Ich habe auch den Tipp aus einem anderen Thread eingebaut. Die Funktion forciert nun Kleinschreibung. Ich habe mich bemüht, alle Objekte so klar wie möglich zu bezeichnen („Dont repeat this..“ passiert mir nicht wieder) und habe möglichst klare Kommentare eingefügt, damit der Programmcode nach bestem Ermessen so klar verständlich ist wie es mir möglich ist.

Code: Alles auswählen


# the morse table 
morse_table ={"a": " o - ", "b": " - o o o ", "c": " - o - o ", "d": " - o o ", "e": " o ", "f": " o o - o ", "g": " - - o ", "h": " o o o o ", "i": " o o ", "j": " o - - ", "k": " - o - ", "l": " o - o o ", "m": " - - ", "n": " - o ", "o": " - - - ", "p": " o - - o ", "q": " - - o ", "r": " o - o ", "s": " o o o ", "t": " - ", "u": " o o - ", "v": " o o - ", "w": " - - o ", "x": " - o o - ", "y": " - o - - ", "z": " - - o o ", " ": " "}

# Ask what to translate
input= input()
morse_result = [ ]


def translation():
"""
force lowercase, translate sign by sign, append to the list & return the list
"""
    for i in input.lower():
        morse_result.append\
        (morse_table[i])
    return morse_result


# call the function                
translation()

"""print is NOT requiered! You could write the list in a file and send via email because the function return a processable result. I do this only for testing
"""
print(morse_result)



__deets__
User
Beiträge: 3289
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 13. Februar 2018, 14:29

Na nun hast du es deutlich verschlimmbessert. Denn translation ist nun nicht mehr nutzbar zB wenn man Daten aus einer Datei vermorsen will. Denn nun regelt sie auch noch gleich den Input. Und der, sowie morse_result, ist eine globale Variable!

Damit ist die Funktion im Grunde wertlos, denn sie funktioniert genau einmal. Da kannst du den Code auch einfach gleich auf Modulebene packen, und gut ist.

Zusaetzlich gibt sie auch noch das Ergebnis zurueck, suggeriert also, sie wuerde Daten erzeugen, die in Wirklichkeit global sind. Damit verwirrst du den Benutzer vollends.
__deets__
User
Beiträge: 3289
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 13. Februar 2018, 14:29

Und noch ein Nachtrag: Kommentare schreibt man mit # vorn dran, nicht einfach als String-Literale in den Code. Das ist sonst auch schwerer zu entziffern.
Sirius3
User
Beiträge: 8255
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 13. Februar 2018, 14:38

@1of7470000000: wie schon im anderen Thread bemerkt, ist es schlecht Variablennamen zu wählen, die eingebaute Funktionen verdecken, hier wieder `input`. `translation` benutzt die globale Variable `morse_result`, das macht das Programm sehr fehleranfällig und schwer zu verstehen. \ als Zeilenfortführungszeichen sollte man so weit wie möglich vermeiden, besser man nutzt Klammern dafür, hier ist die Zeile so kurz, dass es sowieso nur die Leserbarkeit zerstört. Der Doc-String von `translation` ist falsch eingerückt. `i` ist ein schlechter Name für ein Zeichen. Konstanten wie `morse_table` schreibt man komplett groß: MORSE_TABLE.
Antworten