4、5 分钟掌握函数背后的魔法:可变参数与返回策略

0 阅读2分钟

🪄 初学者写函数只会 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)

输出:

image.png


🧠 四、实战:构建一个可扩展计算器

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

💡 进阶挑战

  1. log() 装饰器改成可以接收参数(比如加时间戳)
  2. calc() 支持 lambda 表达式作为操作符
  3. 封装成模块:from tools import calc

🎯 总结一句话

会写函数的是程序员,会写“万能函数”的,是架构师。