公司动态
Python 函数|递归|lambda 匿名函数 | 操作笔记
一、函数1. 函数定义与调用函数将实现特定功能的代码封装提高代码复用性减少冗余。函数定义语法def 函数名(参数1, 参数2, 参数3...): 函数体 return 返回值函数调用语法函数名(参数1, 参数2, 参数3...)函数名绝大多数函数要有函数名无函数名无法重复调用参数提升函数灵活性外部向函数内部传递数据函数体封装的业务代码调用函数才会执行返回值return后的数据把函数内部结果传递到函数外部执行顺序代码从上往下执行定义函数时仅保存函数信息不会执行内部代码调用时才执行函数体调用的函数不存在则报错。2. 函数参数形参函数定义时括号内的参数仅函数内部可用实参函数调用时传入的数据用于给形参赋值# a b 是形参 def add(a, b): return a b # 10 20 是实参 res add(10, 20)3. 函数返回值返回值把函数内部运算结果传递到函数调用位置供外部使用不会自动打印需要手动 print 接收结果。return执行之后立刻跳出函数return后续代码不会执行。函数可以写多个return运行只会执行其中一个。return 只能返回一个对象如需返回多个数据使用容器列表、元组、字典打包。函数不写 return或者仅写return后面不带数据默认返回None。def demo(): return 1,2,3 # 本质组包为元组 (1,2,3) res demo() print(res)4. 函数的嵌套调用在一个函数的函数体内部调用另外一个函数。 只要被调用的函数在调用之前完成定义即可函数书写先后顺序无强制要求。def fun_a(): print(A函数执行) def fun_b(): print(B函数开始) fun_a() # 嵌套调用 print(B函数结束) fun_b()5. 局部变量和全局变量局部变量函数内部定义仅函数内部可以访问函数执行完毕销毁。全局变量函数外部文件顶层定义函数内外均可访问。if、for代码块内部定义的变量属于全局变量Python 没有块级作用域。num 100 # 全局变量 def test(): a 10 # 局部变量 print(num) test()6. global 关键字 LEGB 查找原则global声明函数内部使用的是全局变量可以修改全局变量的值。num 10 def change(): global num num 20 change() print(num)LEGB 变量查找顺序L Local函数内部局部作用域E Enclosing外层嵌套函数作用域G Global全局作用域B Built‑inPython 内置作用域7. 函数参数进阶1位置参数调用按照顺序一一对应传参实参数量不能多也不能少。def fn(a,b): print(a,b) fn(10,20)2关键字传参调用时使用形参名值可以打乱顺序关键字参数必须写在位置参数后面。fn(b100,a200)3缺省参数默认参数定义形参时指定默认值调用不传参则使用默认值传参则覆盖默认值。默认参数必须放在位置参数后面。def fn2(a,b10): print(a,b) fn2(1) fn2(1,20)8. 不定长参数1位置不定长参数*args接收多余的位置实参组包成元组。def func(*args): print(args) func(1,2,3,4)2关键字不定长参数**kwargs接收多余的关键字实参组包成字典。def func(**kwargs): print(kwargs) func(name张三,age18)9. 参数排布顺序形参顺序位置参数 *args位置不定长 缺省参数 **kwargs关键字不定长实参顺序位置参数赋值在前关键字参数在后开发建议参数种类尽量不超过 3 种参数总数不超过 5 个降低维护成本。10. 组包与拆包组包多个数据打包为一个容器元组、列表、字典拆包把容器中的元素拆分赋值给多个变量# 拆包 a,b,c (10,20,30) print(a,b,c)11. 引用、id 标识数据三个维度值参与运算的数据数据类型唯一标识id()内存地址编号is判断两个对象 id内存地址是否相同判断两个对象的值是否相等a [1,2,3] b [1,2,3] print(a b) print(a is b)12. 可变类型与不可变类型✅可变类型内存空间数据可以原地修改list、set、dict✅不可变类型内存中的数据不可修改修改会生成新对象int、float、bool、tuple13. 引用作为函数参数传递Python 全部为引用传递不存在值传递传入可变类型函数内部修改容器内部数据外部原始数据同步改变。传入不可变类型内部修改会生成新对象不会影响外部原始变量。def change_list(lst): lst.append(999) my_list [1,2,3] change_list(my_list) print(my_list)二、递归1. 递归概念递归函数内部调用函数自身把大问题拆解为规模更小的同类子问题。顺推从基础已知条件逐步推出结果逆推从结果反向推导已知条件递归必备三要素找到最优子问题函数自己调用自己明确递归终止条件出口防止超出最大递归深度# 简单示例求1~n累加和 def sum_num(n): if n 1: return 1 return n sum_num(n‑1) print(sum_num(5))2. lambda 匿名函数没有函数名的简易函数只能书写单个表达式不能写复杂函数体。 语法lambda 参数 : 返回表达式# 方式1变量接收调用 f lambda x,y : xy print(f(1,2)) # 方式2作为sort的key参数 data [[1,3],[4,1],[2,5]] data.sort(keylambda x:x[1]) print(data)lambda 缺点只能写表达式逻辑复杂时代码可读性差不使用变量接收只能一次性使用。三、文件操作1. 文件打开与关闭文件对象 open(文件路径, 读写模式, encoding编码格式) 文件对象.close()文件路径相对路径 / 绝对路径读写模式r读、w写、a追加windows 打开文本文件建议指定encodingutf‑8文件打开必须 close 关闭否则占用系统资源。2. 文件读取操作r模式文件不存在直接报错。read(size)读取字符size 指定读取字符数量指针向后移动读完返回空字符串f open(test.txt,r,encodingutf‑8) res f.read(10) f.close()readline()一次读取一行以\n换行符分割readlines()一次性读取全部内容每行作为列表的一个元素返回。3. 文件写入操作w模式文件存在清空原有内容文件不存在新建文件使用write()写入字符串数据f open(test.txt,w,encodingutf‑8) f.write(hello python) f.close()4. 文件追加操作a模式文件不存在新建文件文件存在在文件末尾追加内容不会清空原有数据同样使用write()写入。5. 文件读写模式总览了解表格模式说明r字符只读r字符可读可写rb字节读二进制图片视频rb字节可读可写w字符覆盖写w字符写 读wb字节覆盖写wb字节写 读a字符追加a字符追加 读ab字节追加ab字节追加 读文本文件使用 r/w/a图片、音视频二进制文件使用 rb/wb/ab。6. os 模块文件重命名、删除需要导入模块import osos.rename(旧路径,新路径)文件重命名、移动文件源文件必须存在移动路径要写完整文件名。os.remove(文件路径)删除文件不会进入回收站误删无法恢复不能删除文件夹。7. os 模块文件夹操作import osos.mkdir()创建空文件夹不能创建多级目录os.rmdir()删除空文件夹不能删除内部有文件的文件夹os.getcwd()获取当前工作目录os.chdir(路径)切换工作目录os.listdir(路径)获取指定目录下所有文件名返回字符串列表不传参数查询当前工作目录。print(os.listdir())