发布时间:2026/6/17 7:58:24
Python 函数、模块、包与项目结构,从重复代码到可维护小项目
写 Python 的前几天所有代码放在一个文件里完全没问题。但很快你会遇到两个问题。第一重复代码越来越多。比如计算总价、校验输入、读取文件这些逻辑到处复制。第二文件越来越长。几百行代码堆在一起想找一个函数都费劲。函数、模块、包和项目结构就是为了解决这两个问题。它们是一条线重复代码函数多个函数放进模块多个模块组成包形成清晰项目结构函数解决重复代码不用函数时price19.9count3totalprice*countprint(total)price9.9count5totalprice*countprint(total)同样的计算逻辑写了两遍。用函数defcalc_total(price:float,count:int)-float:计算商品总价。returnprice*countprint(calc_total(19.9,3))print(calc_total(9.9,5))函数的价值不是少写几行代码而是把一段逻辑集中管理。函数的输入和输出函数最重要的是想清楚输入和输出。defcalc_bmi(height:float,weight:float)-float:计算 BMIheight 单位为米weight 单位为千克。returnweight/(height*height)bmicalc_bmi(1.75,70)print(fBMI{bmi:.2f})输入是身高和体重。输出是 BMI。如果一个函数说不清输入输出就很可能设计得不清楚。print和return不一样defadd(a,b):print(ab)resultadd(10,20)print(result)这段会先打印30再打印None。原因是函数没有返回值。正确写法defadd(a,b):returnab resultadd(10,20)print(result)判断标准如果结果只是给人看用print()。如果结果还要给后续代码使用用return。参数的几种写法位置参数defintroduce(name,age):returnf我叫{name}今年{age}岁print(introduce(小明,18))关键字参数print(introduce(age18,name小明))默认参数defgreet(name,prefix你好):returnf{prefix}{name}print(greet(小明))print(greet(小红,早上好))默认参数要小心可变对象。不要这样写defadd_item(item,items[]):items.append(item)returnitems因为默认列表会被多次调用共享。更安全defadd_item(item,itemsNone):ifitemsisNone:items[]items.append(item)returnitems作用域变量在哪里有效函数内部定义的变量默认只在函数内部有效。defsay_hello():message你好print(message)say_hello()# print(message) 这里会报错函数外面的变量叫全局变量。coursePythondefprint_course():print(course)print_course()能读全局变量不代表应该大量依赖全局变量。函数最好通过参数接收数据通过返回值交出结果。这样函数更独立也更容易测试。函数拆分原则一个函数最好只做一件清楚的事。比如订单处理可以拆成defcalc_discount(amount:float)-float:ifamount200:returnamount*0.8ifamount100:returnamount-20returnamountdefprint_order(amount:float)-None:final_amountcalc_discount(amount)print(f应付金额{final_amount:.2f})print_order(268)calc_discount()只负责计算。print_order()只负责展示。职责拆开后后面要改优惠规则不会影响展示逻辑。Docstring 怎么写才有价值Docstring 不是给显而易见的代码写废话。不推荐defadd(a,b):把 a 和 b 相加。returnab这个注释没有提供新信息。更有价值defcalc_discount(price:float,discount:float)-float:计算折后价格discount 取值范围为 0 到 1。returnprice*discount这里说明了discount的取值范围这个信息单看代码不一定知道。一个.py文件就是一个模块当函数越来越多就应该拆文件。项目结构project ├── main.py └── price_utils.pyprice_utils.pydefcalc_discount(amount:float)-float:ifamount200:returnamount*0.8ifamount100:returnamount-20returnamountmain.pyfromprice_utilsimportcalc_discount amount268final_amountcalc_discount(amount)print(f应付金额{final_amount:.2f})price_utils.py就是模块。导入方式怎么选导入整个模块importmathprint(math.sqrt(16))从模块导入指定函数frommathimportsqrtprint(sqrt(16))起别名importpandasaspd不推荐初学者随便写frommathimport*因为它会把很多名字直接放进当前文件容易冲突也不容易看出函数来源。__name__和程序入口很多文件底部会写defmain():print(程序开始)if__name____main__:main()意思是只有当前文件被直接运行时才执行main()。如果这个文件被别的模块导入不会自动执行。这能避免导入模块时顺手执行一堆测试代码。包是什么多个模块可以放进一个文件夹这个文件夹就可以作为包。book_project ├── main.py └── utils ├── __init__.py ├── file_utils.py └── price_utils.py导入fromutils.price_utilsimportcalc_discount传统 Python 包里常见__init__.py。它可以为空也可以控制包导出内容。__pycache__是什么运行 Python 项目后你可能看到__pycache__这是 Python 生成的字节码缓存目录用来加快模块加载。它不是你手写的源码一般不用管。如果后面使用 Git 管理代码通常会把__pycache__加进忽略文件。虚拟环境和 pip项目开始用第三方库后就需要虚拟环境。创建python-mvenv .venvWindows 激活.venv\Scripts\activate安装依赖pipinstallrequests导出依赖pip freezerequirements.txt别人拿到项目后安装pipinstall-rrequirements.txt虚拟环境的意义是让每个项目有自己的依赖避免项目之间互相污染。一个推荐的小项目结构python-study-project ├── main.py ├── requirements.txt ├── data │ └── books.json ├── services │ ├── __init__.py │ └── book_service.py └── utils ├── __init__.py └── file_utils.pymain.py放入口逻辑。data放数据文件。services放业务逻辑。utils放通用工具函数。项目结构不是越复杂越好。小项目从简单开始随着代码变多再拆。常见错误文件名和标准库重名不要把文件命名为json.py csv.py math.py random.py这些名字和标准库冲突可能导致导入异常。循环导入A 导入 BB 又导入 A可能出现循环导入。解决方法通常不是硬改导入语句而是重新拆职责把共同依赖的内容放到第三个模块。在模块顶层写太多执行代码模块被导入时顶层代码会执行。测试代码放进if__name____main__:...当前目录不对导致导入失败建议始终在项目根目录运行入口文件。不要一会儿在子目录运行一会儿在根目录运行否则导入路径会变得难查。练习拆一个价格计算项目创建结构price_project ├── main.py └── price_utils.pyprice_utils.pydefcalc_discount(amount:float)-float:根据订单金额计算优惠后价格。ifamount200:returnamount*0.8ifamount100:returnamount-20returnamountmain.pyfromprice_utilsimportcalc_discount amountfloat(input(请输入订单金额))final_amountcalc_discount(amount)print(f应付金额{final_amount:.2f})运行python main.py如果能跑通说明你已经从单文件脚本走到了最小项目结构。参考资料Python 官方函数教程https://docs.python.org/3/tutorial/controlflow.html#defining-functionsPython 官方模块教程https://docs.python.org/3/tutorial/modules.htmlPython 虚拟环境教程https://docs.python.org/3/tutorial/venv.htmlPEP 8https://peps.python.org/pep-0008/

