如何用循环替代多if语句优化树莓派Python3摩尔斯电码程序?
用循环+字典替代多if语句,优化树莓派摩尔斯电码程序
兄弟,我太懂你现在的烦恼了——写一堆if语句不仅累得慌,还只能处理几个固定字符,完全没法支持任意输入!其实解决思路超简单,用字典映射加循环就能彻底干掉那些繁琐的if判断,让你的程序能播放任意单词甚至句子的摩尔斯码。
核心思路
说白了就是把每个字母和对应的摩尔斯码(点/划序列)提前存到字典里,然后通过循环遍历用户输入的每个字符,再遍历该字符对应的摩尔斯码符号,逐个控制LED亮灭。这样不管用户输入啥,只要在字典里有对应关系,程序就能自动处理,再也不用写N多if了。
优化后的完整代码
import RPi.GPIO as GPIO from time import sleep LED_GPIO = 4 print("Getting ready...") GPIO.setmode(GPIO.BCM) GPIO.setup(LED_GPIO, GPIO.OUT) def lighton(timeon): print("Light On - ", timeon) GPIO.output(LED_GPIO, True) sleep(timeon) GPIO.output(LED_GPIO, False) sleep(timeoff) # 符号之间的短间隔 # 摩尔斯码映射字典,覆盖所有英文字母和空格(空格用来区分单词) 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': '--..', ' ': '/' } dashtime = 0.5 # 划的时长 dottime = 0.25 # 点的时长 timeoff = 0.1 # 符号之间的间隔时长 while True: user_input = input("Enter text or * to quit: ").lower() # 统一转小写,兼容大小写输入 if user_input == "*": break # 循环处理输入的每个字符 for char in user_input: if char in morse_code: code_sequence = morse_code[char] # 循环处理当前字符的每个摩尔斯码符号 for symbol in code_sequence: if symbol == '.': lighton(dottime) elif symbol == '-': lighton(dashtime) elif symbol == '/': # 单词之间的长间隔,这里设为3倍点时长(减去已有的timeoff) sleep(dashtime * 2) else: print(f"Character '{char}' not recognized - skipping it") GPIO.cleanup() print("Bye Bye")
关键改进点解析
- 字典替代if判断:把每个字符和摩尔斯码绑定,想扩展支持新字符(比如数字),直接在字典里加键值对就行,不用改逻辑代码。
- 双层循环处理输入:外层循环遍历用户输入的每个字符,内层循环处理该字符的摩尔斯码符号,自动完成所有亮灭操作。
- 兼容大小写输入:用
.lower()把用户输入转成小写,不管用户输入大写还是小写字母都能正常识别。 - 友好的错误处理:遇到不支持的字符,会提示并跳过,不会直接崩溃程序。
内容的提问来源于stack exchange,提问作者spicycowpie
相关产品推荐
相关产品推荐

