1、项目整体介绍

本平台是一个基于 Streamlit 构建的互动式教学实验系统,专为配合《Python大数据分析与挖掘实战(微课版)》教材而设计。其核心目标是降低初学者学习数据科学的门槛,通过“所见即所得”的方式,让学习者无需配置复杂开发环境,即可在浏览器中直接编写、运行和调试 Python 代码,并实时查看输出结果、图表可视化及代码解析。

平台支持三种语言界面切换(简体中文、英文、壮语),充分体现了对多语言用户群体的包容性,尤其在民族地区高校教学中具有独特优势。整个界面采用现代化 UI 设计,融合了动态加载动画、呼吸灯效果、渐变标题栏等视觉元素,提升交互体验的同时也增强了学习的沉浸感。

无论是课堂教学演示、学生课后练习,还是自学探索,该平台都能提供一体化、零配置、高反馈的学习环境,真正实现“边学边练、即时验证”。

2、项目技术栈

平台完全使用 Python 3.8+ 开发,无需任何前端框架(如 React、Vue),所有界面逻辑均由 Streamlit 驱动,极大简化了开发与部署流程。主要依赖如下:

  1. Streamlit:用于快速构建交互式 Web 应用,自动处理状态管理、组件渲染与用户输入。
  2. Pandas + NumPy:作为数据处理的核心库,支持结构化数据读取、清洗、转换与统计分析。
  3. Matplotlib:用于生成静态、动态或交互式图表,所有绘图操作均可被平台自动捕获并展示。
  4. re(正则表达式):用于代码静态分析,识别关键语法结构以生成教学解释。
  5. io.StringIO + sys.stdout:实现标准输出重定向,捕获 print() 等控制台输出。
  6. types.ModuleType:创建隔离的执行上下文,确保每次代码运行互不干扰,防止变量污染。

3、项目文件结构

项目根目录下需要按照教材章节创建文件夹,每个章节文件夹内放入对应的Python实验文件。具体结构如下:

项目根目录/
├── app.py # 主程序文件
├── 第1章 Python基础知识/
├── 第2章 Numpy/
├── 第3章 Pandas/
├── 第4章 Matplotlib/
├── 第5章 数据预处理与特征工程/
├── 第6章 机器学习与实现/
├── 第7章 集成学习与实现/
└── 第8章 深度学习与实现/
程序启动时会自动扫描这些文件夹,识别所有的.py文件作为实验项目,并检测是否存在“数据”子文件夹用于数据文件路径配置。

4、核心模块详解

4.1多语言系统

平台内置完整的三语支持体系,覆盖所有用户可见文本,包括按钮、提示、章节标题、代码解释等约 150 个词条。

LANGUAGES = {
    "zh": {"name": "简体中文", "flag": "🇨🇳", "font": "Noto Sans SC"},
    "en": {"name": "English",      "flag": "🇺🇸", "font": "Arial"},
    "za": {"name": "Vahcuengh (壮语)", "flag": "🌾", "font": "Noto Sans"}
}

TRANSLATIONS = {
    "zh": { "run_code": "运行代码", "reset_code": "重置为原始代码" },
    "en": { "run_code": "Run Code", "reset_code": "Reset to Original" },
    "za": { "run_code": "Guh Maqcoenz", "reset_code": "Dingz Gijcoj Lai" }
}

动态参数替换:支持如 get_text(“line_num”, num=5) → “第5行”(中文)或 “Line 5”(英文)。
文化包容性:壮语(Vahcuengh)支持是国内教育类平台中的创新实践,有助于推动少数民族地区 STEM 教育普及。
实时切换:语言选择后立即刷新界面,无需刷新页面或重启应用。

4.2 动态文件扫描系统

平台启动时自动遍历预设章节目录,按教材顺序加载实验文件,确保教学一致性。

def scan_chapter_files():
    chapter_order = [
        "第1章 Python基础知识",
        "第2章 Numpy",
        ...
    ]
    chapters = []
    for dir_name in chapter_order:
        path = os.path.join(base_dir, dir_name)
        if os.path.exists(path):
            py_files = sorted([f for f in os.listdir(path) if f.endswith('.py')])
            data_dir = os.path.join(path, "数据")
            chapters.append({
                "title": dir_name,
                "experiments": {f.replace('.py', ''): f for f in py_files},
                "data_dir": data_dir if os.path.exists(data_dir) else None
            })
    return chapters

图标与颜色映射:每章配有专属图标(如 📊 表示数据分析,🧠 表示深度学习),增强视觉识别。
容错机制:即使某些章节缺失,平台仍能正常运行其余部分,适合分阶段部署。

4.3 代码执行引擎(核心)

这是平台最核心的部分,负责安全地执行用户代码并捕获所有输出。

