如何遍历输入字符串提取字符并调用对应摩尔斯电码函数?
问题解决:根据输入字符调用对应摩尔斯电码播放函数
你遇到的问题是:循环中letter()无法执行,因为letter是字符串类型,而不是函数对象,Python不能直接将字符串当作函数名调用。下面是具体的解决方法:
方法一:用字典映射字符到函数
创建一个字典,将每个小写字母映射到对应的播放函数,循环时从字典中取出函数再执行。同时处理输入的大小写(转小写)和非法字符(避免报错)。
修改后的代码片段:
# 在所有字母函数定义后,添加这个字典 char_func_map = { 'a': a, 'b': b, 'c': c, 'd': d, 'e': e, 'f': f, 'g': g, 'h': h, 'i': i, 'j': j, 'k': k, 'l': l, 'm': m, 'n': n, 'o': o, 'p': p, 'q': q, 'r': r, 's': s, 't': t, 'u': u, 'v': v, 'w': w, 'x': x, 'y': y, 'z': z } translate = input("What should be translated into morse code?") for letter in translate: lower_letter = letter.lower() # 只处理字典中存在的字母 if lower_letter in char_func_map: char_func_map[lower_letter]() med() # 字母之间添加间隔(可选,符合摩尔斯码规范) else: # 处理非字母字符,比如空格可以用long()间隔 if letter == ' ': long()
方法二:重构代码(更简洁高效)
你当前的代码每个字母函数重复逻辑太多,建议用摩尔斯码映射表+通用播放函数重构,大幅减少冗余代码:
import time from time import sleep import winsound as win # 摩尔斯码参数配置 FREQ_SHORT = 1000 DUR_SHORT = 250 FREQ_LONG = 1000 DUR_LONG = 500 # 时间间隔配置(符合摩尔斯码标准) INTER_ELEMENT = 0.1 # 点/划之间的间隔 INTER_CHAR = 0.75 # 字符之间的间隔 INTER_WORD = 1.5 # 单词之间的间隔 def play_short(): win.Beep(FREQ_SHORT, DUR_SHORT) sleep(INTER_ELEMENT) def play_long(): win.Beep(FREQ_LONG, DUR_LONG) sleep(INTER_ELEMENT) # 摩尔斯码映射表 morse_map = { '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': '--..' } def play_morse_char(char): char = char.lower() if char in morse_map: code = morse_map[char] for symbol in code: if symbol == '.': play_short() elif symbol == '-': play_long() sleep(INTER_CHAR - INTER_ELEMENT) # 减去元素间隔,避免重复等待 # 主逻辑 translate = input("What should be translated into morse code?") for char in translate: if char == ' ': sleep(INTER_WORD - INTER_CHAR) # 单词间隔 else: play_morse_char(char)
这种方式只需要维护一个摩尔斯码映射表,不需要为每个字母写单独函数,扩展性和维护性更强。
内容的提问来源于stack exchange,提问作者user25523933
相关产品推荐
相关产品推荐

