别再复制粘贴代码了!Python 函数从封装到递归、lambda,老哥一次讲透

发布时间:2026/11/3 19:27:21

别再复制粘贴代码了!Python 函数从封装到递归、lambda,老哥一次讲透 写程序最忌讳的就是复制粘贴—— 同一段代码贴三遍改起来要改三处累不说还容易漏。Python 给出的答案是函数把一段会重复用的代码 封装 起来起个名字想用就调用。一、为什么用函数print()其实就是个函数。函数的好处让程序变短变清晰、提高复用性和效率、便于分工协作和维护。看这个场景 —— 要打印 5 行*如果每次都写一遍for i in range(6): print(*********)就冗余了。封装成函数后想打印就调用一次。二、函数的定义与调用def printStar(row, col): # def 函数名(参数列表): 打印 row 行 col 列的 * # 文档字符串说明函数功能 while row 0: print(* * col) row - 1 printStar(2, 3) # 调用先定义后调用 print(- * 20) printStar(1, 4)规则记住几点def开头参数放圆括号里函数体要缩进return返回结果不带表达式返回None函数定义后要先调用才会执行。形参 vs 实参定义时的是形参占位符函数提供者用调用时传的是实参真正的数据调用者给。函数执行完栈空间释放局部变量也跟着消失。三、传参Python 传的是 引用Python 里变量和数据分开存变量里存的是数据的内存地址这个地址叫引用。用id()能看内存地址。核心区别是可变 vs 不可变不可变数字、字符串、元组传的是 值函数里改不影响外面可变列表、字典、集合传的是 引用函数里改会真的改掉外面的数据。def changeList(myList): myList[1] 50 # 修改了列表 mlist [1, 2, 3] changeList(mlist) print(mlist) # [1, 50, 3] 外面也变了再看var1 * 2vsvar1 var1 * 2的区别*在原地址上改会开辟新空间。这在写函数时很容易踩坑。四、四种参数形式1. 必须参数位置传参实参数量和顺序必须和形参一致。def func(a, b, c): print(a, b, c) func(1, 2, 3) # 1传a, 2传b, 3传c2. 关键字参数调用时指名道姓顺序可以乱。def printInfo(name, age): print(f姓名:{name}, 年龄:{age}) printInfo(namezhangsan, age18) printInfo(age18, namezhangsan) # 顺序无所谓3. 默认值参数定义时给默认值调用时可省略。def printInfo(name, age20): # age 默认 20 print(f姓名:{name}, 年龄:{age}) printInfo(zhangsan) # age 用默认值 20 printInfo(lisi, 30) # 传了就用 304. 不定长参数参数个数不确定。*args收成元组**kwargs收成字典。def printInfo(num, *vartuple): # *收成元组 print(num, vartuple) printInfo(70, 60, 50) # 70 (60, 50) def printInfo2(num, **vardict): # **收成字典 print(num, vardict) printInfo2(10, a20, b30) # 10 {a:20,b:30}⚠️ 注意*不定长参数后面的参数调用时必须用关键字传参。解包传参反过来把元组 / 字典拆开传给定长参数。def func(a, b, c): return a b c print(func(* (1, 2, 3))) # 元组解包6 print(func(**{a:1,b:2,c:3})) # 字典解包6key名要和参数名一致五、返回值return结束函数并把结果交给调用者def add(num1, num2): return num1 num2 res add(10, 20) # 用变量接收 print(res) # 30不带表达式return或没有return返回None可以一次返回多个值会打包成元组def f(a, b, c): return a, b, c, [a, b, c] print(f(1, 2, 3)) # (1, 2, 3, [1, 2, 3])六、变量的作用域作用域决定变量在哪能访问Python 有四级查找顺序L → E → G → BLLocal局部函数内定义EEnclosing嵌套外层函数里GGlobal全局模块顶层BBuilt-in内建Python 自带如int注意if/for/while 这些代码块不引入新作用域里面定义的变量外部也能访问只有函数、类、模块才引入新作用域。global 关键字—— 在函数里改全局变量var1 100 def function_a(): global var1 # 声明要用全局的 var1 var1 200 function_a() print(var1) # 200但有个特例全局变量是可变类型列表 / 字典时不用 global 也能改改的是里面内容不是重新指向。nonlocal 关键字—— 在嵌套函数里改外层函数的变量def outer(): var1 1 def inner(): nonlocal var1 # 改外层 outer 的 var1 var1 200 inner() print(var1) # 200七、递归函数调用自己递归就是把大问题拆成小问题。两个关键点找规律 定结束条件。求阶乘5! 5×4×3×2×1# 迭代法 def get_factorial(num): res 1 for n in range(1, num 1): res * n return res print(get_factorial(5)) # 120 # 递归法 def factorial(n): return n * factorial(n - 1) if n 1 else 1 print(factorial(5)) # 120递归要小心别写成死循环—— 一定得有结束条件。八、匿名函数 lambdalambda 参数列表: 表达式一个表达式搞定适合当参数传# 直接定义 f lambda x, y: x y print(f(1, 2)) # 3 # 配合内置函数最常用 student_list [{name:zhang3,age:36},{name:li4,age:14}] print(sorted(student_list, keylambda x: x[age])) # 按年龄排序 print(list(map(lambda x: x*x, [0,1,3,7,9]))) # 逐个处理 [0,1,9,49,81] print(list(filter(lambda x: x 0, [-0,-1,-3,7,9]))) # 过滤 [0,7,9] from functools import reduce print(reduce(lambda x, y: x*y, [1,2,3,4,5])) # 累积 120老哥收尾函数这块信息量大但全是基本功。一句话总结定义用 def、调用写函数名 ()、传参分清可变不可变、*/**管不定长、global/nonlocal 管作用域、递归找规律定出口、lambda 一行定小函数。下一篇咱们学文件操作—— 让程序能把数据写到硬盘、从硬盘读出来。有问题随时回来找老哥。
延伸阅读

