首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >挑战: MORSE_CODE.PY

挑战: MORSE_CODE.PY
EN

Code Review用户
提问于 2019-08-28 16:29:05
回答 2查看 798关注 0票数 3

把单词转换成莫尔斯码,反之亦然,使用字典,仅此而已。

代码语言:javascript
复制
morse_code = {'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': '-----', ' ': '   '}


def convert_to_morse_code(word):
    string = ''

    for letternum in word:
        if letternum.isalnum():
            string += f'{morse_code[letternum.upper()]} '
        else:
            string += '  '

    return string


def convert_to_word(word):
    string = ''

    if '   ' in word:
        word = word.replace('   ', '</<')
    if ' ' in word:
        word = word.replace(' ', '<')
    for code in word:
        if code == '/':
            word = word.replace(code, '   ')

    word = word.split('<')

    for code in word:
        for key in morse_code.keys():
            if morse_code[key] == code:
                string += key

    return string


print(convert_to_morse_code('HI MICHAEL'))
print(convert_to_word('.... ..   -- .. -.-. .... .- . .-..'))
EN

回答 2

Code Review用户

发布于 2019-08-28 17:40:29

这个问题可以从某种背景中受益。您不需要回答以下每一个问题,但这对评审人员是有帮助的。

  1. 你为什么要写莫尔斯码转换器?
  2. 这是会被其他人使用,还是一个个人项目?这是家庭作业问题吗?从这一点,我们可以判断审查是否应该集中于查找安全漏洞,或者仅仅是恼人的bug。
  3. 输入是什么样子的?我们可以假设没有人会用没有点号、破折号或空格的字母来调用convert_to_word吗?
代码语言:javascript
复制
def convert_to_morse_code(word):
    ...

def convert_to_word(word):
    ...

这看起来有点滑稽,因为他们都用了一个“词”,但两者都没有。一个是包含完整句子的字符串,另一个是包含摩尔斯码的字符串。我建议为这些函数添加一个docstring,它简要地解释了预期的输入。

代码语言:javascript
复制
if letternum.isalnum():
    string += f'{morse_code[letternum.upper()]} '
else:
    string += '  '

如果有人加入了一些国际莫尔斯码符号,比如"?“,会发生什么?还是字典里的"+“?这段代码将忽略这些。我认为字典应该是真理的源泉,而不是伊莎勒姆。

代码语言:javascript
复制
if letternum.upper() in morse_code:
    string += morse_code[letternum.upper()] + ' '
else:
    string += '  '

上述可能性表明生菜不再是一个合适的名称。让它将名称更新为c或char (字符的缩写),这就是它的本质。我在这里提议的另一个改变是使用字典方法.get,因为它有一个方便的参数‘默认值’。如果我们将默认值设置为‘’(因为当字符不是一个符号时,我们知道如何用morse代码编写),这就取代了else分支。

代码语言:javascript
复制
for char in word:
    string += morse_code.get(char, ' ') + ' '

我认为值得注意的是,这个函数的docstring中跳过了未识别的字符,这是负责的行。

代码语言:javascript
复制
for code in word:
    if code == '/':
        word = word.replace(code, '   ')

一般来说,修改正在循环的东西是个坏主意。它会导致很难发现错误。另一件要注意的事情是,第一次遇到'/‘时,所有的事件都会被替换。这不需要在循环中。

代码语言:javascript
复制
    for key in morse_code.keys():
        if morse_code[key] == code:
            string += key

这个循环所做的工作比所需的要多一些。每次在字典中添加一个新的符号时,它都会变得越来越慢。实际上,性能损失并不明显,但如果您认为解决方案听起来更好,可以尝试实现它。

解决方案是构建一个与morse_code相反的新映射,其中所有的键都变成值,所有的值都变成键。

代码语言:javascript
复制
morse_code = {...}
code_to_char = {code: char for char, code in morse_code.items()}
...

    if code in code_to_char:
        string += code_to_char[code]

