🪄 初学者写函数只会
def
,高手写函数像“造魔法书”——今天我们来实战这些魔法!
✅ 本文目标
- 掌握
*args
和**kwargs
- 理解函数返回值策略
- 构建一个万能
log()
装饰器 - 写一个可配置的“简易计算器”
🧩 一、可变参数:让函数更灵活!
🎯 *args
:接收任意个位置参数
def add_all(*args):
print(args) # 是一个 tuple
return sum(args)
print(add_all(1, 2, 3)) # 6
print(add_all(10, 20, 30)) # 60
🎯 **kwargs
:接收任意个“命名参数”
def print_info(**kwargs):
for k, v in kwargs.items():
print(f"{k}: {v}")
print_info(name="Tom", age=18)
# name: Tom
# age: 18
💥 二、返回值的设计思维
✅ 返回单个值
def square(x):
return x * x
✅ 返回多个值(元组)
def get_user_info():
return "张三", 18
name, age = get_user_info()
✅ 返回字典(推荐风格)
def get_user():
return {"name": "李四", "age": 20}
这更适合后期扩展、代码可读性强。
🔧 三、实战:打造一个 log()
装饰器
自动打印函数的调用和返回信息,让调试更优雅
def log(func):
def wrapper(*args, **kwargs):
print(f"[LOG] 正在调用 {func.__name__},参数是:{args}, {kwargs}")
result = func(*args, **kwargs)
print(f"[LOG] {func.__name__} 返回值是:{result}")
return result
return wrapper
用法示例:
@log
def multiply(x, y):
return x * y
multiply(3, 5)
输出:
🧠 四、实战:构建一个可扩展计算器
def calc(op, *args):
if op == 'add':
return sum(args)
elif op == 'mul':
result = 1
for a in args:
result *= a
return result
elif op == 'avg':
return sum(args) / len(args)
else:
return "不支持的操作"
print(calc('add', 1, 2, 3)) # 6
print(calc('mul', 2, 3, 4)) # 24
print(calc('avg', 10, 20, 30)) # 20.0
✅ Bonus:加入 **kwargs
设置选项
def calc(op, *args, **kwargs):
precision = kwargs.get("precision", 2)
if op == 'avg':
avg = sum(args) / len(args)
return round(avg, precision)
return "只支持 avg 演示"
print(calc("avg", 1, 2, 3, precision=3)) # 2.0 → 2.000
💡 进阶挑战
- 把
log()
装饰器改成可以接收参数(比如加时间戳) - 让
calc()
支持 lambda 表达式作为操作符 - 封装成模块:
from tools import calc
🎯 总结一句话
会写函数的是程序员,会写“万能函数”的,是架构师。