Day 22模块——把代码拆成零件当你写出几百行代码后全部塞在一个文件里就是灾难。今天学模块——如何把代码拆分到多个文件以及import的各种用法。一、什么是模块——一个 .py 文件就是一个模块新建一个calculator.py# calculator.py —— 一个简单的计算器模块提供基础的数学运算功能defadd(a,b):returnabdefsubtract(a,b):returna-bdefmultiply(a,b):returna*bdefdivide(a,b):ifb0:raiseValueError(除数不能为0)returna/b PI3.14159另一个文件main.py# main.py —— 使用 calculator 模块importcalculator resultcalculator.add(10,5)print(result)# 15print(calculator.multiply(3,4))# 12print(calculator.PI)# 3.14159关键点两个文件放在同一目录下import 文件名不带.py即可使用。二、import 的四种写法# 方式1import 整个模块importcalculator calculator.add(1,2)# 模块名.函数名()# 方式2import 并起别名模块名太长时常用importcalculatorascalc calc.add(1,2)# 别名.函数名()# 方式3from...import 导入特定的东西fromcalculatorimportadd,subtract add(1,2)# 直接用不需要模块名subtract(5,3)# 方式4from...import *导入全部不推荐fromcalculatorimport*multiply(3,4)# 直接用但不知道来自哪个模块推荐优先级需要明确来源 →import 模块名看代码就知道哪个模块的只用一两个函数 →from 模块 import 函数名避免使用from 模块 import *污染命名空间容易冲突三、模块只执行一次——__name__的妙用# calculator.pyprint(正在加载 calculator 模块...)defadd(a,b):returnab# 这段代码只在直接运行 calculator.py时执行# 被 import 时不执行if__name____main__:print(你在直接运行 calculator.py)print(f测试 add(1,2) {add(1,2)})# 直接运行时$ python calculator.py 正在加载 calculator 模块... 你在直接运行 calculator.py 测试 add(1,2)3# 被 import 时importcalculator 正在加载 calculator 模块...# if __name__ __main__ 下面的代码不执行if __name__ __main__是 Python 最常用的模式被 import 时模块可以正常提供函数直接运行时可以执行测试代码四、模块搜索路径——Python 去哪里找模块importsysprint(Python 搜索模块的路径)forpathinsys.path:print(f{path})输出类似当前文件所在目录 PYTHONPATH 环境变量 Python 标准库目录 第三方包安装目录site-packages关键规则Python 会按sys.path的顺序依次查找当前目录优先级最高。五、dir() 和 help()——探索模块的神器importmathimportcalculator# dir()查看模块里有什么print(dir(calculator))# [PI, __builtins__, ..., add, divide, multiply, subtract]print(dir(math))# [acos, asin, atan, ceil, cos, ... pi, sqrt, ...]# help()查看模块的帮助文档help(calculator)# Help on module calculator:# 提供基础的数学运算功能六、组织模块的实战案例假设我们做一个简单的数据处理项目project/ ├── main.py # 主程序 ├── reader.py # 读取数据 ├── processor.py # 处理数据 └── reporter.py # 生成报告reader.py数据读取模块importcsvdefread_csv(filepath):读取 CSV 文件返回数据列表withopen(filepath,r,encodingutf-8)asf:readercsv.DictReader(f)returnlist(reader)defread_json(filepath):读取 JSON 文件importjsonwithopen(filepath,r,encodingutf-8)asf:returnjson.load(f)processor.py数据处理模块deffilter_by_score(data,min_score):筛选成绩 min_score 的记录return[dfordindataifint(d.get(成绩,0))min_score]defcalculate_average(data,field成绩):计算指定字段的平均值values[int(d[field])fordindataiffieldind]returnsum(values)/len(values)ifvalueselse0reporter.py报告生成模块defprint_summary(data):打印数据摘要print(f共{len(data)}条记录)fori,rowinenumerate(data[:5],1):print(f{i}.{row})iflen(data)5:print(f ... 还有{len(data)-5}条)main.py主程序——把所有模块串起来importreaderimportprocessorimportreporterdefmain():# 1. 读取datareader.read_csv(students.csv)# 2. 处理筛选优秀学生excellentprocessor.filter_by_score(data,90)avgprocessor.calculate_average(data)# 3. 报告print(f平均分{avg:.1f})print(f优秀学生≥90分)reporter.print_summary(excellent)if__name____main__:main()七、今日学习总结学习内容掌握情况一句话要点import 模块✅ 重点import 文件名一个 .py 一个模块import…as✅ 理解起别名简化长模块名from…import✅ 理解只导入需要的__name__✅ 重点 __main__区分直接运行 vs 被导入sys.path✅ 了解Python 找模块的路径顺序dir() / help()✅ 了解探索模块内容今日踩坑记录文件名和 Python 内置模块重名不要给文件起math.py、random.py、json.pyimport会优先导入你的文件而不是标准库。循环导入A 模块 import BB 又 import A会导致死循环。解决方法是提取公共依赖到第三个模块。import 放文件顶部一般不要写在函数里面除非有特殊原因如延迟加载或避免循环导入。八、明天学什么今天学了一个 .py 文件的模块化。明天往上走一层——包Package把多个模块组织成一个文件夹用__init__.py管理。然后介绍 Python 标准库中的几个核心模块。写代码就像盖房子——模块是砖块函数是门窗。先做好零件再搭出整体。第22天打卡完成。明天见本系列是个人学习笔记如有错误欢迎在评论区指正交流。