深浅函数定义与用法汇总
松柏摧为薪 上传于 2022-05-23 19:35
《深浅函数定义与用法汇总》
在Python编程中,函数是构建可复用代码的核心工具。从基础到高级,函数的设计直接影响代码的可读性、维护性和执行效率。本文将系统梳理Python中函数的定义方式、参数传递机制、作用域规则及高级应用场景,帮助开发者全面掌握函数的使用技巧。
一、基础函数定义
Python使用def
关键字定义函数,基本语法如下:
def function_name(parameters):
"""函数文档字符串"""
# 函数体
return result
示例:计算两数之和
def add_numbers(a, b):
"""返回两个数的和"""
return a + b
result = add_numbers(3, 5)
print(result) # 输出8
关键特性:
- 函数名需遵循标识符命名规则
- 参数列表可为空或包含多个参数
- 通过
return
返回值,若无则返回None
二、参数传递机制
1. 位置参数与默认参数
位置参数按顺序传递,默认参数提供初始值:
def greet(name, message="Hello"):
print(f"{message}, {name}!")
greet("Alice") # 使用默认message
greet("Bob", "Hi") # 覆盖默认值
注意事项:
- 默认参数需放在非默认参数之后
- 默认参数仅初始化一次,可能引发意外行为
def append_number(num, target=[]):
target.append(num)
return target
print(append_number(1)) # [1]
print(append_number(2)) # [1, 2](非预期结果)
2. 可变参数(*args, **kwargs)
处理不确定数量参数:
-
*args
:接收任意数量位置参数,存储为元组 -
**kwargs
:接收任意数量关键字参数,存储为字典
def log_info(*args, **kwargs):
print("位置参数:", args)
print("关键字参数:", kwargs)
log_info(1, 2, 3, name="Alice", age=25)
# 输出:
# 位置参数: (1, 2, 3)
# 关键字参数: {'name': 'Alice', 'age': 25}
3. 参数解包
将序列/字典解包为参数:
def calculate(a, b, op):
if op == "add":
return a + b
elif op == "sub":
return a - b
nums = (5, 3)
ops = {"op": "add"}
print(calculate(*nums, **ops)) # 输出8
三、作用域与命名空间
Python采用LEGB规则解析变量:
- Local(局部作用域)
- Enclosing(嵌套函数外层)
- Global(全局作用域)
- Built-in(内置作用域)
x = "global"
def outer():
x = "enclosing"
def inner():
x = "local"
print("inner:", x) # 访问局部变量
inner()
print("outer:", x) # 访问外层变量
outer()
print("global:", x) # 访问全局变量
修改全局变量需使用global
关键字:
count = 0
def increment():
global count
count += 1
increment()
print(count) # 输出1
四、高阶函数应用
1. 函数作为参数
def apply_operation(func, a, b):
return func(a, b)
def multiply(x, y):
return x * y
result = apply_operation(multiply, 4, 5)
print(result) # 输出20
2. 函数作为返回值
实现闭包(Closure):
def power_factory(exp):
def power(base):
return base ** exp
return power
square = power_factory(2)
cube = power_factory(3)
print(square(5)) # 25
print(cube(5)) # 125
3. 装饰器(Decorators)
在不修改原函数代码的情况下扩展功能:
def logger(func):
def wrapper(*args, **kwargs):
print(f"调用函数: {func.__name__}")
result = func(*args, **kwargs)
print(f"结果: {result}")
return result
return wrapper
@logger
def add(a, b):
return a + b
add(3, 4)
# 输出:
# 调用函数: add
# 结果: 7
带参数的装饰器:
def repeat(num_times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f"Hello, {name}!")
greet("Alice")
# 输出:
# Hello, Alice!
# Hello, Alice!
# Hello, Alice!
五、函数式编程工具
1. lambda表达式
创建匿名函数:
square = lambda x: x ** 2
print(square(5)) # 25
# 替代简单函数
numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, numbers))
print(squared) # [1, 4, 9, 16]
2. map/filter/reduce
from functools import reduce
numbers = [1, 2, 3, 4]
# map应用函数到序列
doubled = list(map(lambda x: x*2, numbers)) # [2, 4, 6, 8]
# filter筛选元素
evens = list(filter(lambda x: x%2 == 0, numbers)) # [2, 4]
# reduce累积计算
product = reduce(lambda x, y: x*y, numbers) # 24
3. partial函数
固定部分参数创建新函数:
from functools import partial
def power(base, exp):
return base ** exp
square = partial(power, exp=2)
print(square(5)) # 25
六、递归函数
递归实现阶乘计算:
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
print(factorial(5)) # 120
尾递归优化(Python不原生支持,可模拟):
def factorial_tail(n, accumulator=1):
if n == 0:
return accumulator
else:
return factorial_tail(n-1, accumulator*n)
print(factorial_tail(5)) # 120
七、生成器函数
使用yield
创建生成器:
def fibonacci(limit):
a, b = 0, 1
while a
八、最佳实践
- 函数应保持单一职责
- 参数数量建议不超过5个
- 使用类型注解提高可读性(Python 3.5+)
- 为复杂函数添加文档字符串
- 避免过度使用全局变量
def divide(a: float, b: float) -> float:
"""返回两个数的除法结果
Args:
a: 被除数
b: 除数(不能为0)
Returns:
商
Raises:
ValueError: 当b为0时
"""
if b == 0:
raise ValueError("除数不能为零")
return a / b
关键词:Python函数、参数传递、作用域规则、高阶函数、装饰器、lambda表达式、递归、生成器、函数式编程
简介:本文全面总结Python函数的定义方式与高级用法,涵盖参数传递机制、作用域管理、高阶函数应用、装饰器模式、函数式编程工具及递归实现,通过代码示例解析核心概念,提供实用的开发实践建议。