Python Morse Code Translator
ฉันได้สอน Python ตัวเองในช่วงสองสามสัปดาห์ที่ผ่านมาฉันมีความสนใจในการเข้ารหัสรหัสและอื่น ๆ ดังนั้นฉันจึงคิดว่าการเริ่มตัวแปลรหัสมอร์สน่าจะเป็นโครงการที่ดี ฉันรู้ว่าชื่อตัวแปรของฉันอาจแตกต่างกันมันไม่ได้เข้ารหัสถอดรหัส ฯลฯ ส่วนใหญ่ฉันกำลังมองหาคำแนะนำว่าฉันจะทำให้โค้ดสะอาดขึ้นได้อย่างไรและฉันจะมีประสิทธิภาพมากขึ้นได้อย่างไร
ฉันคิดว่าปัญหาที่ใหญ่ที่สุดของฉันคือไม่รู้วิธีจัดการอินพุตใน while loop อย่างที่ฉันมักจะทำ ปัญหาที่ฉันมีคือฉันไม่สามารถตรวจสอบว่าอินพุตเป็น 'e' หรือ 'd' ดังนั้นมันจึงมีความว่องไวจริงๆ
พื้นที่ที่ฉันรู้ว่าฉันควรปรับปรุง:
- เพิ่มลูปอินพุต
- if, elif, else สำหรับการดำเนินการ
- ทำให้ 'เสียง' เป็นค่าบูลีนที่แท้จริง
- ค้นหาเวลาเสียงจริงสำหรับ dit และ dah แต่นั่นไม่ใช่ปัญหารหัส
# 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)
คำตอบ
สไตล์ทั่วไป
การแปลของคุณdict
ใช้คำสำคัญและตัวพิมพ์เล็ก MORSE_CODES = {...}
พิจารณาการเขียนคงมีตัวอักษรบนกรณีและให้พวกเขามีชื่อที่แสดงออกเช่น
ตามPEP 8snake_case
ฟังก์ชั่นควรจะตั้งชื่อโดยใช้ CamelCase
สงวนไว้สำหรับชั้นเรียน: outputMessage
→ output_message
, def Encrypt(...)
→ def encrypt(...)
ฯลฯ
ประสิทธิภาพ
การใช้Get_Key
ฟังก์ชั่นไม่ได้มีประสิทธิภาพมากนักเนื่องจากจะทำการค้นหาเชิงเส้นของ dict เพียงย้อนกลับคำสั่งการแปลหนึ่งครั้งจากนั้นใช้:
MORSE_ENCODING = {
'a': '.-',
'b': '-...',
...
}
MORSE_DECODING = {value: key for key, value in MORSE_ENCODING.items()}
...
temp = MORSE_DECODING[letter]
การจัดการข้อผิดพลาด
ขณะนี้Encrypt
ฟังก์ชันนี้จะข้ามอักขระที่ไม่สามารถแปลได้ทั้งหมดแบบไม่โต้ตอบ พิจารณาโยนValueError()
แทนเพื่อระบุว่ามีการป้อนข้อมูลที่ไม่ถูกต้อง:
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
ความถูกต้อง
Encrypt
ขณะนี้ฟังก์ชันของคุณส่งคืนช่องว่างต่อท้ายเสมอ output[:-1]
คุณสามารถหลีกเลี่ยงว่าด้วยการกลับมา
คำศัพท์
การแปลงจากรหัสมอร์สเป็นข้อความกลับไปกลับมาไม่ได้เป็นการเข้ารหัสในความหมาย คุณอาจต้องการวลีใหม่{en,de}crypt
ด้วย{en,de}code
.
ลูกโลก
การใช้ตัวแปรส่วนกลางเช่นoutputMessage
อาจมีผลข้างเคียงที่น่ารังเกียจเมื่อโปรแกรมถูกใช้เป็นไลบรารี โค้ดทั้งหมดด้านล่างdef Play_Sound
ฟังก์ชันควรอยู่ในdef main()
ฟังก์ชันที่คุณสามารถเรียกใช้ผ่าน
if __name__ == '__main__':
main()
ที่ด้านล่างของตัวเครื่อง