Python Mors Kodu Çevirmeni

Aug 18 2020

Son birkaç haftadır kendi kendime Python öğretiyorum, kriptografi, kodlar vb. İle ilgileniyorum, bu yüzden bir Mors kodu çevirmeni başlatmanın iyi bir proje olacağını düşündüm. Değişken isimlerimin farklı olabileceğini biliyorum, bu gerçekten şifreleme, şifre çözme vb. Değildir. Çoğunlukla kodu nasıl daha temiz hale getirebileceğim ve nerede daha verimli olabileceğim konusunda tavsiyeler arıyorum.

Sanırım en büyük sorunum, girdileri bir süre döngüsünde her zaman yaptığım gibi nasıl idare edeceğimi bilmemek. Karşılaştığım sorun, girdinin 'e' mi yoksa 'd' mi olduğunu kontrol edemememdi, bu yüzden gerçekten riskli hale geldi.

İyileştirebileceğimi bildiğim alanlar:

  • Giriş döngüsü ekleyin
  • Eylem için if, elif, else
  • 'Sesi' gerçek bir boole değeri yapın
  • Dit ve dah için gerçek ses zamanını bulun ama bu gerçekten bir kod sorunu değil
# 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)

Yanıtlar

6 RichardNeumann Aug 18 2020 at 19:25

Genel Stil

Çeviriniz dictbir anahtar kelime ve küçük harfler kullanır. Sabitleri büyük harflerle yazmayı ve onlara gibi anlamlı isimler vermeyi düşünün MORSE_CODES = {...}.

PEP 8'e göre , işlevler kullanılarak adlandırılmalıdır snake_case. CamelCasesınıflar için ayrılmıştır: outputMessageoutput_message, def Encrypt(...)def encrypt(...), vb.

Verim

Get_Keyİşlevi kullanmak, dikte için doğrusal bir arama gerçekleştirdiğinden çok başarılı değildir. Çeviri diktesini bir kez ters çevirin ve ardından kullanın:

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

...

        temp = MORSE_DECODING[letter]

Hataları işleme

Şu anda Encryptişlev, çevrilemeyen tüm karakterleri sessizce atlamaktadır. ValueError()Geçersiz girişin sağlandığını belirtmek için bunun yerine bir atmayı düşünün :

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

Doğruluk

Sizin Encryptfonksiyonu şu anda her zaman sonunda bir boşluk döndürür. Geri dönerek bundan kurtulabilirsiniz output[:-1].

Terminoloji

Mors alfabesinden metne ileri geri dönüşüm, kendi anlamında gerçekten bir şifreleme değildir. Sen ifadeleri isteyebilirsiniz {en,de}cryptile {en,de}code.

Küresel

Bu gibi global değişkenlerin outputMessagekullanılması, program bir kütüphane olarak kullanıldığında kötü yan etkilere neden olabilir. def Play_Soundİşlevin altındaki tüm kod, def main()aracılığıyla çağırabileceğiniz bir işleve gitmelidir.

if __name__ == '__main__':
    main()

Ünitenin altında.