有一些小问题,你需要决定答案。

  1. convert_to_word(convert_to_morse_code("Hello, world!"))输出'HELLO WORLD '。这样可以吗?输出应该与输入更紧密地匹配吗?为什么有后面的空间?
  2. convert_to_morse_code("HI LOW")输出'.... .. .-.. --- .-- '。存在一些变化,例如使用斜杠表示空格('.... .. / .-.. --- .--')或七个点(.... .. ....... .-.. --- .--)。您的代码可以将其作为可选功能吗?
  3. convert_to_word在一些奇怪的输入上工作,而对其他输入则不起作用。但是它永远不会告诉用户什么时候出了问题。我更希望convert_to_word('--- -, .')在某种程度上失败,而不是返回'OE'
票数 3
EN

Code Review用户

发布于 2019-08-28 21:09:01

代码语言:javascript
复制
if __name__ == '__main__':

使用此保护程序可以在不运行代码的情况下从此脚本导入。

代码语言:javascript
复制
if __name__ == '__main__':
    print(convert_to_morse_code('HI MICHAEL'))
    print(convert_to_word('.... ..   -- .. -.-. .... .- . .-..'))

风格

请查看正式的Python样式指南PEP0008 https://www.python.org/dev/peps/pep-0008/,下面是一些评论:

  • Docstrings: Python文档字符串(或docstring)提供了一种将文档与Python模块、函数、类和方法相关联的方便方法。对象的docstring是通过将字符串常量作为对象定义中的第一个语句来定义的。以下列方式使用文档字符串来指示您的函数: def convert_to_morse(文本):“将文本转换为Morse代码”。“# code在这里使用def convert_morse_to_word(morse_code):”将Morse代码转换为字母数字单词“”# code在这里。
  • 空白行使用空行(脚本中空白行太多)字串=‘if’在word中: word = word.replace(‘’,'

  • f-字符串提供了一种在字符串文本中嵌入表达式的方法,使用最小语法,并且不应该以这种方式使用:字符串+= f'{morse_codeletternum.upper()}‘可以编写: string += morse_codeletternum.upper()。
  • isalnum()如果您想要包含标点符号和空格,那么isalnum()是个坏主意,Morse代码不排除标点符号。
  • 字符串+=这是低效的,因为字符串不能在适当的位置更改,所以每次添加到字符串时,都会创建一个新的字符串。一个更好的方法是使用列表理解并加入结果。我们必须根据下列国际莫尔斯码重建字典:

代码看起来是:

代码语言:javascript
复制
def get_translation(translate_to):
    """
    Return a dictionary from to (Morse code-text)
    assuming translate_to a string:
    m for translation to Morse
    t for translation to text.
    """
    morse_code = {
        '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': '-----', '!': '-·-·--',
        '.': '.-.-.-', ',': '--..--', '?': '..--..', ':': '---...', "\"": '.-..-.',
        '-': '-....-', '/': '-..-.', '(': '-.--.', ')': '-.--.-', ' ': '\t', '\n': '\t', '_': '··--·-'
    }
    morse_to_letter = {code: letter for letter, code in morse_code.items()}
    if translate_to == 'm':
        return morse_code
    if translate_to == 't':
        return morse_to_letter
    else:
        raise ValueError(f'Invalid input{translate_to} expected m or t')


def convert_to_morse_code(text):
    """Translate text to Morse code."""
    morse_code = get_translation('m')
    return ' '.join([morse_code[letter] for letter in text.lower()])


def convert_morse_code_to_text(morse_code):
    """Translate from Morse code to text."""
    morse_to_letter = get_translation('t')
    text = []
    words = morse_code.split('\t')
    for word in words:
        letters = word.split()
        to_text = [morse_to_letter[letter] for letter in letters]
        text.append(''.join(to_text))
    return ' '.join(text)


if __name__ == '__main__':
    print(convert_to_morse_code('Hello Michael! How are you doing today?'))
    print(convert_morse_code_to_text('·· ·----· --   ..-. ·· -· .    - ···· ·- -· -.- ... .-.-.-'))
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/227021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档