Python 函数进阶:参数、装饰器、匿名函数全精讲
阅读指南本文专为 Python 初中级工程师打造从参数底层规则到装饰器高阶实战再到 lambda 高效场景全程代码可直接复制运行覆盖 90% 面试高频考点与工程最佳实践读完即可独立封装通用装饰器、写出优雅高阶代码。全文约 12000 字建议收藏 关注持续更新 Python 硬核干货前言为什么函数进阶是 Python 核心分水岭Python 是一门函数式 面向对象双范式语言函数是一等公民。能否熟练驾驭参数、装饰器、匿名函数直接决定代码优雅度、复用性与工程能力。初级工程师只会基础 def、位置参数代码冗余重复中级工程师熟练 * args/**kwargs、lambda简化逻辑高级工程师自定义装饰器、闭包、高阶函数实现无侵入增强本文从基础→进阶→实战→面试四层拆解保姆级教学零基础也能吃透。第一章 函数参数进阶5 类参数 解包 避坑全解1.1 函数参数核心规则与定义函数参数分为形参定义时与实参调用时Python 支持 5 种参数类型调用顺序严格约束** 位置参数 → 默认参数 → *args → 关键字 - only 参数 →kwargs1.2 位置参数最基础也最严格按定义顺序传递数量必须完全匹配缺一不可、多一报错。python运行def add(x, y): 位置参数求和 return x y print(add(10, 20)) # 正常30 # print(add(10)) # 报错缺少位置参数y # print(add(10,20,30))# 报错参数过多工程要点核心必传参数优先使用位置参数保证调用清晰。1.3 关键字参数打破顺序限制通过参数名指定值顺序可任意调整提升代码可读性。python运行def person_info(name, age, city): return f姓名{name}年龄{age}城市{city} # 关键字参数调用顺序无关 print(person_info(age25, city北京, name张三))适用场景参数较多时避免因顺序错误导致 bug。1.4 默认参数简化调用隐藏高频配置定义时赋值调用可传可不传必须放在位置参数之后。python运行def power(base, exp2): 幂运算默认平方 return base ** exp print(power(3)) # 9使用默认exp2 print(power(3, 3)) # 27覆盖默认值⚠️ 致命坑可变对象作为默认参数绝对禁止用列表、字典、集合作为默认参数会被全局复用导致数据污染。python运行# 错误写法 def append_item(item, lst[]): lst.append(item) return lst print(append_item(1)) # [1] print(append_item(2)) # [1,2]预期[2]实际复用列表python运行# 正确写法默认值设为None内部初始化 def append_item(item, lstNone): if lst is None: lst [] lst.append(item) return lst print(append_item(1)) # [1] print(append_item(2)) # [2]1.5 可变参数*args 与 **kwargs接收任意参数1.5.1 *args接收任意位置参数打包为元组python运行def sum_all(*args): total 0 for num in args: total num return total print(sum_all(1,2,3,4,5)) # 15 print(sum_all(10,20)) # 301.5.2 **kwargs接收任意关键字参数打包为字典python运行def print_info(**kwargs): for k, v in kwargs.items(): print(f{k}: {v}) print_info(name李四, age28, job工程师)1.5.3 混合使用完整参数顺序python运行def func(a, b2, *args, c, **kwargs): print(a, b, args, c, kwargs) func(1, 3, 4, 5, c6, d7, e8) # 输出1 3 (4, 5) 6 {d:7, e:8}1.6 参数解包与*一键展开容器调用函数时用 * 解包列表 / 元组** 解包字典简化传参。python运行# 列表解包 nums [10, 20] print(add(*nums)) # 等价add(10,20) # 字典解包 info {name:王五, age:30} print(person_info(**info, city上海))1.7 关键字 - only 参数强制命名传递在 * args 后定义参数必须用关键字传递避免歧义。python运行def func(a, *args, b, c0): print(a, args, b, c) func(1, 2, 3, b4) # 正确 # func(1,2,3,4) # 报错b缺失关键字1.8 参数进阶总结顺序位置→默认→*args→关键字 - only→**kwargs默认参数禁用可变对象*args 收位置**kwargs 收关键字解包简化批量传参关键字 - only 参数提升调用安全性第二章 匿名函数 lambda一行代码的优雅神器2.1 什么是 lambdalambda 是单行匿名函数无需 def 定义无函数名适用于简单一次性逻辑。语法lambda 参数1,参数2...: 表达式只能有一行表达式自动返回结果无 if 多分支、无循环、无赋值语句用完即销毁不占用命名空间2.2 基础用法python运行# 定义加法lambda add_lambda lambda x, y: x y print(add_lambda(5, 6)) # 11 # 平方运算 square lambda x: x ** 2 print(square(4)) # 162.3 核心场景配合高阶函数lambda90% 用于 map/filter/sorted/sort 等高阶函数简化代码。2.3.1 sorted/sort 自定义排序python运行# 按列表中元组第二个元素升序 lst [(apple, 5), (banana, 2), (orange, 8)] lst.sort(keylambda x: x[1]) print(lst) # [(banana,2), (apple,5), (orange,8)] # 按字符串长度降序 str_lst [python, java, c, javascript] new_lst sorted(str_lst, keylambda x: len(x), reverseTrue)2.3.2 map 映射转换python运行# 列表元素乘2 num_lst [1,2,3,4,5] res list(map(lambda x: x*2, num_lst)) print(res) # [2,4,6,8,10]2.3.3 filter 条件过滤python运行# 筛选偶数 res list(filter(lambda x: x % 2 0, num_lst)) print(res) # [2,4]2.3.4 max/min 自定义比较python运行# 找字典中年龄最大的人 people [{name:A,age:20}, {name:B,age:25}] max_age max(people, keylambda x: x[age])2.4 lambda 高级用法2.4.1 三元表达式结合 lambdapython运行compare lambda x, y: x if x y else y print(compare(10, 20)) # 202.4.2 闭包中使用 lambdapython运行def outer(n): return lambda x: x * n double outer(2) print(double(5)) # 102.5 lambda 使用禁忌禁止复杂逻辑超过一行请用 def 函数禁止嵌套多层 lambda可读性极差禁止在全局作用域大量定义 lambda禁止赋值复杂表达式违背简洁初衷2.6 lambda vs 普通函数表格特性lambda普通函数 def命名匿名有明确函数名行数仅限一行任意行数逻辑简单表达式复杂逻辑、分支、循环复用一次性使用多次复用调试难以调试支持文档字符串、断点第三章 装饰器Python 最优雅的语法糖无侵入增强函数3.1 装饰器核心认知装饰器 闭包 高阶函数 语法糖在不修改原函数代码与调用方式的前提下为函数添加额外功能。典型场景日志打印、执行计时、权限校验、参数校验、缓存、重试、事务管理。3.2 前置知识闭包与函数一等对象3.2.1 函数一等对象可作为参数传递可作为返回值返回可赋值给变量可存储在容器中3.2.2 闭包记住外层作用域变量嵌套函数引用外层非全局变量外层函数执行完毕后变量仍被保留。python运行def counter(): count 0 def inner(): nonlocal count count 1 return count return inner c counter() print(c()) # 1 print(c()) # 23.3 最简装饰器入门案例python运行def simple_decorator(func): def wrapper(): print(函数执行前) func() print(函数执行后) return wrapper simple_decorator # 等价 say simple_decorator(say) def say(): print(Hello Python) say()输出函数执行前Hello Python函数执行后3.4 通用装饰器支持任意参数与返回值使用 * args/**kwargs 适配所有函数保留原函数返回值。python运行def通用装饰器(func): def wrapper(*args, **kwargs): # 前置操作 print(f调用函数{func.__name__}) # 执行原函数 result func(*args, **kwargs) # 后置操作 print(f函数执行完毕返回值{result}) return result return wrapper 通用装饰器 def add(a, b): return a b print(add(3, 4))3.5 保留原函数元信息functools.wraps装饰后原函数__name__/__doc__会被 wrapper 覆盖用 wraps 修复。python运行import functools def timer(func): functools.wraps(func) # 保留原函数信息 def wrapper(*args, **kwargs): import time start time.time() res func(*args, **kwargs) print(f耗时{time.time()-start:.4f}s) return res return wrapper timer def test(): 测试函数 return ok print(test.__name__) # test未修复则为wrapper print(test.__doc__) # 测试函数3.6 带参数的装饰器三层嵌套外层接收装饰器参数中间接收函数内层包装执行。python运行def log_level(levelINFO): def decorator(func): functools.wraps(func) def wrapper(*args, **kwargs): print(f[{level}] 执行函数{func.__name__}) return func(*args, **kwargs) return wrapper return decorator log_level(levelERROR) def error_func(): print(出错了) error_func()3.7 类装饰器基于__call__实现通过类实现装饰器适合状态保存与复杂逻辑。python运行class Retry: def __init__(self, max_retry3): self.max_retry max_retry def __call__(self, func): functools.wraps(func) def wrapper(*args, **kwargs): for i in range(self.max_retry): try: return func(*args, **kwargs) except Exception as e: print(f第{i1}次重试异常{e}) raise Exception(重试失败) return wrapper Retry(max_retry2) def test_err(): raise ValueError(测试异常) test_err()3.8 装饰器堆叠多个装饰器顺序执行多个 装饰器执行顺序从下到上调用顺序从上到下。python运行decorator1 decorator2 def func(): pass # 等价decorator1(decorator2(func))3.9 工程级装饰器实战3.9.1 计时装饰器通用python运行import time, functools def timer(func): functools.wraps(func) def wrapper(*args, **kwargs): t_start time.perf_counter() res func(*args, **kwargs) t_cost time.perf_counter() - t_start print(f{func.__name__} 耗时{t_cost:.6f}s) return res return wrapper3.9.2 参数类型校验装饰器python运行def type_check(*types): def decorator(func): functools.wraps(func) def wrapper(*args, **kwargs): for arg, typ in zip(args, types): if not isinstance(arg, typ): raise TypeError(f参数类型错误期望{typ}) return func(*args, **kwargs) return wrapper return decorator type_check(int, int) def add(a, b): return a b3.9.3 缓存装饰器lru_cache 原理python运行def cache_decorator(func): cache {} functools.wraps(func) def wrapper(*args): if args in cache: return cache[args] res func(*args) cache[args] res return res return wrapper cache_decorator def fib(n): if n 1: return n return fib(n-1) fib(n-2)3.10 装饰器总结本质高阶函数 闭包无侵入增强函数通用模板wrapper*args/**kwargs 返回值必须用 functools.wraps 保留元信息带参数装饰器三层嵌套类装饰器适合状态管理工程常用计时、日志、校验、缓存、重试第四章 综合实战参数 lambda 装饰器联动案例4.1 数据处理流水线python运行timer def data_process(data_list, *filters, **kwargs): # 过滤lambdafilter for f in filters: data_list list(filter(f, data_list)) # 映射lambdamap mapper kwargs.get(mapper, lambda x: x) data_list list(map(mapper, data_list)) return sum(data_list) # 调用筛选5乘2求和 res data_process([1,3,6,8,10], lambda x: x5, mapperlambda x: x*2) print(res)4.2 接口请求加固装饰器python运行log_level(INFO) timer Retry(max_retry3) def request_api(url): import requests return requests.get(url).status_code request_api(https://www.baidu.com)第五章 高频面试真题必背Python 参数传递顺序是什么默认参数为什么不能用列表如何修复*args 与 **kwargs 区别与使用场景lambda 限制有哪些适用场景装饰器原理是什么functools.wraps 作用手写计时装饰器、带参数日志装饰器闭包与装饰器关系装饰器堆叠执行顺序类装饰器实现原理如何用装饰器实现函数缓存第六章 学习路线与进阶建议先吃透参数规则避免工程 buglambda 只用于简单场景复杂逻辑用 def装饰器从通用模板开始逐步实现业务需求多看开源框架源码Flask/Django/Requests 大量使用装饰器封装自己的装饰器库提升开发效率结语函数进阶是 Python 从入门到精通的必经之路参数保证灵活调用lambda 简化简洁逻辑装饰器实现优雅增强。本文覆盖所有核心知识点与工程实战建议反复练习把代码敲熟。原创不易点赞 收藏 关注后续将更新《Python 闭包与装饰器源码解析》《高阶函数实战 100 例》带你彻底吃透 Python 函数式编程
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2507510.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!