30天学会Python编程:6.Python函数编程完全指南
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
|
calculate_area | ||
radius | ||
return 3.14 * radius**2 | ||
78.5 | ||
"""计算圆面积""" |
文档字符串使用建议:
help(function_name)
访问def greet(name):
"""返回个性化问候语
Args:
name (str): 用户名
Returns:
str: 问候字符串
"""
return f"Hello, {name.capitalize()}!"
# 调用示例
print(greet("alice")) # Hello, Alice!
函数设计原则:
四种参数类型:
参数组合顺序:
def func(positional, keyword=value, *args, **kwargs):
pass
参数传递规则:
*args
收集多余位置参数**kwargs
收集多余关键字参数# 位置参数
defpower(base, exponent):
return base ** exponent
# 关键字参数(提高可读性)
print(power(exponent=3, base=2)) # 8
# 默认参数(提供缺省值)
defconnect(host, port=3306, timeout=10):
print(f"连接到 {host}:{port}, 超时:{timeout}s")
# 可变位置参数(*args)
defsum_numbers(*numbers):
returnsum(numbers)
# 可变关键字参数(**kwargs)
defbuild_profile(**info):
for key, value in info.items():
print(f"{key}: {value}")
默认参数陷阱:
# 错误示例:可变对象作为默认参数
def append_to(element, target=[]):
target.append(element)
return target
# 正确做法
def append_to(element, target=None):
if target is None:
target = []
target.append(element)
return target
# 列表/元组解包为位置参数
args = [3, 4]
print(power(*args)) # 81
# 字典解包为关键字参数
kwargs = {"base": 2, "exponent": 5}
print(power(**kwargs)) # 32
解包应用场景:
多返回值实现:
def analyze_number(n):
"""返回数字的平方、立方和绝对值"""
return n**2, n**3, abs(n)
# 元组解包接收多个返回值
square, cube, absolute = analyze_number(-3)
返回函数(高阶函数):
def create_multiplier(factor):
"""创建乘法器函数"""
def multiplier(x):
return x * factor
return multiplier
double = create_multiplier(2)
print(double(5)) # 10
返回值最佳实践:
None
,考虑使用空对象模式LEGB规则:
作用域示例:
x = "global"
def outer():
x = "enclosing"
def inner():
x = "local"
print(x) # local
inner()
print(x) # enclosing
outer()
print(x) # global
作用域管理:
global
声明全局变量nonlocal
修改闭包变量numbers = [1, 2, 3, 4]
# map: 应用函数到每个元素
squares = list(map(lambda x: x**2, numbers))
# filter: 过滤满足条件的元素
evens = list(filter(lambda x: x%2==0, numbers))
# reduce: 累积计算(需导入)
from functools import reduce
product = reduce(lambda x,y: x*y, numbers)
函数式编程优势:
def apply_operation(func, a, b):
"""应用指定操作到两个数"""
return func(a, b)
# 使用匿名函数
result = apply_operation(lambda x,y: x+y, 3, 4) # 7
# 使用预定义函数
import operator
result = apply_operation(operator.mul, 3, 4) # 12
回调函数应用场景:
def counter():
"""闭包实现计数器"""
count = 0
def increment():
nonlocal count # 声明非局部变量
count += 1
return count
return increment
c = counter()
print(c(), c(), c()) # 1 2 3
闭包本质:
简单装饰器:
def timer(func):
"""测量函数执行时间"""
import time
defwrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__}执行耗时: {end-start:.4f}s")
return result
return wrapper
@timer # 装饰器语法糖
deflong_running_task(n):
returnsum(i*i for i inrange(n))
带参数装饰器:
def repeat(times):
"""重复执行函数"""
defdecorator(func):
defwrapper(*args, **kwargs):
for _ inrange(times-1):
func(*args, **kwargs)
return func(*args, **kwargs) # 返回最后一次结果
return wrapper
return decorator
@repeat(3)
defsay_hello():
print("Hello!")
装饰器最佳实践:
functools.wraps
保留元信息from functools import partial, lru_cache
# 偏函数:固定部分参数
square_root = partial(power, exponent=0.5)
print(square_root(9)) # 3.0
# 缓存装饰器:优化递归函数
@lru_cache(maxsize=128)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
functools实用工具:
reduce:累积计算
cmp_to_key:旧式比较函数转换
total_ordering:自动生成比较方法
singledispatch:函数重载
def fibonacci_sequence(limit):
"""生成斐波那契数列"""
a, b = 0, 1
while a < limit:
yield a # 产出值并暂停
a, b = b, a + b
# 惰性求值,节省内存
print(list(fibonacci_sequence(100)))
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
生成器优势:
def data_pipeline():
"""数据处理管道示例"""
raw_data = ["10", "20", "30", "abc", "40"]
# 处理步骤链
steps = [
lambda data: map(str.strip, data), # 去空格
lambda data: filter(str.isdigit, data), # 过滤数字
lambda data: map(int, data), # 转整数
lambda data: map(lambda x: x*2, data), # 数值加倍
list # 转为列表
]
data = raw_data
for step in steps:
data = step(data)
print(f"当前结果: {data}")
return data
print("最终结果:", data_pipeline())
函数式管道优势:
def permission_required(permission):
"""权限检查装饰器"""
defdecorator(func):
defwrapper(user, *args, **kwargs):
# 检查权限位
if user.get("permissions", 0) & permission != permission:
raise PermissionError("权限不足")
return func(user, *args, **kwargs)
return wrapper
return decorator
# 权限定义
READ = 0b0001
WRITE = 0b0010
DELETE = 0b0100
ADMIN = 0b1000
@permission_required(READ | WRITE)
defedit_document(user, document):
print(f"{user['name']}正在编辑{document}")
# 使用示例
user = {"name": "Alice", "permissions": READ | WRITE}
edit_document(user, "重要文件") # 正常执行
装饰器应用场景:
学习路径建议:
函数基础:
def
定义函数,return
返回值参数处理:
*args
, **kwargs
)作用域管理:
global
和nonlocal
谨慎修改作用域高阶函数:
map
filter
/reduce
应用装饰器:
@functools.wraps
保留元信息函数式工具:
functools.partial
functools.lru_cache
协程与异步:
async
await
语法元编程:
inspect
模块)函数式进阶:
类型系统:
可变默认参数:
# 错误
def add_item(item, items=[]):
items.append(item)
return items
# 正确
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
闭包变量绑定:
# 错误:所有函数共享i
funcs = [lambda: i for i in range(3)]
# 正确:创建闭包捕获当前值
funcs = [lambda i=i: i for i in range(3)]
装饰器元信息丢失:
from functools import wraps
def decorator(func):
@wraps(func) # 保留原始函数信息
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
生成器状态耗尽:
gen = (x for x in range(3))
print(list(gen)) # [0, 1, 2]
print(list(gen)) # [] 生成器已耗尽
# 解决方案:重新创建生成器
掌握Python函数编程是成为Python开发必须要掌握的知识。通过理解函数基础、参数传递、作用域管理,再到高阶函数和装饰器应用,我们将能够编写更简洁、高效且可维护的代码。
阅读原文:原文链接