如何在Jupyter Lab中实现从单元格直接获取输入测试Python代码?
在Jupyter Lab中实现类似HackerRank的编程测试(直接从单元格获取输入)
完全可以直接从Jupyter单元格获取测试输入,不用依赖CSV文件,这里给你几种简单实用的实现方式,适配不同的教学场景:
方法1:全局变量+重定向input()
这是最直接的方案,适合单组测试用例的基础教学:
- 教师预设测试输入单元格:
在单独的单元格里定义测试输入的内容,按行存成列表:# 测试输入(教师预设,学生无需修改) test_inputs = ["5", "6"] # 对应两行输入 - 学生代码单元格(带模板):
先加入重定向代码,让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),可以读取该单元格的输出作为输入:
- 教师测试输入单元格:
执行后直接输出输入内容:# 测试输入(教师预设,执行后显示输入内容) print("5") print("6") - 学生代码单元格:
通过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做一个交互式选择器,灵活切换测试用例:
- 教师测试用例配置单元格:
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("基础用例") - 学生代码单元格:
学生直接写正常的输入输出代码即可,切换下拉框就能换测试用例,非常直观:# --- 学生编写代码的区域 --- x = int(input()) y = int(input()) print(x+y)
额外提示
- 如果学生需要手动测试自己的输入,只需在代码单元格里加一行
sys.stdin = sys.__stdin__就能恢复默认的手动输入模式。 - 对于复杂输入(比如空格分隔的多值、多行文本),只要把
test_inputs列表按实际输入的行拆分好就行,逻辑完全通用。
内容的提问来源于stack exchange,提问作者rodrunner
相关产品推荐
相关产品推荐

