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

如何在Jupyter Lab中实现从单元格直接获取输入测试Python代码?

在Jupyter Lab中实现类似HackerRank的编程测试(直接从单元格获取输入)

完全可以直接从Jupyter单元格获取测试输入,不用依赖CSV文件,这里给你几种简单实用的实现方式,适配不同的教学场景:

方法1:全局变量+重定向input()

这是最直接的方案,适合单组测试用例的基础教学:

  1. 教师预设测试输入单元格:
    在单独的单元格里定义测试输入的内容,按行存成列表:
    # 测试输入(教师预设,学生无需修改)
    test_inputs = ["5", "6"]  # 对应两行输入
    
  2. 学生代码单元格(带模板):
    先加入重定向代码,让input()自动读取预设的测试输入,学生只需要写核心逻辑:
    import sys
    from io import StringIO
    
    # 自动读取预设的测试输入
    sys.stdin = StringIO('\n'.join(test_inputs))
    
    # --- 学生编写代码的区域 ---
    x = int(input())
    y = int(input())
    print(x+y)
    
    执行后就能直接得到测试结果,和你预设的11对比即可。

方法2:读取其他单元格的输出内容

如果希望测试输入单元格直接展示原始输入格式(像你示例里那样只显示5和6),可以读取该单元格的输出作为输入:

  1. 教师测试输入单元格:
    执行后直接输出输入内容:
    # 测试输入(教师预设,执行后显示输入内容)
    print("5")
    print("6")
    
  2. 学生代码单元格:
    通过Jupyter内置接口获取指定单元格的输出,再重定向给input():
    from io import StringIO
    import sys
    
    # 获取测试输入单元格的输出(假设该单元格的历史索引是1,可根据实际调整)
    ip = get_ipython()
    test_input_content = ip.history_manager.output_hist[1]
    
    # 重定向输入
    sys.stdin = StringIO(test_input_content)
    
    # --- 学生编写代码的区域 ---
    x = int(input())
    y = int(input())
    print(x+y)
    
    注意:单元格索引需要和实际位置对应,你可以提前固定测试输入单元格的位置,避免学生误改。

方法3:多测试用例切换(适合进阶教学)

如果需要让学生测试多组输入,可以用ipywidgets做一个交互式选择器,灵活切换测试用例:

  1. 教师测试用例配置单元格:
    import ipywidgets as widgets
    from io import StringIO
    import sys
    
    # 定义多组测试用例
    test_cases = {
        "基础用例": ["5", "6"],
        "大数用例": ["100", "200"],
        "负数用例": ["-3", "7"]
    }
    
    # 创建下拉选择器
    case_picker = widgets.Dropdown(
        options=test_cases.keys(),
        value="基础用例",
        description="选择测试用例:"
    )
    display(case_picker)
    
    # 切换测试用例的函数
    def switch_test_case(case_name):
        sys.stdin = StringIO('\n'.join(test_cases[case_name]))
    
    # 绑定选择事件
    case_picker.observe(lambda change: switch_test_case(change['new']), names='value')
    
    # 初始化测试用例
    switch_test_case("基础用例")
    
  2. 学生代码单元格:
    学生直接写正常的输入输出代码即可,切换下拉框就能换测试用例,非常直观:
    # --- 学生编写代码的区域 ---
    x = int(input())
    y = int(input())
    print(x+y)
    

额外提示

  • 如果学生需要手动测试自己的输入,只需在代码单元格里加一行sys.stdin = sys.__stdin__就能恢复默认的手动输入模式。
  • 对于复杂输入(比如空格分隔的多值、多行文本),只要把test_inputs列表按实际输入的行拆分好就行,逻辑完全通用。

内容的提问来源于stack exchange,提问作者rodrunner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:46:39