CS50 FIGlet练习遇check50超时错误,求排查及代码优化建议
CS50 FIGlet练习题:check50超时问题排查与代码优化
超时问题根源排查
你的代码在check50中出现超时,主要有两个关键问题:
输入获取时机错误
你在代码最开始就执行了string = input("Input: "),但此时还未完成命令行参数的合法性校验。当check50测试无效参数的用例时(比如参数数量不对、参数格式错误),程序会先卡住等待用户输入,而check50不会提供输入内容,导致程序一直无法退出,最终触发超时。未定义变量
font_list
当不带命令行参数运行时,代码尝试调用random.choice(font_list),但font_list从未被定义或赋值,会触发NameError异常。本地测试可能没覆盖这个分支所以没发现,但check50测试该分支时,未捕获的异常会导致程序异常终止,也可能引发超时。
修正后的代码
from pyfiglet import Figlet from sys import argv, exit import random figlet = Figlet() # 先校验参数合法性 if len(argv) == 1: # 随机字体分支 font = random.choice(figlet.getFonts()) elif len(argv) == 3 and (argv[1] == "-f" or argv[1] == "--font"): # 指定字体分支 if argv[2] not in figlet.getFonts(): exit("Invalid usage") font = argv[2] else: # 无效参数直接退出 exit("Invalid usage") # 参数合法后再获取输入 input_text = input("Input: ") # 设置字体并输出 figlet.setFont(font=font) print(f"Output: {figlet.renderText(input_text)}")
代码优化建议(针对新手)
- 合并系统模块导入:直接用
from sys import argv, exit,避免重复导入sys模块,代码更简洁。 - 提前退出减少嵌套:先处理参数不合法的情况直接退出,剩余逻辑都是合法分支,减少if-elif-else的嵌套层级,可读性更高。
- 提取重复逻辑:将设置字体和打印输出的代码统一放在最后,避免在两个分支中重复写相同的逻辑。
- 变量命名更清晰:用
input_text代替string,明确变量用途;用font单独存储字体名称,逻辑更直观。 - 避免重复调用方法:如果需要多次使用字体列表,可以提前赋值给变量,比如
fonts = figlet.getFonts(),减少重复调用figlet.getFonts()的开销。
内容的提问来源于stack exchange,提问作者Umbreon99
相关产品推荐
相关产品推荐

