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

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

🎯 总结一句话

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

Copyright © 2022 破界远征沙盒工坊 All Rights Reserved.