Langchain系列文章目录
01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
python系列文章目录
01-Python 基础语法入门:从变量到输入输出,零基础也能学会!
02-Python 流程控制终极指南:if-else 和 for-while深度解析
03-Python 列表与元组全攻略:从新手到高手的必备指南
04-Python 字典与集合:从入门到精通的全面解析
05-Python函数入门指南:从定义到应用
06-Python 函数高级特性:从默认参数到闭包的全面解析
07-Python 模块与包:从零到自定义的全面指南
08-Python异常处理:从入门到精通的实用指南
09-Python 文件操作:从零基础到日志记录实战
10-Python面向对象编程入门:从类与对象到方法与属性
11-Python类的方法与属性:从入门到进阶的全面解析
前言
在 Python 编程中,函数是代码复用的核心工具,而掌握其高级特性可以让你的代码更灵活、更高效。本文将围绕 默认参数与可变参数(*args 和 **kwargs)、匿名函数(lambda)、函数嵌套与闭包 这三大主题展开,带你从基础到进阶逐步深入。无论你是刚刚入门 Python 的初学者,还是希望提升代码设计能力的开发者,这篇文章都将为你提供清晰的知识框架、实用的代码示例和常见问题的解决方案。通过学习这些特性,你将能够编写更简洁、功能更强大的代码。让我们开始吧!
一、默认参数与可变参数
默认参数和可变参数是 Python 函数的基础高级特性,它们让函数在面对不同输入时更加灵活。本节将从基本概念到实际应用,带你全面掌握这两大特性。
1.1 默认参数
1.1.1 基本语法与用法
def greet(name, message="你好"):
print(f"{message},{name}!")
greet("小明") # 输出: 你好,小明!
greet("小红", "嗨") # 输出: 嗨,小红!
关键点解析:
message
的默认值是 “你好”,调用时不传这个参数就用默认值。- 如果传了新值(如 “嗨”),默认值会被覆盖。
1.1.2 实际应用场景
默认参数常用于简化函数调用。例如,一个日志记录函数可能默认设定日志级别为 “INFO”:
def log(message, level="INFO"):
print(f"[{level}] {message}")
log("系统启动") # 输出: [INFO] 系统启动
log("错误发生", "ERROR") # 输出: [ERROR] 错误发生
1.1.3 注意事项与常见问题
- 参数顺序:默认参数必须放在非默认参数后面,否则会报错。
# 错误示例
def wrong_func(message="你好", name): # SyntaxError
pass
- 可变对象陷阱:默认值在函数定义时只计算一次,若使用可变对象(如列表)可能导致意外行为。
def append_item(item, lst=[]):
lst.append(item)
return lst
print(append_item(1)) # 输出: [1]
print(append_item(2)) # 输出: [1, 2](lst 被共享)
解决方案:用 None
替代可变默认值。
def append_item(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
print(append_item(1)) # 输出: [1]
print(append_item(2)) # 输出: [2]
1.2 可变参数:*args 和 **kwargs
可变参数让函数能够处理任意数量的输入,分为 *args
(位置参数)和 **kwargs
(关键字参数)。
1.2.1 *args:处理任意数量的位置参数
def sum_all(*args):
return sum(args)
print(sum_all(1, 2, 3)) # 输出: 6
print(sum_all(4, 5)) # 输出: 9
关键点解析:
*args
将所有位置参数收集为一个元组。- 适用于需要动态接收参数的场景,如求和、列表合并等。
1.2.2 **kwargs:处理任意数量的关键字参数
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="小明", age=18)
# 输出:
# name: 小明
# age: 18
关键点解析:
**kwargs
将关键字参数收集为一个字典。- 适合处理命名参数,如配置信息传递。
1.2.3 结合使用与参数顺序
def mixed_params(a, b=2, *args, **kwargs):
print(f"a: {a}, b: {b}, args: {args}, kwargs: {kwargs}")
mixed_params(1, 3, 4, 5, key="value")
# 输出: a: 1, b: 3, args: (4, 5), kwargs: {'key': 'value'}
关键点解析:
- 参数顺序必须是:位置参数 > 默认参数 >
*args
>**kwargs
。 *args
收集多余位置参数,**kwargs
收集多余关键字参数。
1.2.4 应用案例:动态格式化输出
def format_string(template, *args, **kwargs):
return template.format(*args, **kwargs)
print(format_string("{0} 年龄是 {age}", "小明", age=20))
# 输出: 小明 年龄是 20
场景:格式化字符串时,参数数量和类型不确定时非常实用。
二、匿名函数(lambda)
lambda 函数是 Python 中一种轻量级的匿名函数,适合快速定义简单逻辑。
2.1 基本语法与用法
语法:lambda arguments: expression
add = lambda x, y: x + y
print(add(3, 4)) # 输出: 7
关键点解析:
- 无需
def
和函数名,直接定义并使用。 - 只能包含一个表达式,结果自动返回。
2.2 应用场景
2.2.1 用作函数参数
lambda 常用于需要临时函数的场景,例如排序:
students = [("小明", 85), ("小红", 92), ("小刚", 78)]
sorted_students = sorted(students, key=lambda x: x[1])
print(sorted_students)
# 输出: [('小刚', 78), ('小明', 85), ('小红', 92)]
解析:key=lambda x: x[1]
按成绩排序。
2.2.2 简化代码
避免为一次性逻辑定义完整函数:
# 传统函数
def is_even(n):
return n % 2 == 0
print(list(filter(is_even, [1, 2, 3, 4])))
# 用 lambda
print(list(filter(lambda x: x % 2 == 0, [1, 2, 3, 4])))
# 输出均为: [2, 4]
2.2.3 注意事项
- 限制:lambda 只能包含单表达式,不支持多行代码。
- 建议:复杂逻辑仍用
def
定义函数以提高可读性。
三、函数嵌套与闭包
函数嵌套和闭包是 Python 函数的高级特性,能够实现数据封装和复杂逻辑。
3.1 函数嵌套
在函数内部定义另一个函数,称为嵌套函数。
3.1.1 基本示例
def outer():
def inner():
print("我是内部函数")
inner()
outer() # 输出: 我是内部函数
关键点解析:
inner
只在outer
内部可用。- 嵌套函数可以访问外部函数的变量(作用域规则)。
3.1.2 应用场景
嵌套函数常用于逻辑分层或临时功能封装:
def calculate(a, b):
def add():
return a + b
def subtract():
return a - b
return add(), subtract()
print(calculate(5, 3)) # 输出: (8, 2)
3.2 闭包
闭包是嵌套函数的进阶形式,内部函数引用外部函数变量并在外部函数结束后仍可访问这些变量。
3.2.1 基本示例
def make_multiplier(factor):
def multiplier(number):
return number * factor
return multiplier
times_three = make_multiplier(3)
print(times_three(5)) # 输出: 15
关键点解析:
multiplier
引用了factor
,即使make_multiplier
执行结束,factor
仍保留在内存中。
3.2.2 应用案例:计数器
def counter():
count = 0
def increment():
nonlocal count # 声明修改外部变量
count += 1
return count
return increment
c = counter()
print(c()) # 输出: 1
print(c()) # 输出: 2
场景:数据封装,隐藏状态(如计数器、配置)。
3.2.3 闭包的工作原理可视化
解析:闭包通过引用外部变量形成“记忆”,实现状态持久化。
四、总结
本文详细讲解了 Python 函数的三大高级特性:
- 默认参数与可变参数:通过默认值、
*args
和**kwargs
,让函数适应多种输入场景。 - 匿名函数(lambda):简洁定义临时函数,提升代码效率。
- 函数嵌套与闭包:实现复杂逻辑和数据封装,奠定装饰器等高级概念基础。
建议你在实际项目中多练习这些特性,例如用 *args
处理动态输入、用闭包封装状态。掌握它们不仅能优化代码,还能为学习更高级的 Python 编程(如装饰器、生成器)打下基础。快去试试吧!