更多相关文章

2026/11/3 19:27:21

程序的数据别只活在内存里!Python 文件读写从 open 到 os 模块一次打通

前面程序里的数据都存在内存里 —— 一关程序就全没了。真实应用要把数据持久化到硬盘:存配置、存日志、存结果。这就是文件操作。老哥这篇从文件概念讲到读写、再到 os 模块,最后用一个文件拷贝实战收尾。一、文件的基本概念文件是存在磁盘上的数据集合…

2026/11/3 20:17:26

基于Django与微信小程序的毕业设计导师双向选择系统

1. 项目概述:基于Django与微信小程序的毕业设计导师双向选择系统这个毕业设计选题瞄准了高校教学管理中的一个实际痛点——每年毕业季,学生与导师之间的双向选择过程往往效率低下、信息不对称。传统方式依赖纸质表格或简单线上表单,学生无法全…

2026/11/3 20:17:26

企业邮件安全:从边界防御到智能动态感知架构

1. 企业邮件安全的现状与挑战过去十年间,我参与过数十家企业邮件系统的安全架构设计与升级。最深刻的体会是:传统的边界防御策略正在失效。上周某金融客户的案例就很典型——他们部署了顶级防火墙、反垃圾邮件网关和沙箱系统,但依然被钓鱼邮件…

2026/11/3 20:17:26

GPT-4与ChatGPT辨析:LLM、Transformer与Token实践

简介:《Developing Apps with GPT-4 and ChatGPT》是一份 O’Reilly 出版的英文电子书 PDF,面向希望把大模型能力落地到实际产品的开发者、技术负责人以及生成式 AI 爱好者,重点讨论如何基于 GPT-4 与 ChatGPT 构建智能聊天机器人、内容生成器…

2026/11/3 20:17:26

规格驱动开发:从提示词到可执行代码的实践

1. 项目概述:当提示词遇见规格化编程三年前我第一次尝试用自然语言生成代码时,还需要在GPT对话框里输入大段注释般的描述。如今,在SpecKit工具链的支持下,我只需输入"创建用户注册API,需要邮箱验证和密码强度校验…

2026/11/3 20:17:26

规格驱动开发:从自然语言到可执行代码的自动化实践

1. 项目概述:当提示词遇见规格化编程三年前我第一次尝试用自然语言生成代码时,面对满屏似是而非的函数和混乱的逻辑结构,不得不花费数小时手动修正。而今天在SpecKit工具链的帮助下,同样的需求通过结构化提示词驱动,生…

2026/11/3 20:12:26

Vibe Coding:提升开发效率的心流编程方法论

1. 什么是Vibe Coding?第一次听到Vibe Coding这个词是在一个开发者社区,当时看到有人分享用这种方式完成了一个人月的工作量。简单来说,Vibe Coding是一种强调开发节奏和沉浸感的编程方法论,核心在于通过特定的工具链和工作流&…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32实战:基于MAX14431数字隔离器的SPI隔离通信方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

工业SPI隔离通信设计:MAX14431BAEE+与STM32L4A6RG实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32+NRF24L01无线抢答器:硬件设计、通信协议与低功耗实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