1. 函数是什么? #

# 定义加法函数,接收两个参数
def add(a, b):
    return a + b

# 调用函数并打印结果
print(add(3, 5))

2. 定义与调用 #

# 函数定义的基本结构
def function_name(参数1, 参数2):
    """文档字符串:说明用途(可选)"""
    # 函数体,缩进 4 空格
    return 结果   # 无 return 则返回 None
# 定义问候函数,只打印不返回值
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")

# 定义拼接姓名函数,返回字符串
def get_full_name(first, last):
    return f"{first}{last}"

3. 参数 #

3.1 位置参数与关键字参数 #

# 定义接收三个参数的用户信息函数
def user_info(name, age, city):
    print(name, age, city)

# 按位置传参
user_info("Lucy", 20, "Beijing")
# 按关键字传参,顺序可打乱
user_info(age=20, name="Lucy", city="Beijing")

3.2 默认参数 #

# msg 有默认值 "Hello"
def greet(name, msg="Hello"):
    print(f"{msg}, {name}!")

# 使用默认 msg
greet("Alice")
# 覆盖默认 msg
greet("Bob", msg="Hi")
# 正确:无默认值参数在前
def foo(a, b=1):
    pass
# def foo(a=1, b):  # 错误

3.3 *args 与 **kwargs #

# *args 接收位置参数,**kwargs 接收关键字参数
def log_call(*args, **kwargs):
    print("args:", args)
    print("kwargs:", kwargs)

log_call(1, 2, user_id=10, debug=True)

3.4 调用时解包 #

# 定义创建用户函数
def create_user(name, age, city):
    return {"name": name, "age": age, "city": city}

# 用户数据字典
data = {"name": "Alice", "age": 30, "city": "Beijing"}
# 用 ** 解包字典传参
create_user(**data)

4. 返回值 #

# 返回多个值实际是返回元组,可解包
def min_max(nums):
    return min(nums), max(nums)

# 解包接收两个返回值
low, high = min_max([3, 1, 9])

5. 变量作用域 #

类型 说明
局部 函数内赋值/定义的变量,出了函数就不可用
全局 模块顶层定义的变量
# 全局变量
count = 0

def increment():
    # 声明要修改全局变量
    global count
    count += 1

6. 传递参数 #

# 推荐写法:用参数和 return 传递数据
def add(a, b):
    return a + b

result = add(3, 4)

# 需要共享状态时,可以用类来保存
class Counter:
    def __init__(self):
        self.count = 0

    def increment(self):
        self.count += 1
        return self.count

counter = Counter()
print(counter.increment())
print(counter.increment())

# 不推荐:用 global 修改全局变量
value = 0
def bad_increment():
    global value
    value += 1

7. nonlocal #

def outer():
    x = 10
    def inner():
        # 声明 x 是外层的 x,不是新建局部变量
        nonlocal x
        x += 1
        return x
    inner()
    return x

print(outer())

8. 装饰器 #

# 模拟当前登录用户
current_user = {"username": "Alice", "is_authenticated": True}

def is_logged_in():
    # 检查当前用户是否已登录
    return current_user.get("is_authenticated", False)

def require_login(func):
    def wrapper(*args, **kwargs):
        print(f"检查用户 {current_user.get('username', '未知用户')} 是否已登录...")
        if not is_logged_in():
            print("用户未登录,操作被拒绝")
            raise PermissionError("请先登录")
        print("用户已登录,正在执行操作...")
        return func(*args, **kwargs)
    return wrapper

# 模拟帖子数据库
posts_db = {
    1: {"title": "第一篇文章", "author": "Alice"},
    2: {"title": "第二篇文章", "author": "Bob"}
}

@require_login
def delete_post(post_id):
    print(f"尝试删除ID为 {post_id} 的帖子...")
    if post_id in posts_db:
        deleted = posts_db.pop(post_id)
        print(f"帖子 '{deleted['title']}' 已被成功删除。")
        return True
    else:
        print(f"帖子ID {post_id} 不存在,无法删除。")
        return False

9. lambda #

# lambda 匿名函数语法:参数 : 表达式
lambda 参数1, 参数2, ... : 表达式
# 等价于带 return 的普通函数
def 函数名(参数1, 参数2, ...):
    return 表达式
# 定义 lambda 加法函数
add = lambda x, y: x + y
print(add(3, 5))
# 用户列表,按 score 字段排序
users = [{"name": "Alice", "score": 85}, {"name": "Bob", "score": 92}]
sorted(users, key=lambda u: u["score"])

10. 项目开发要点 #

11. 总结 #

概念 要点
定义调用 def / return / 缩进
参数 位置、关键字、默认值
可变参数 *args 元组、**kwargs 字典
解包调用 func(*seq)、func(**dict)
多返回值 元组 + 解包赋值
作用域 局部为主,慎用 global
装饰器 @decorator,Web 框架核心
lambda 简单 key=,不宜复杂