Python 函数使用指南
函数是 Python 中代码复用的基本单位,用于封装特定功能的代码块。
1. 函数定义
1.1 基本语法
# 基本函数定义
def greet(name):
"""简单的问候函数"""
return f"Hello, {name}!"
# 带默认参数的函数
def greet_with_title(name, title="Mr."):
return f"Hello, {title} {name}!"
# 多个返回值
def get_user_info():
name = "张三"
age = 25
return name, age # 返回元组
1.2 参数类型
# 位置参数
def add(x, y):
return x + y
# 关键字参数
def greet(first_name, last_name):
return f"Hello, {first_name} {last_name}!"
# 默认参数
def connect(host="localhost", port=3306):
return f"Connecting to {host}:{port}"
# 可变参数 (*args)
def sum_numbers(*numbers):
return sum(numbers)
# 关键字可变参数 (**kwargs)
def print_info(**info):
for key, value in info.items():
print(f"{key}: {value}")
2. 函数调用
# 基本调用
result = add(1, 2)
# 使用关键字参数
greet(last_name="Zhang", first_name="San")
# 混合使用位置参数和关键字参数
connect("127.0.0.1", port=8080)
# 使用可变参数
sum_numbers(1, 2, 3, 4, 5)
# 使用关键字可变参数
print_info(name="张三", age=25, city="北京")
3. 高级特性
3.1 装饰器
# 简单装饰器
def log_function(func):
def wrapper(*args, **kwargs):
print(f"调用函数: {func.__name__}")
result = func(*args, **kwargs)
print(f"函数返回: {result}")
return result
return wrapper
# 使用装饰器
@log_function
def add(x, y):
return x + y
# 带参数的装饰器
def repeat(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f"Hello, {name}!")
3.2 闭包
def counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
# 使用闭包
my_counter = counter()
print(my_counter()) # 1
print(my_counter()) # 2
3.3 lambda 函数
# 简单的 lambda 函数
square = lambda x: x**2
# 在排序中使用
students = [("张三", 85), ("李四", 92), ("王五", 78)]
sorted_students = sorted(students, key=lambda x: x[1], reverse=True)
# 在函数式编程中使用
numbers = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x**2, numbers))
evens = list(filter(lambda x: x % 2 == 0, numbers))
4. 作用域和命名空间
# 全局变量和局部变量
global_var = 100
def func():
local_var = 200
print(global_var) # 可以访问全局变量
print(local_var) # 局部变量
# 使用 global 关键字
def modify_global():
global global_var
global_var = 300
# 使用 nonlocal 关键字
def outer():
x = 100
def inner():
nonlocal x
x = 200
inner()
return x
5. 函数式编程
# map 函数
numbers = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x**2, numbers))
# filter 函数
evens = list(filter(lambda x: x % 2 == 0, numbers))
# reduce 函数
from functools import reduce
sum_all = reduce(lambda x, y: x + y, numbers)
# 列表推导式替代
squares = [x**2 for x in numbers]
evens = [x for x in numbers if x % 2 == 0]
6. 实用示例
6.1 缓存装饰器
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
# 自定义缓存装饰器
def cache_decorator(func):
cache = {}
def wrapper(*args):
if args in cache:
return cache[args]
result = func(*args)
cache[args] = result
return result
return wrapper
6.2 参数验证
def validate_params(func):
def wrapper(*args, **kwargs):
# 验证参数
if len(args) < 1:
raise ValueError("缺少必要参数")
# 类型检查
if not isinstance(args[0], (int, float)):
raise TypeError("参数类型错误")
return func(*args, **kwargs)
return wrapper
@validate_params
def calculate_square(number):
return number ** 2
注意事项
- 函数名应该清晰地表明其功能
- 遵循单一职责原则,一个函数只做一件事
- 适当使用文档字符串说明函数功能
- 注意参数的默认值是在函数定义时计算的
- 避免修改可变类型的默认参数
常见错误处理
# 参数错误处理
def divide(x, y):
try:
return x / y
except ZeroDivisionError:
print("除数不能为零")
return None
except TypeError:
print("参数类型错误")
return None
# 参数验证
def process_age(age):
if not isinstance(age, int):
raise TypeError("年龄必须是整数")
if age < 0 or age > 150:
raise ValueError("年龄超出有效范围")
return age