You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历输入字符串提取字符并调用对应摩尔斯电码函数?

问题解决:根据输入字符调用对应摩尔斯电码播放函数

你遇到的问题是:循环中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:40:12