Skip to content

第六章:函数

定义函数

函数就像一台"自动售货机"——你投入原料(参数),它吐出结果(返回值)。把重复的代码封装成函数,可以让你的代码更整洁。

bash
# 基本函数定义
def greet(name):
    """向某人打招呼(这是文档字符串 docstring)"""
    return f"你好,{name}!欢迎学习 Python!"

message = greet("小明")
print(message)

# 查看文档字符串
print(greet.__doc__)
bash
你好,小明!欢迎学习 Python!
向某人打招呼(这是文档字符串 docstring)

参数类型详解

bash
# 1. 位置参数
def add(a, b):
    return a + b

print(f"10 + 20 = {add(10, 20)}")

# 2. 关键字参数(可以不按顺序)
def profile(name, age, city):
    return f"{name},{age}岁,来自{city}"

print(profile(age=25, city="北京", name="小红"))

# 3. 默认参数
def power(base, exponent=2):
    return base ** exponent

print(f"2的3次方 = {power(2, 3)}")
print(f"5的平方 = {power(5)}")  # 使用默认值

# 4. 可变参数 *args(接收任意数量的位置参数,打包成元组)
def total(*args):
    print(f"  收到的参数:{args}")
    return sum(args)

print(f"总和 = {total(1, 2, 3, 4, 5)}")

# 5. 关键字可变参数 **kwargs(打包成字典)
def show_info(**kwargs):
    for key, value in kwargs.items():
        print(f"  {key}: {value}")

show_info(name="小明", age=18, hobby="编程")
bash
10 + 20 = 30
小红,25岁,来自北京
2的3次方 = 8
5的平方 = 25
  收到的参数:(1, 2, 3, 4, 5)
总和 = 15
  name: 小明
  age: 18
  hobby: 编程

lambda 匿名函数

bash
# lambda 是一行的小函数
square = lambda x: x ** 2
print(f"3的平方 = {square(3)}")

# 常与 sorted、map、filter 等搭配使用
students = [("小明", 85), ("小红", 92), ("小刚", 78)]

# 按成绩排序
sorted_students = sorted(students, key=lambda s: s[1], reverse=True)
print(f"成绩排名:{sorted_students}")

# map:对每个元素应用函数
numbers = [1, 2, 3, 4, 5]
doubled = list(map(lambda x: x * 2, numbers))
print(f"翻倍:{doubled}")

# filter:筛选元素
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(f"偶数:{evens}")
bash
3的平方 = 9
成绩排名:[('小红', 92), ('小明', 85), ('小刚', 78)]
翻倍:[2, 4, 6, 8, 10]
偶数:[2, 4]

装饰器(Decorator)

装饰器就像给函数"穿衣服"——不改变函数本身,但给它增加额外功能(比如计时、日志、权限检查)。

bash
import time

# 定义一个计时装饰器
def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        elapsed = time.time() - start
        print(f"  ⏱️ {func.__name__} 执行耗时:{elapsed:.4f}秒")
        return result
    return wrapper

# 使用装饰器:用 @ 语法
@timer
def slow_function(n):
    """一个故意变慢的函数"""
    total = 0
    for i in range(n):
        total += i
    return total

result = slow_function(1_000_000)
print(f"计算结果:{result}")
bash
⏱️ slow_function 执行耗时:0.0512秒
计算结果:499999500000