# Python 函数

# 函数定义

# 基本函数定义
def greet(name):
    return f"你好,{name}!"

# 带默认参数的函数
def greet_with_title(name, title="先生"):
    return f"你好,{title}{name}!"

# 可变参数函数
def sum_numbers(*args):
    return sum(args)

# 关键字参数函数
def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# 函数返回值

# 多返回值
def get_coordinates():
    return 10, 20

x, y = get_coordinates()

# 返回None
def do_nothing():
    pass

# 函数作用域

# 全局变量和局部变量
global_var = 10

def modify_global():
    global global_var
    global_var = 20

# 闭包
def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

# 装饰器

# 基本装饰器
def log_function(func):
    def wrapper(*args, **kwargs):
        print(f"调用函数: {func.__name__}")
        result = func(*args, **kwargs)
        print(f"函数执行完成")
        return result
    return wrapper

@log_function
def add(a, b):
    return a + b

# 带参数的装饰器
def repeat(times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(3)
def greet(name):
    print(f"Hello, {name}!")

# 生成器

# 生成器函数
def count_up_to(n):
    i = 1
    while i <= n:
        yield i
        i += 1

# 生成器表达式
squares = (x**2 for x in range(10))

# Lambda函数

# 基本lambda函数
square = lambda x: x**2

# 在高阶函数中使用
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))

# 递归函数

# 阶乘计算
def factorial(n):
    if n <= 1:
        return 1
    return n * factorial(n - 1)

# 斐波那契数列
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

# 最佳实践

  1. 函数设计

    • 遵循单一职责原则
    • 保持函数简短且功能明确
    • 使用有意义的函数名和参数名
  2. 参数处理

    • 合理使用默认参数
    • 注意可变默认参数的陷阱
    • 适当使用类型提示
  3. 装饰器使用

    • 用于横切关注点
    • 保持装饰器简单
    • 正确处理函数元数据
  4. 生成器应用

    • 处理大数据集
    • 实现惰性求值
    • 提高内存效率

# 练习题

  1. 实现一个缓存装饰器
  2. 编写生成器处理大文件
  3. 使用递归解决实际问题

# 下一步

学习Python的模块和包管理,了解如何组织更大的项目。