Python Mors Kodu Çevirmeni
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
Genel Stil
Çeviriniz dict
bir 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
. CamelCase
sınıflar için ayrılmıştır: outputMessage
→ output_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 Encrypt
iş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 Encrypt
fonksiyonu ş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}crypt
ile {en,de}code
.
Küresel
Bu gibi global değişkenlerin outputMessage
kullanı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.