def load_user_code_from_string(code_string, data_dir=None, file_dir=None):
    """
    安全执行用户代码,捕获输出和图表
    
    返回: (module, error, output_text, figures)
    """
    captured_figures = []
    original_figure = plt.figure
    
    try:
        # 1. 创建独立模块空间(避免变量污染)
        module = ModuleType("user_module")
        
        # 2. 重定向标准输出(捕获 print)
        output_buffer = StringIO()
        old_stdout = sys.stdout
        
        # 3. 捕获 matplotlib 图表
        def capture_figure(*args, **kwargs):
            fig = original_figure(*args, **kwargs)
            captured_figures.append(fig)
            return fig
        plt.figure = capture_figure
        
        # 4. 设置工作环境
        if data_dir and os.path.exists(data_dir):
            sys.path.insert(0, data_dir)
        if file_dir and os.path.exists(file_dir):
            os.chdir(file_dir)
        
        # 5. 执行代码
        sys.stdout = output_buffer
        exec(code_string, module.__dict__)
        
        # 6. 恢复环境
        sys.stdout = old_stdout
        plt.figure = original_figure
        
        return module, None, output_buffer.getvalue(), captured_figures
        
    except Exception as e:
        plt.figure = original_figure
        return None, str(e), "", []

4.4 代码解释器

使用正则表达式分析代码,自动识别各种代码结构并生成解释。

class CodeExplainer:
    @staticmethod
    def explain_code(code_string, lang="zh"):
        explanations = []
        key_points = []
        
        lines = code_string.split('\n')
        
        # 识别 import 语句
        import_pattern = re.compile(r'^import\s+(\w+)|^from\s+(\w+)\s+import')
        for i, line in enumerate(lines, 1):
            match = import_pattern.match(line.strip())
            if match:
                lib = match.group(1) or match.group(2)
                explanations.append({
                    "line": i,
                    "text": f"📦 导入 {lib} 库",
                    "type": "import"
                })
        
        # 识别变量赋值
        var_pattern = re.compile(r'^(\w+)\s*=\s*(.+)$')
        for i, line in enumerate(lines, 1):
            match = var_pattern.match(line.strip())
            if match and not line.strip().startswith('#'):
                var_name = match.group(1)
                explanations.append({
                    "line": i,
                    "text": f"📌 创建变量 {var_name}",
                    "type": "variable"
                })
        
        # 识别函数定义
        func_pattern = re.compile(r'^def\s+(\w+)\s*\(([^)]*)\):')
        for i, line in enumerate(lines, 1):
            match = func_pattern.match(line.strip())
            if match:
                func_name = match.group(1)
                explanations.append({
                    "line": i,
                    "text": f"🔧 定义函数 {func_name}",
                    "type": "function"
                })
                key_points.append(f"函数 {func_name} 可以被多次调用")
        
        # 识别循环结构
        loop_pattern = re.compile(r'^for\s+\w+\s+in\s+(\w+)|^while\s+')
        for i, line in enumerate(lines, 1):
            if loop_pattern.match(line.strip()):
                explanations.append({
                    "line": i,
                    "text": "🔄 循环结构",
                    "type": "loop"
                })
                key_points.append("循环可以高效处理重复性任务")
        
        # 识别特定库的知识点
        if 'plt.' in code_string or 'matplotlib' in code_string:
            key_points.append("matplotlib 是数据可视化库")
        
        if 'pd.' in code_string or 'pandas' in code_string:
            key_points.append("Pandas 提供 DataFrame 数据结构")
        
        if 'np.' in code_string or 'numpy' in code_string:
            key_points.append("NumPy 提供高效的数组运算")
        
        return {
            "explanations": explanations[:10],
            "key_points": key_points[:5]
        }

5、页面展示

平台主界面采用左右双栏布局。左侧是代码编辑区,包含支持语法高亮的编辑器、“运行代码”“重置”“下载”等操作按钮,以及显示当前实验目标与注意事项的互动学习助手。右侧为结果展示区,通过标签页分别呈现程序输出、自动生成的图表、代码解释和交互式控制台。

用户修改代码后点击“运行”,系统会在隔离环境中执行:成功时播放庆祝动画并显示结果;出错时则高亮错误行并展示详细堆栈信息。所有 Matplotlib 绘图会自动捕获并显示在图表标签页中,无需手动调用 plt.show()。

代码运行后,平台会自动分析内容,逐行列出关键语句含义(如变量定义、函数调用等),并提炼核心知识点,帮助用户理解代码逻辑。同时,交互式控制台允许用户输入小段代码即时测试,快速验证想法。

侧边栏提供语言切换(简体中文、英文、壮语)、章节导航(点击章节加载实验列表,再点击实验自动填充代码)以及平台统计(如“共8章、32个实验”),提升整体使用效率与学习体验。
在这里插入图片描述

在这里插入图片描述

6、视频演示

1111111

更多推荐