第31集:函数定义与调用

学习目标

  • 理解什么是函数
  • 掌握函数的定义语法
  • 学会调用函数
  • 理解函数的作用和优势

一、什么是函数?

函数是一段可重复使用的代码块,用于完成特定的功能。使用函数可以:

  • 避免代码重复:相同的功能只需写一次
  • 提高代码可读性:给代码块起个有意义的名字
  • 便于维护:修改函数定义,所有调用处都会生效
  • 模块化编程:将复杂问题分解为小任务

生活类比

  • 函数就像菜谱:按步骤执行,做一道菜
  • 调用函数就像使用菜谱做饭
  • 参数就是食材
  • 返回值就是做好的菜

二、函数定义的语法

基本语法结构

def 函数名(参数列表):
    """文档字符串:函数的说明"""
    # 函数体
    # 代码块
    return 返回值

语法说明

元素 说明
def 定义函数的关键字(define的缩写)
函数名 函数的标识符,遵循变量命名规则
() 圆括号,包含参数(可以为空)
: 冒号,表示函数定义的开始
缩进 函数体必须缩进(通常4个空格)
return 返回语句,可省略

三、定义第一个函数

示例1:无参无返回值的函数

# 定义一个简单的问候函数
def say_hello():
    """打印一句问候语"""
    print("你好,欢迎学习Python!")

# 调用函数
say_hello()  # 输出:你好,欢迎学习Python!

示例2:有参数的函数

# 定义带参数的函数
def greet(name):
    """向指定的人问好"""
    print(f"你好,{name}!")

# 调用函数
greet("小明")  # 输出:你好,小明!
greet("小红")  # 输出:你好,小红!

示例3:有返回值的函数

# 定义有返回值的函数
def add(a, b):
    """计算两个数的和"""
    return a + b

# 调用函数并接收返回值
result = add(3, 5)
print(result)  # 输出:8

四、函数的完整示例

示例4:计算矩形面积

def calculate_area(width, height):
    """
    计算矩形的面积
    
    参数:
        width (float): 矩形的宽度
        height (float): 矩形的高度
        
    返回:
        float: 矩形的面积
    """
    area = width * height
    return area

# 调用函数
area1 = calculate_area(5, 3)
print(f"矩形面积:{area1}")

area2 = calculate_area(10, 8)
print(f"矩形面积:{area2}")

示例5:判断数字的正负

def check_number(num):
    """判断数字是正数、负数还是零"""
    if num > 0:
        return "正数"
    elif num < 0:
        return "负数"
    else:
        return "零"

# 测试函数
print(check_number(10))   # 输出:正数
print(check_number(-5))   # 输出:负数
print(check_number(0))    # 输出:零

五、函数调用的规则

1. 必须先定义后调用

# ❌ 错误示例:先调用后定义
say_hi()  # 报错:函数未定义

def say_hi():
    print("Hi!")
# ✅ 正确示例:先定义后调用
def say_hi():
    print("Hi!")

say_hi()  # 正常执行

2. 调用时参数数量要匹配

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

# ✅ 正确调用
result = add(3, 5)

# ❌ 错误调用
add(3)      # 报错:缺少参数
add(3, 5, 7)  # 报错:参数过多

3. 函数名区分大小写

def SayHello():
    print("Hello")

def sayhello():
    print("hi")

SayHello()   # 调用第一个函数
sayhello()   # 调用第二个函数

六、函数的文档字符串(Docstring)

什么是文档字符串

文档字符串是函数第一个未赋值的字符串,用于说明函数的功能。

def calculate_circle_area(radius):
    """
    计算圆的面积
    
    这个函数接收圆的半径作为参数,
    返回圆的面积。使用公式:πr²
    
    参数:
        radius (float): 圆的半径,必须为正数
        
    返回:
        float: 圆的面积
        
    示例:
        >>> calculate_circle_area(5)
        78.53981633974483
    """
    import math
    return math.pi * radius ** 2

查看文档字符串

print(calculate_circle_area.__doc__)

七、实际应用案例

案例1:温度转换器

def celsius_to_fahrenheit(celsius):
    """将摄氏度转换为华氏度"""
    return celsius * 9/5 + 32

def fahrenheit_to_celsius(fahrenheit):
    """将华氏度转换为摄氏度"""
    return (fahrenheit - 32) * 5/9

# 使用温度转换函数
c_temp = 25
f_temp = celsius_to_fahrenheit(c_temp)
print(f"{c_temp}°C = {f_temp}°F")

f_temp = 77
c_temp = fahrenheit_to_celsius(f_temp)
print(f"{f_temp}°F = {c_temp}°C")

案例2:计算器函数

def calculator(num1, num2, operation):
    """
    简单计算器
    
    参数:
        num1: 第一个数
        num2: 第二个数
        operation: 运算符(+、-、*、/)
        
    返回:
        计算结果
    """
    if operation == '+':
        return num1 + num2
    elif operation == '-':
        return num1 - num2
    elif operation == '*':
        return num1 * num2
    elif operation == '/':
        if num2 != 0:
            return num1 / num2
        else:
            return "错误:除数不能为零"
    else:
        return "错误:不支持的运算符"

# 测试计算器
print(calculator(10, 5, '+'))  # 输出:15
print(calculator(10, 5, '-'))  # 输出:5
print(calculator(10, 5, '*'))  # 输出:50
print(calculator(10, 5, '/'))  # 输出:2.0

八、常见错误与注意事项

错误1:忘记冒号

# ❌ 错误
def say_hello()  # 缺少冒号
    print("Hello")

错误2:函数体没有缩进

# ❌ 错误
def say_hello():
print("Hello")  # 没有缩进

错误3:函数名使用了关键字

# ❌ 错误
def def():
    print("Hello")  # def是关键字,不能作函数名

正确的函数命名

  • 使用小写字母和下划线
  • 描述性强,能表达函数的功能
  • 动词开头(如:get、set、calculate、check等)
# ✅ 好的函数名
def get_user_info():
    pass

def calculate_average():
    pass

def is_valid():
    pass

九、小结

知识点 说明
函数定义 使用def关键字
函数调用 使用函数名加括号
参数 函数的输入
返回值 函数的输出
文档字符串 说明函数功能
缩进 函数体必须缩进

十、课后练习

练习1

定义一个函数max_of_two(a, b),返回两个数中的较大值。

练习2

定义一个函数is_even(n),判断一个数是否是偶数,返回TrueFalse

练习3

定义一个函数calculate_bmi(height, weight),计算BMI指数。

  • BMI = 体重 / 身高²

练习4

定义一个函数grade_to_level(score),将分数转换为等级:

  • 90-100:优秀
  • 80-89:良好
  • 70-79:中等
  • 60-69:及格
  • 0-59:不及格

练习5

定义一个函数print_multiplication_table(n),打印n的乘法表。

« 上一篇 数据结构综合练习 下一篇 » 函数参数-位置参数