课程 8:Python 中的函数

📚 学习目标

函数编程简介:
函数是Python编程的核心概念,它允许我们将代码组织成可重用的块。函数不仅可以提高代码的可读性和维护性,还能实现代码的模块化和复用。本课程将系统学习Python函数的定义、调用、参数传递、返回值等核心概念。

1. 函数基础概念

1.1 什么是函数

函数是一段可重用的代码块,它接受输入(参数),执行特定的操作,并返回结果。函数的主要作用是:

1.2 函数的基本结构

def function_name(parameters):
    """文档字符串:描述函数的功能"""
    # 函数体:具体的代码逻辑
    return result  # 返回值(可选)

🔍 函数结构说明

2. 函数定义与调用

2.1 简单函数示例

# 定义一个简单的问候函数
def greet():
    """打印问候语"""
    print("Hello, World!")

# 调用函数
greet()  # 输出: Hello, World!

2.2 带参数的函数

# 带参数的函数
def greet_person(name):
    """向指定的人打招呼"""
    print(f"Hello, {name}!")

# 调用函数
greet_person("Alice")  # 输出: Hello, Alice!
greet_person("Bob")    # 输出: Hello, Bob!

2.3 带返回值的函数

# 计算两个数的和
def add_numbers(a, b):
    """计算两个数的和"""
    result = a + b
    return result

# 调用函数并获取返回值
sum_result = add_numbers(5, 3)
print(sum_result)  # 输出: 8

# 直接在表达式中使用函数
print(add_numbers(10, 20))  # 输出: 30

3. 函数参数详解

3.1 位置参数

def describe_person(name, age, city):
    """描述一个人的基本信息"""
    print(f"{name} is {age} years old and lives in {city}.")

# 按位置传递参数
describe_person("Alice", 25, "Beijing")
# 输出: Alice is 25 years old and lives in Beijing.

3.2 关键字参数

# 使用关键字参数,顺序可以改变
describe_person(age=30, name="Bob", city="Shanghai")
# 输出: Bob is 30 years old and lives in Shanghai.

3.3 默认参数

def greet_with_title(name, title="Mr."):
    """带默认参数的问候函数"""
    print(f"Hello, {title} {name}!")

# 使用默认参数
greet_with_title("Smith")  # 输出: Hello, Mr. Smith!

# 覆盖默认参数
greet_with_title("Johnson", "Dr.")  # 输出: Hello, Dr. Johnson!

3.4 可变参数

# *args:接收任意数量的位置参数
def sum_all(*args):
    """计算所有参数的和"""
    total = 0
    for num in args:
        total += num
    return total

print(sum_all(1, 2, 3, 4, 5))  # 输出: 15
print(sum_all(10, 20))         # 输出: 30

# **kwargs:接收任意数量的关键字参数
def print_info(**kwargs):
    """打印所有关键字参数"""
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="Alice", age=25, city="Beijing")
# 输出:
# name: Alice
# age: 25
# city: Beijing

4. 返回值详解

4.1 基本返回值

def get_square(x):
    """返回一个数的平方"""
    return x ** 2

result = get_square(5)
print(result)  # 输出: 25

4.2 多个返回值

def get_min_max(numbers):
    """返回列表中的最小值和最大值"""
    if not numbers:
        return None, None
    return min(numbers), max(numbers)

min_val, max_val = get_min_max([3, 1, 4, 1, 5, 9, 2, 6])
print(f"最小值: {min_val}, 最大值: {max_val}")
# 输出: 最小值: 1, 最大值: 9

4.3 条件返回值

def check_number(num):
    """检查数字的性质"""
    if num > 0:
        return "正数"
    elif num < 0:
        return "负数"
    else:
        return "零"

print(check_number(5))   # 输出: 正数
print(check_number(-3))  # 输出: 负数
print(check_number(0))   # 输出: 零

5. 变量作用域

5.1 局部变量与全局变量

# 全局变量
global_var = "我是全局变量"

def test_scope():
    # 局部变量
    local_var = "我是局部变量"
    print(f"函数内访问全局变量: {global_var}")
    print(f"函数内访问局部变量: {local_var}")

test_scope()
print(f"函数外访问全局变量: {global_var}")
# print(local_var)  # 错误!局部变量在函数外不可访问

5.2 global关键字

counter = 0

def increment_counter():
    global counter  # 声明使用全局变量
    counter += 1
    print(f"计数器: {counter}")

increment_counter()  # 输出: 计数器: 1
increment_counter()  # 输出: 计数器: 2
increment_counter()  # 输出: 计数器: 3

6. 函数的高级特性

6.1 lambda函数(匿名函数)

# 普通函数
def square(x):
    return x ** 2

# 等价的lambda函数
square_lambda = lambda x: x ** 2

print(square(5))        # 输出: 25
print(square_lambda(5)) # 输出: 25