相关新闻

工业物联网通信技术实战:无线传感网络与电力线载波通信设计
2026/6/17 7:58:24

工业物联网通信技术实战:无线传感网络与电力线载波通信设计

1. 工业控制与楼宇自动化的技术基石:从孤岛到互联 在工厂车间里,设备轰鸣,生产线有条不紊地运转;在现代化写字楼中,空调、照明、安防系统仿佛拥有生命,自动调节以提供最舒适、最安全的环境。这背后&#xf…

阅读更多
2026年AI最火趋势:掌握Agentic Engineering
2026/6/17 6:58:24

2026年AI最火趋势:掌握Agentic Engineering

2026 年,AI 圈最火的词是 Agentic Engineering。 Karpathy 在 2 月给了这个时代一个名字: “你 99% 的时间不在写代码。你在编排 Agent,充当监督者。” 3 月 7 日,他把这件事推到了极致——推送了一个 630 行的 Python 脚本&am…

阅读更多
性能测试实战:从JMeter工具使用到系统瓶颈定位的完整指南
2026/6/17 6:58:24

性能测试实战:从JMeter工具使用到系统瓶颈定位的完整指南

1. 项目概述:一次经典性能测试案例的深度复盘十多年前,也就是2013年,我参加了软件设计师(中级)的考试。那场考试里,一道关于“性能测试案例分析”的题目给我留下了极其深刻的印象。它不像现在很多题目那样&…

阅读更多
USDPAA SDK 1.2多进程架构演进:从静态独占到动态共享的资源管理
2026/6/17 8:58:24

USDPAA SDK 1.2多进程架构演进:从静态独占到动态共享的资源管理

1. 项目概述:从单进程到多进程的架构演进在嵌入式网络处理器的世界里,追求极致的数据平面性能是一个永恒的主题。USDPAA(用户空间数据路径加速架构)的出现,正是为了将数据包处理的重任从内核态解放出来,直接…

阅读更多
机器学习实战:从线性回归到随机森林,掌握工业界最常用算法
2026/6/17 8:58:24

机器学习实战:从线性回归到随机森林,掌握工业界最常用算法

1. 项目概述:从“常用”二字切入的机器学习实战地图每次看到“机器学习常用算法”这个标题,很多刚入门的朋友可能会立刻想到去背公式、记概念,比如线性回归的损失函数、SVM的核技巧、决策树的Gini系数。但从业十多年,我越来越觉得…

阅读更多
企业级即时通讯:本地通讯软件如何重塑企业数字化中枢
2026/6/17 8:58:24

企业级即时通讯:本地通讯软件如何重塑企业数字化中枢

沟通即平台:本地通讯软件如何重塑企业数字化中枢一、系统孤岛症:当几十套顶级软件输给一个微信群某大型制造集团的内部调研揭示了一个残酷真相:总部员工平均每天在8个以上系统间切换,“找回密码”和“重新登录”正在吃掉核心生产力…

阅读更多
基于MQX RTOS的嵌入式网络监控系统实战:从传感器到Web服务器
2026/6/17 8:58:24

