资讯详情

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

📅 2026/11/3 19:27:14 | 华诺云谱 👁 阅读
别再复制粘贴代码了!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 一行定小函数。下一篇咱们学文件操作—— 让程序能把数据写到硬盘、从硬盘读出来。有问题随时回来找老哥。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