Trình dịch mã Python Morse
Tôi đã tự học Python trong vài tuần qua, tôi quan tâm đến mật mã, mật mã, v.v. vì vậy, tôi nghĩ rằng bắt đầu một trình dịch mã Morse sẽ là một dự án tốt. Tôi biết tên biến của tôi có thể khác, nó không thực sự mã hóa, giải mã, v.v. Tôi chủ yếu tìm kiếm lời khuyên về cách tôi có thể làm cho mã sạch hơn và nơi tôi có thể hiệu quả hơn.
Tôi nghĩ vấn đề lớn nhất của tôi là không thực sự biết cách xử lý các đầu vào trong vòng lặp while như tôi thường làm. Vấn đề tôi gặp phải là tôi không thể kiểm tra xem đầu vào là 'e' hay 'd' vì vậy nó thực sự trở nên khó hiểu.
Những lĩnh vực tôi biết tôi có thể cải thiện:
- Thêm vòng lặp đầu vào
- If, elif, else cho hành động
- Đặt 'sound' thành một giá trị boolean thực tế
- Tìm thời gian âm thanh thực tế cho dit và dah nhưng đó không thực sự là vấn đề mã
# 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)
Trả lời
Phong cách chung
Bản dịch của bạn dictsử dụng một từ khóa và các chữ cái thường. Cân nhắc viết các hằng số với các chữ cái viết hoa và đặt cho chúng những cái tên biểu cảm như MORSE_CODES = {...}.
Theo PEP 8 , các hàm nên được đặt tên bằng cách sử dụng snake_case. CamelCaseđược dành riêng cho các lớp: outputMessage→ output_message, def Encrypt(...)→ def encrypt(...), v.v.
Hiệu suất
Việc sử dụng Get_Keyhàm này không hiệu quả lắm, vì nó thực hiện tìm kiếm tuyến tính của dict. Chỉ cần đảo ngược bản dịch chính tả một lần và sau đó sử dụng nó:
MORSE_ENCODING = {
'a': '.-',
'b': '-...',
...
}
MORSE_DECODING = {value: key for key, value in MORSE_ENCODING.items()}
...
temp = MORSE_DECODING[letter]
Xử lý lỗi
Hiện tại, Encrypthàm sẽ bỏ qua tất cả các ký tự không thể dịch được. Hãy xem xét Ném a ValueError()để chỉ ra rằng đầu vào không hợp lệ đã được cung cấp:
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
Tính đúng đắn
EncryptHàm của bạn hiện luôn trả về một khoảng trống ở cuối. Bạn có thể tránh điều đó bằng cách quay lại output[:-1].
Thuật ngữ
Chuyển đổi từ mã morse sang văn bản qua lại không thực sự là một mã hóa theo nghĩa của nó. Bạn có thể muốn nói lại {en,de}cryptvới {en,de}code.
Globals
Việc sử dụng các biến toàn cục như outputMessagecó thể có những tác dụng phụ khó chịu khi chương trình được sử dụng như một thư viện. Tất cả mã bên dưới def Play_Soundhàm sẽ chuyển thành một def main()hàm mà bạn có thể gọi qua
if __name__ == '__main__':
main()
Ở dưới cùng của đơn vị.