基于MQX RTOS的嵌入式网络监控系统实战:从传感器到Web服务器

1. 项目概述与核心价值几年前,我在一个智能家居的预研项目中,第一次接触到飞思卡尔(Freescale,现为NXP的一部分)的MQX实时操作系统。当时的需求是在一颗资源有限的微控制器上,同时处理传感器数据、维持网络…

阅读更多
学习c语言第37天 递归的条件
2026/6/17 8:58:24

学习c语言第37天 递归的条件

递归需要两个必要条件1、存在限制条件&#xff0c;当满足这个条件&#xff0c;递归不继续2、函数在每次递归后越来越接近限制条件例void my_strlen(){ my_strlen();}//会导致栈溢出#include<stdio.h> //编写函数不允许创建临时 变量&#xff0c;求字符串长度/* #include&…

阅读更多
【2027最新】基于SpringBoot+Vue的无人超市管理系统管理系统源码+MyBatis+MySQL
2026/6/17 7:58:24

【2027最新】基于SpringBoot+Vue的无人超市管理系统管理系统源码+MyBatis+MySQL

&#x1f4a1;实话实说&#xff1a;CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价。我就是个在校研究生&#xff0c;兼职赚点饭钱贴补生活费&…

阅读更多
别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)
2026/6/16 18:17:55

别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)

超越BERT&#xff1a;用Transformers库高效实现文本相似度计算的三种实战方案在自然语言处理领域&#xff0c;文本相似度计算是信息检索、问答系统和推荐系统等应用的核心技术。传统方法如TF-IDF或Word2Vec已逐渐被基于Transformer的预训练模型所取代。Hugging Face的Transform…

阅读更多
Prompt Engineering:重构人机协作的工程化方法论
2026/6/16 20:00:23

Prompt Engineering:重构人机协作的工程化方法论

1. 项目概述&#xff1a;这不是“写提示词”&#xff0c;而是重构人机协作的底层逻辑“Prompt Engineering”这个词&#xff0c;这两年被讲得太多&#xff0c;也太轻飘。很多人把它理解成“给AI发指令的技巧”&#xff0c;甚至简化为“多加几个形容词”“换种说法再试一次”。我…

阅读更多
Anthropic提示层归零:模型即协议的工程实践
2026/6/16 0:39:53

Anthropic提示层归零:模型即协议的工程实践

1. 项目概述&#xff1a;这不是一次普通更新&#xff0c;而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出来&#xff0c;我正在调试一个Claude调用链的终端前停了三秒。不是因为震惊&#xff0c;而是因为熟悉&…

阅读更多
Alice-Tools:解密AliceSoft游戏文件的终极工具集
2026/6/17 0:58:23

Alice-Tools:解密AliceSoft游戏文件的终极工具集

Alice-Tools&#xff1a;解密AliceSoft游戏文件的终极工具集 【免费下载链接】alice-tools Tools for extracting/editing files from AliceSoft games. 项目地址: https://gitcode.com/gh_mirrors/al/alice-tools 对于AliceSoft游戏爱好者和开发者来说&#xff0c;处理…

阅读更多
基于Python的酒店预订管理系统设计与实现
2026/6/17 0:58:23

基于Python的酒店预订管理系统设计与实现

第1章 绪论1.1 课题背景由于旅游业的发展和互联网技术的不断进步&#xff0c;酒店预订系统已经成为现代旅游业不可或缺的部分&#xff0c;传统的酒店预定方式存在着流程繁琐、效率低等问题&#xff0c;不能满足现代消费者对个性化、便捷化越来越高的需求&#xff0c;因此开发…

阅读更多
生成式引擎优化GEO,原来选对服务商这么重要?
2026/6/17 0:58:23

生成式引擎优化GEO,原来选对服务商这么重要?

引言在当今数字化时代&#xff0c;生成式引擎优化&#xff08;GEO&#xff09;已经成为企业提升效率、降低成本的关键技术之一。然而&#xff0c;选择合适的GEO源头服务商却是一个复杂且重要的决策。本文将深入探讨为什么选对GEO服务商如此重要&#xff0c;并提供一些实用的选型…

阅读更多
GIT修改用户名
2026/6/16 5:55:51

GIT修改用户名

在GIT中修改用户名可按以下步骤操作&#xff1a; 查看当前git的用户名&#xff0c;使用命令git config --list或git config user.name。修改git用户名&#xff0c;使用命令git config --global user.name "xxx&#xff08;新的用户名&#xff09;"&#xff0c;将其中…

阅读更多
Win11Debloat:让你的Windows系统重获新生的终极优化工具
2026/6/16 16:55:24

Win11Debloat:让你的Windows系统重获新生的终极优化工具

Win11Debloat&#xff1a;让你的Windows系统重获新生的终极优化工具 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …

阅读更多
技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践
2026/6/17 4:21:30

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践

技术深度解析&#xff1a;m4s-converter实现原理与B站缓存视频转换最佳实践 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一个…

阅读更多