摩尔斯电码解码python功能

时间:2016-07-25 11:45:24

标签: python python-2.7 python-3.x

我尝试创建一个函数,该函数将更多代码作为字符串格式的输入,并将消息解码为字符串。

我已经确定我需要将字符串分割成有空格以确定莫尔斯中的每个字符。和一个循环,如果在字典键中匹配则返回一个值。我是一个初学者,在某个地方真的出错了。提前致谢。

code_dict =  {'.-...': '&', '--..--': ',', '....-': '4', '.....': '5',
     '...---...': 'SOS', '-...': 'B', '-..-': 'X', '.-.': 'R',
     '.--': 'W', '..---': '2', '.-': 'A', '..': 'I', '..-.': 'F',
     '.': 'E', '.-..': 'L', '...': 'S', '..-': 'U', '..--..': '?',
     '.----': '1', '-.-': 'K', '-..': 'D', '-....': '6', '-...-': '=',
     '---': 'O', '.--.': 'P', '.-.-.-': '.', '--': 'M', '-.': 'N',
     '....': 'H', '.----.': "'", '...-': 'V', '--...': '7', '-.-.-.': ';',
     '-....-': '-', '..--.-': '_', '-.--.-': ')', '-.-.--': '!', '--.': 'G',
     '--.-': 'Q', '--..': 'Z', '-..-.': '/', '.-.-.': '+', '-.-.': 'C', '---...': ':',
     '-.--': 'Y', '-': 'T', '.--.-.': '@', '...-..-': '$', '.---': 'J', '-----': '0',
     '----.': '9', '.-..-.': '"', '-.--.': '(', '---..': '8', '...--': '3'
     }

def decodeMorse(morseCode):
    for item in morseCode.split(' '):
        return code_dict.get(item)

我的问题是它只解码在莫尔斯输入的字符串的第一个字符

1 个答案:

答案 0 :(得分:3)

return something立即结束该功能。您在第一个字符后停止处理输入。

在其他语言中,您可以创建包含结果的列表(数组),然后返回:

def decodeMorse(morseCode):
    results = []
    for item in morseCode.split(' '):
        results.append(code_dict.get(item))
    return results

或者,正如@Bakuriu所说:

def decodeMorse(morseCode):
    for item in morseCode.split(' '):
        return [code_dict.get(item) for item in morseCode.split(' ')]

这种方法有一个简单的缺陷 - 它会立即解码整个字符串,即使你只需要前几个字符。

我们可以在Python中做得更好。

使用yield代替return

def decodeMorse(morseCode):
    for item in morseCode.split(' '):
        yield code_dict.get(item)

现在,函数不是一次返回整个列表,而是一次返回yield个字符的生成器。如果您不需要整个翻译,它可能会更快。它还将使用更少的内存(您不需要构造并保留所有字符的内存列表)。

如果需要,您可以将生成器转换为列表(list(decodeMorse('... --- ...')))或字符串(''.join(decodeMorse('... --- ...')))。您也可以像重复序列一样迭代它:

>>> decoded = decodeMorse('... --- ...')
>>> for char in decoded:
...     print(char)
...
S
O
S
>>>

...除外,你只能做一次:

>>> for char in decoded:
...     print(char)
...
>>>

...因为发电机是一次性的。

如果您需要再次迭代它,将其存储在列表中,或者再次调用decodeMorse来创建另一个生成器。