Python-Morsecode-Übersetzer

Aug 18 2020

Ich habe mir in den letzten Wochen Python selbst beigebracht, ich habe ein Interesse an Kryptographie, Codes usw., also dachte ich, ein Morsecode-Übersetzer zu starten wäre ein gutes Projekt. Ich weiß, dass meine Variablennamen unterschiedlich sein können, es ist nicht wirklich verschlüsselt, entschlüsselt usw. Ich suche hauptsächlich nach Ratschlägen, wie ich den Code sauberer machen und wo ich effizienter sein kann.

Ich denke, mein größtes Problem ist, nicht wirklich zu wissen, wie ich mit den Eingaben in einer while-Schleife umgehen soll, wie ich es normalerweise tun würde. Das Problem, das ich hatte, war, dass ich nicht überprüfen konnte, ob die Eingabe 'e' oder 'd' war, so dass es einfach richtig wackelig wurde.

Bereiche, von denen ich weiß, dass ich sie verbessern könnte:

  • Eingabeschleife hinzufügen
  • Das if, elif, sonst für die Aktion
  • Machen Sie 'Sound' zu einem tatsächlichen booleschen Wert
  • Finden Sie die tatsächliche Tonzeit für dit und dah, aber das ist nicht wirklich ein Code-Problem
# Started: 08/17/2020
# Finished: 08/17/2020
# Takes an input message and outputs the message in morse code
# Keys taken from 'https://en.wikipedia.org/wiki/Morse_code'

from playsound import playsound
import time

# Dictionary that holds each letter and it's corresponding value
dict = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.', 'f': '..-.', 'g': '--.', 'h': '....', 'i': '..', 'j': '.---', 'k': '-.-', 'l': '.-..', 'm': '--',
        'n': '-.', 'o': '---', 'p': '.--.', 'q': '--.-', 'r': '.-.', 's': '...', 't': '-', 'u': '..-', 'v': '...-', 'w': '.--', 'x': '-..-', 'y': '-.--', 'z': '--..',
        '1': '.----', '2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....', '7': '--...', '8': '---..', '9': '----.', '0': '-----',
        ' ': '/', '.': '.-.-.-', ',': '.-.-', '?': '..--..', "'": '.----.', '!': '-.-.--', '/': '-..-.', '(': '-.--.', ')': '-.--.-',
        ':': '---...', ';': '-.-.-.', '=': '-...-', '+': '.-.-.', '-': '-....-', '_': '..--.-', '"': '.-..-.', '$': '...-..-', '@': '.--.-.'}

outputMessage = ""               # Holds our output message

# Sounds
sound = 'False'
dit = 'dit.wav'
dah = 'dah.wav'


def Encrypt(message):

    output = ''

    for char in message:
        if char in dict:
            output = output + dict[char]
            output = output + ' '

    return output


def Get_Key(val):
    for key, value in dict.items():
        if val == value:
            return key


def Decrypt(message):

    output = ''

    letters = message.split(' ')

    for letter in letters:
        temp = Get_Key(letter)
        output = output + temp

    return output


def Get_Inputs():
    # Get Inputs
    inputString = input('Enter a message to start.\n')
    action = input('(E)ncrypt or (D)ecrypt?\n')

    # Format Inputs
    message = inputString.lower().strip()
    action = action.lower().strip()

    return message, action


def Play_Sound(message):

    for char in message:
        if char == '.':
            playsound(dit)
        elif char == '-':
            playsound(dah)
        elif char == ' ':
            time.sleep(0.15)
        elif char == '/':
            time.sleep(0.30)


message, action = Get_Inputs()

if action == 'e' or action == 'encrypt':
    outputMessage = Encrypt(message)
elif action == 'd' or action == 'decrypt':
    outputMessage = Decrypt(message)
else:
    print('Error!')

print(outputMessage)

print('')
sound = input('Play sound? (T)rue / (F)alse\n')
if sound.lower().strip() == 't' or sound.lower().strip() == 'true':
    Play_Sound(outputMessage)

Antworten

6 RichardNeumann Aug 18 2020 at 19:25

Allgemeiner Stil

Ihre Übersetzung dictverwendet ein Schlüsselwort und Kleinbuchstaben. Schreiben Sie Konstanten mit Großbuchstaben und geben Sie ihnen aussagekräftige Namen wie MORSE_CODES = {...}.

Nach PEP 8 sollten Funktionen mit benannt werden snake_case. CamelCaseist für Klassen reserviert: outputMessageoutput_message, def Encrypt(...)def encrypt(...)usw.

Performance

Die Verwendung der Get_KeyFunktion ist nicht sehr performant, da sie eine lineare Suche des Diktats durchführt. Kehren Sie das Übersetzungsdiktat einfach einmal um und verwenden Sie es dann:

MORSE_ENCODING = {
    'a': '.-',
    'b': '-...',
    ...
}
MORSE_DECODING = {value: key for key, value in MORSE_ENCODING.items()}

...

        temp = MORSE_DECODING[letter]

Fehler behandeln

Derzeit Encryptüberspringt die Funktion stillschweigend alle nicht übersetzbaren Zeichen. Ziehen Sie ValueError()stattdessen ein, um anzuzeigen, dass eine ungültige Eingabe bereitgestellt wurde:

def encode(message):
    """Encodes a string into morse code."""

    code = ''

    for index, char in enumerate(message):
        try:
            code += MORSE_ENCODING[char.lower()]
        except KeyError:
            raise ValueError(f'Char "{char}" at {index} cannot be encoded.')

        code += ' '

    return code[:-1]  # Remove trailing space.


def decode(morse_code):
    """Decodes morse code."""

    message = ''

    for index, sequence in enumerate(morse_code.split()):
        try:
            message += MORSE_DECODING[sequence]
        except KeyError:
            raise ValueError(f'Cannot decode code "{sequence}" at {index}.')

    return message

Richtigkeit

Ihre EncryptFunktion gibt derzeit immer ein nachfolgendes Leerzeichen zurück. Sie können dies vermeiden, indem Sie zurückkehren output[:-1].

Terminologie

Das Konvertieren von Morsecode in Text hin und her ist im eigentlichen Sinne keine Verschlüsselung. Vielleicht möchten Sie {en,de}cryptmit umformulieren {en,de}code.

Globals

Die Verwendung globaler Variablen wie outputMessagekann böse Nebenwirkungen haben, wenn das Programm als Bibliothek verwendet wird. Der gesamte Code unter der def Play_SoundFunktion sollte in eine def main()Funktion eingehen, über die Sie aufrufen können

if __name__ == '__main__':
    main()

Am unteren Rand des Geräts.