# lambda函数常用于排序
names = ["Alice", "Bob", "Charlie", "David"]
sorted_names = sorted(names, key=lambda name: len(name))
print(sorted_names)  # 输出: ['Bob', 'Alice', 'David', 'Charlie']

6.2 函数作为参数

def apply_operation(func, x, y):
    """应用指定的操作函数"""
    return func(x, y)

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

def multiply(a, b):
    return a * b

# 传递函数作为参数
result1 = apply_operation(add, 5, 3)
result2 = apply_operation(multiply, 5, 3)

print(result1)  # 输出: 8
print(result2)  # 输出: 15

6.3 嵌套函数

def outer_function(x):
    """外部函数"""
    def inner_function(y):
        """内部函数"""
        return x + y  # 可以访问外部函数的变量
    return inner_function

# 创建闭包
add_five = outer_function(5)
result = add_five(3)
print(result)  # 输出: 8

7. 实际应用案例

7.1 计算器函数

def calculator(operation, a, b):
    """简单的计算器函数"""
    if operation == "add":
        return a + b
    elif operation == "subtract":
        return a - b
    elif operation == "multiply":
        return a * b
    elif operation == "divide":
        if b != 0:
            return a / b
        else:
            return "错误:除数不能为零"
    else:
        return "错误:不支持的操作"

# 测试计算器
print(calculator("add", 10, 5))      # 输出: 15
print(calculator("multiply", 4, 6))  # 输出: 24
print(calculator("divide", 15, 3))   # 输出: 5.0

7.2 数据验证函数

def validate_email(email):
    """验证邮箱格式"""
    if "@" in email and "." in email:
        return True
    return False

def validate_age(age):
    """验证年龄范围"""
    try:
        age_num = int(age)
        if 0 <= age_num <= 150:
            return True
        return False
    except ValueError:
        return False

# 测试验证函数
emails = ["test@example.com", "invalid-email", "user@domain"]
for email in emails:
    print(f"{email}: {'有效' if validate_email(email) else '无效'}")

ages = ["25", "200", "abc", "-5"]
for age in ages:
    print(f"年龄 {age}: {'有效' if validate_age(age) else '无效'}")

7.3 列表处理函数

def filter_even_numbers(numbers):
    """过滤出偶数"""
    return [num for num in numbers if num % 2 == 0]

def find_max_min(numbers):
    """找到最大值和最小值"""
    if not numbers:
        return None, None
    return max(numbers), min(numbers)

def calculate_average(numbers):
    """计算平均值"""
    if not numbers:
        return 0
    return sum(numbers) / len(numbers)

# 测试列表处理函数
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_nums = filter_even_numbers(numbers)
max_val, min_val = find_max_min(numbers)
avg_val = calculate_average(numbers)

print(f"原列表: {numbers}")
print(f"偶数: {even_nums}")
print(f"最大值: {max_val}, 最小值: {min_val}")
print(f"平均值: {avg_val}")

8. 函数编程最佳实践

8.1 函数命名规范

8.2 文档字符串规范

def calculate_area(length, width):
    """
    计算矩形的面积
    
    参数:
        length (float): 矩形的长度
        width (float): 矩形的宽度
    
    返回:
        float: 矩形的面积
    
    示例:
        >>> calculate_area(5.0, 3.0)
        15.0
    """
    return length * width

8.3 错误处理

def safe_divide(a, b):
    """安全除法函数"""
    try:
        return a / b
    except ZeroDivisionError:
        print("错误:除数不能为零")
        return None
    except TypeError:
        print("错误:参数类型不正确")
        return None

# 测试错误处理
print(safe_divide(10, 2))   # 输出: 5.0
print(safe_divide(10, 0))   # 输出: 错误:除数不能为零
print(safe_divide("10", 2)) # 输出: 错误:参数类型不正确

📋 函数编程要点总结

作业8:Python函数综合练习

基础练习:
1. 编写一个函数,计算两个数的最大公约数。

2. 创建一个函数,判断一个数是否为素数。

参数练习:
3. 编写一个函数,接受任意数量的数字参数,返回它们的平均值。

4. 创建一个函数,使用默认参数和关键字参数。

返回值练习:
5. 编写一个函数,返回斐波那契数列的前n项。

6. 创建一个函数,返回字符串中每个字符的出现次数。

高级练习:
7. 使用lambda函数重写一些简单的函数。

8. 编写一个装饰器函数,用于计算函数执行时间。

实际应用:
9. 创建一个简单的银行账户管理系统,包含存款、取款、查询余额等功能。

10. 编写一个学生成绩管理系统,包含添加成绩、计算平均分、查找最高分等功能。

综合练习:
11. 实现一个简单的计算器程序,支持基本的数学运算。

12. 创建一个文件处理程序,包含读取、写入、复制文件等功能。

提交要求:
- 所有函数必须包含详细的文档字符串 - 遵循Python编码规范 - 提供测试用例和运行结果 - 说明函数的设计思路和实现方法 - 对于复杂的函数,请说明参数和返回值的含义