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

CS50 FIGlet练习遇check50超时错误,求排查及代码优化建议

CS50 FIGlet练习题:check50超时问题排查与代码优化

超时问题根源排查

你的代码在check50中出现超时,主要有两个关键问题:

  1. 输入获取时机错误
    你在代码最开始就执行了string = input("Input: "),但此时还未完成命令行参数的合法性校验。当check50测试无效参数的用例时(比如参数数量不对、参数格式错误),程序会先卡住等待用户输入,而check50不会提供输入内容,导致程序一直无法退出,最终触发超时。

  2. 未定义变量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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:45:12