Python函数与高阶编程范式解析
函数的基本概念
函数是组织良好、可重复调用的代码块,用于实现特定或相关联的功能。通过封装逻辑,函数增强了程序的模块化程度,并提升代码复用率。Python内置了如print()等常用函数,同时也支持开发者自定义函数以满足个性化需求。
函数与过程的区别
在一些编程语言中,"过程"指无返回值的操作,"函数"则有明确返回结果。但在Python中,这种区分并不严格:所有函数都默认返回None,即使未显式使用return语句。
def func_with_return():
print("执行中有返回")
return "done"
def proc_without_return():
print("这是一个无返回的过程")
result1 = func_with_return() # 输出: 执行中有返回
result2 = proc_without_return() # 输出: 这是一个无返回的过程
print(f"func 返回: {result1}") # done
print(f"proc 返回: {result2}") # None
为何使用函数?
- 代码重用:避免重复编写相同逻辑。
- 一致性维护:统一处理流程,便于调试和更新。
- 扩展性强:新增功能时只需修改局部而非全局。
例如日志记录场景:
import time
def log_action():
timestamp = time.strftime('%Y-%m-%d %X')
with open('log.txt', 'a', encoding='utf-8') as f:
f.write(f"{timestamp} - 操作完成\n")
def task_a():
print("运行任务A")
log_action()
def task_b():
print("运行任务B")
log_action()
task_a()
task_b()
上述设计确保每个任务完成后自动写入时间戳,无需手动插入日志代码。
函数定义语法
Python使用def关键字定义函数,基本结构如下:
def function_name(parameters):
"""文档字符串(可选)"""
# 函数体
return value # 可选
示例:
def greet(name):
print(f"欢迎, {name}")
greet("Alice")
返回值机制
return语句不仅传递结果,还立即终止函数执行。若省略表达式,则返回None。
def demo_return():
print("开始执行")
return "中途退出"
print("这行不会被执行") # 不可达代码
output = demo_return()
print(output) # 输出: 中途退出
返回类型可以是任意对象:
- 单个值 → 直接返回该值
- 多个值 → 自动打包为元组
- 函数名本身 → 返回函数引用(内存地址)
def multi_return():
return 1, "hello", [1, 2], {"key": "value"}
res = multi_return()
print(res) # (1, 'hello', [1, 2], {'key': 'value'})
参数传递方式
位置参数与关键字参数
def describe_pet(animal, name):
print(f"我有一只{animal},名字叫{name}")
describe_pet("猫", "小白") # 位置传参
describe_pet(name="小黑", animal="狗") # 关键字传参
describe_pet("兔子", name="跳跳") # 混合模式(位置在前)
默认参数
允许为参数设置默认值,调用时可不传。
def connect(host, port=80):
print(f"连接到 {host}:{port}")
connect("localhost") # 使用默认端口80
connect("api.example.com", 443) # 覆盖默认值
可变参数 (*args 和 **kwargs)
*args:接收任意数量的位置参数,封装成元组。**kwargs:接收任意数量的关键字参数,封装成字典。
def flexible_func(*args, **kwargs):
print("位置参数:", args)
print("关键字参数:", kwargs)
flexible_func(1, 2, 3, user="Bob", action="login")
# 输出:
# 位置参数: (1, 2, 3)
# 关键字参数: {'user': 'Bob', 'action': 'login'}
变量作用域
局部变量仅在函数内部有效;全局变量可通过global关键字在函数内修改。
counter = 0
def increment():
global counter
counter += 1
increment()
print(counter) # 1
对于可变对象(如列表、字典),即使不声明global,也能修改其内容:
data = [1, 2, 3]
def modify_list():
data.append(4) # 成功修改原列表
modify_list()
print(data) # [1, 2, 3, 4]
递归函数
函数调用自身称为递归。需注意:
- 必须有明确的终止条件。
- 每次递归应缩小问题规模。
- 过深递归可能导致栈溢出。
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
print(factorial(5)) # 120
高阶函数
函数可以作为参数传递给其他函数,或作为返回值输出,这类函数称为高阶函数。
def apply_operation(x, y, operation):
return operation(x, y)
def add(a, b):
return a + b
result = apply_operation(3, 4, add)
print(result) # 7
匿名函数 (lambda)
使用lambda创建简洁的单行函数。
double = lambda x: x * 2
print(double(5)) # 10
嵌套函数
在一个函数内部定义另一个函数,常用于闭包或装饰器实现。
def outer():
def inner():
print("这是内部函数")
inner()
outer() # 调用外层函数触发内层执行
装饰器原理与实现
装饰器是一种增强函数功能的技术,遵循两个原则:
- 不修改被装饰函数源码。
- 不改变其调用方式。
核心依赖:高阶函数 + 嵌套函数
示例:统计函数运行时间
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs) # 执行原函数
end = time.time()
print(f"函数 {func.__name__} 耗时: {end - start:.2f}s")
return result
return wrapper
@timer_decorator
def slow_task():
time.sleep(1)
print("任务完成")
slow_task()
上述代码中,@timer_decorator等价于:
slow_task = timer_decorator(slow_task)
装饰器能无缝集成到现有系统,适用于日志、权限控制、缓存等多种场景。
