第36集:返回值与return语句

学习目标

  • 理解函数返回值的概念
  • 掌握return语句的使用方法
  • 学会返回多个值
  • 理解None类型和隐式返回
  • 掌握返回值的应用场景

一、什么是函数返回值?

返回值是函数执行完成后返回给调用者的结果。

基本语法

def 函数名(参数):
    # 函数体
    return 返回值

生活类比

  • 函数就像一台"加工机器"
  • 参数是"原材料"
  • 返回值是"加工后的产品"
# 例如:豆浆机(函数)
def make_soybean_milk(beans):
    # 加工过程
    milk = "豆浆"
    return milk  # 返回加工后的产品

result = make_soybean_milk("黄豆")  # 得到豆浆

二、return语句的基本用法

示例1:返回计算结果

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

sum_value = add(5, 3)
print(sum_value)  # 输出:8

示例2:返回字符串

def greet(name):
    """生成问候语"""
    return f"你好,{name}!"

message = greet("小明")
print(message)  # 输出:你好,小明!

示例3:返回布尔值

def is_even(number):
    """判断是否是偶数"""
    return number % 2 == 0

print(is_even(4))   # 输出:True
print(is_even(7))   # 输出:False

示例4:返回列表

def get_even_numbers(numbers):
    """获取列表中的偶数"""
    even_numbers = []
    for num in numbers:
        if num % 2 == 0:
            even_numbers.append(num)
    return even_numbers

result = get_even_numbers([1, 2, 3, 4, 5, 6, 7, 8])
print(result)  # 输出:[2, 4, 6, 8]

示例5:返回字典

def get_user_info(user_id):
    """获取用户信息"""
    users = {
        1: {"name": "小明", "age": 25},
        2: {"name": "小红", "age": 23}
    }
    return users.get(user_id, {})

info = get_user_info(1)
print(info)  # 输出:{'name': '小明', 'age': 25}

三、返回多个值

使用元组返回多个值

def calculate(a, b):
    """计算和、差、积、商"""
    return (a + b, a - b, a * b, a / b)

result = calculate(10, 3)
print(result)  # 输出:(13, 7, 30, 3.333...)

解包接收多个返回值

def calculate(a, b):
    """计算和、差、积、商"""
    return a + b, a - b, a * b, a / b  # 自动打包成元组

# 方式1:用元组接收
result = calculate(10, 3)
print(result)  # 输出:(13, 7, 30, 3.333...)

# 方式2:用多个变量接收(解包)
add_result, sub_result, mul_result, div_result = calculate(10, 3)
print(f"和:{add_result}")
print(f"差:{sub_result}")
print(f"积:{mul_result}")
print(f"商:{div_result:.2f}")

示例6:返回多个值的应用

def get_student_info():
    """获取学生信息"""
    name = "小明"
    age = 18
    score = 95
    grade = "A"
    return name, age, score, grade

# 解包接收
student_name, student_age, student_score, student_grade = get_student_info()
print(f"姓名:{student_name}")
print(f"年龄:{student_age}")
print(f"成绩:{student_score}")
print(f"等级:{student_grade}")

示例7:返回最小值和最大值

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

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

示例8:返回除法的商和余数

def divide(a, b):
    """返回商和余数"""
    quotient = a // b
    remainder = a % b
    return quotient, remainder

q, r = divide(17, 5)
print(f"商:{q},余数:{r}")  # 输出:商:3,余数:2

四、return语句的特性

特性1:执行return后立即退出函数

def test_return():
    print("语句1")
    return  # 立即退出函数
    print("语句2")  # 这句不会执行

test_return()
# 输出:语句1

特性2:可以没有返回值(返回None)

def say_hello(name):
    """打印问候语"""
    print(f"你好,{name}!")
    # 没有return语句,相当于返回None

result = say_hello("小明")
print(result)  # 输出:None

特性3:return后面可以没有值

def early_exit(value):
    """提前退出"""
    if value < 0:
        return  # 返回None
    return value * 2

print(early_exit(5))   # 输出:10
print(early_exit(-1))  # 输出:None

特性4:可以在不同位置使用return

def grade_to_letter(score):
    """分数转等级"""
    if score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    elif score >= 60:
        return "D"
    else:
        return "F"

print(grade_to_letter(95))  # 输出:A
print(grade_to_letter(85))  # 输出:B
print(grade_to_letter(55))  # 输出:F

五、None类型详解

什么是None?

None是Python中表示"无值"的特殊类型。

def no_return():
    """没有返回值的函数"""
    pass  # 相当于返回None

result = no_return()
print(result)      # 输出:None
print(type(result)) # 输出:<class 'NoneType'>

None的应用场景

# 场景1:查找失败
def find_item(items, target):
    """在列表中查找元素"""
    for i, item in enumerate(items):
        if item == target:
            return i  # 返回索引
    return None  # 未找到

result = find_item([1, 2, 3], 2)
print(result)  # 输出:1

result = find_item([1, 2, 3], 4)
print(result)  # 输出:None
# 场景2:条件判断
def get_value(key):
    """根据key获取值"""
    data = {"name": "小明", "age": 25}
    return data.get(key)  # 不存在时返回None

value = get_value("name")
if value is not None:
    print(f"找到值:{value}")
else:
    print("未找到值")

value = get_value("address")
if value is not None:
    print(f"找到值:{value}")
else:
    print("未找到值")
# 场景3:初始化变量
def process_data(data):
    """处理数据"""
    result = None  # 初始化为None
    
    if data:
        result = data.upper()
    
    return result if result else "无数据"

print(process_data("hello"))  # 输出:HELLO
print(process_data(""))      # 输出:无数据
print(process_data(None))    # 输出:无数据

六、返回值的应用场景

场景1:链式调用

class Calculator:
    def __init__(self, value=0):
        self.value = value
    
    def add(self, num):
        self.value += num
        return self  # 返回self,实现链式调用
    
    def multiply(self, num):
        self.value *= num
        return self
    
    def get_result(self):
        return self.value

# 链式调用
result = Calculator(5).add(3).multiply(2).get_result()
print(result)  # 输出:16  ((5 + 3) * 2 = 16)

场景2:嵌套函数调用

def square(x):
    """平方"""
    return x * x

def cube(x):
    """立方"""
    return x * x * x

def add(a, b):
    """相加"""
    return a + b

# 嵌套调用
result = add(square(3), cube(2))  # 3² + 2³ = 9 + 8 = 17
print(result)  # 输出:17

场景3:函数作为返回值

def get_operation(op):
    """返回操作函数"""
    if op == "add":
        def add(a, b):
            return a + b
        return add
    elif op == "multiply":
        def multiply(a, b):
            return a * b
        return multiply

# 获取加法函数
add_func = get_operation("add")
result = add_func(5, 3)
print(result)  # 输出:8

# 获取乘法函数
multiply_func = get_operation("multiply")
result = multiply_func(5, 3)
print(result)  # 输出:15

场景4:闭包函数

def make_multiplier(factor):
    """创建乘法器"""
    def multiplier(x):
        return x * factor
    return multiplier

# 创建乘以2的函数
times2 = make_multiplier(2)
print(times2(5))   # 输出:10

# 创建乘以10的函数
times10 = make_multiplier(10)
print(times10(5))  # 输出:50

七、实际应用案例

案例1:验证函数

def validate_username(username):
    """验证用户名"""
    # 检查长度
    if len(username) < 3 or len(username) > 15:
        return False, "用户名长度必须在3-15之间"
    
    # 检查字符
    if not username.isalnum():
        return False, "用户名只能包含字母和数字"
    
    return True, "用户名有效"

# 使用示例
username = "xiaoming123"
is_valid, message = validate_username(username)
print(f"用户名:{username}")
print(f"是否有效:{is_valid}")
print(f"消息:{message}")

案例2:数据处理管道

def clean_data(data):
    """清洗数据"""
    return data.strip()

def transform_data(data):
    """转换数据"""
    return data.upper()

def validate_data(data):
    """验证数据"""
    if len(data) > 0:
        return True, data
    else:
        return False, "数据为空"

def process_pipeline(raw_data):
    """数据处理管道"""
    # 步骤1:清洗
    cleaned = clean_data(raw_data)
    
    # 步骤2:转换
    transformed = transform_data(cleaned)
    
    # 步骤3:验证
    is_valid, result = validate_data(transformed)
    
    if is_valid:
        return True, result
    else:
        return False, "处理失败"

# 使用示例
raw_data = "  hello world  "
success, result = process_pipeline(raw_data)
print(f"原始数据:'{raw_data}'")
print(f"处理结果:'{result}'")
print(f"处理状态:{'成功' if success else '失败'}")

案例3:计算器程序

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

# 使用示例
result, error = calculator("+", 5, 3)
if error:
    print(f"错误:{error}")
else:
    print(f"结果:{result}")

result, error = calculator("/", 10, 0)
if error:
    print(f"错误:{error}")
else:
    print(f"结果:{result}")

案例4:文件操作

def read_file(filename):
    """读取文件内容"""
    try:
        with open(filename, 'r', encoding='utf-8') as f:
            content = f.read()
        return True, content
    except FileNotFoundError:
        return False, "文件不存在"
    except Exception as e:
        return False, f"读取错误:{e}"

def write_file(filename, content):
    """写入文件内容"""
    try:
        with open(filename, 'w', encoding='utf-8') as f:
            f.write(content)
        return True, "写入成功"
    except Exception as e:
        return False, f"写入错误:{e}"

# 使用示例
success, result = read_file("example.txt")
if success:
    print("文件内容:")
    print(result)
else:
    print(result)

success, result = write_file("output.txt", "Hello, World!")
if success:
    print(result)
else:
    print(result)

八、最佳实践

实践1:始终返回一致的数据类型

# ✅ 好的做法
def divide(a, b):
    """除法运算"""
    if b == 0:
        return None, "除数不能为零"
    return a / b, ""

# ❌ 不好的做法
def divide(a, b):
    """除法运算"""
    if b == 0:
        return "错误"
    return a / b  # 返回类型不一致

实践2:使用元组返回状态和结果

# ✅ 好的做法
def process_data(data):
    """处理数据"""
    if not data:
        return False, "数据为空"
    return True, data.upper()

# 使用
success, result = process_data("hello")
if success:
    print(result)
else:
    print(result)  # 这里是错误信息

实践3:文档说明返回值

def calculate_bmi(weight, height):
    """
    计算BMI指数
    
    参数:
        weight (float): 体重(kg)
        height (float): 身高(m)
    
    返回:
        tuple: (bmi_value, category)
            - bmi_value: BMI数值
            - category: 分类(偏瘦、正常、偏胖、肥胖)
    """
    bmi = weight / (height ** 2)
    
    if bmi < 18.5:
        category = "偏瘦"
    elif bmi < 24:
        category = "正常"
    elif bmi < 28:
        category = "偏胖"
    else:
        category = "肥胖"
    
    return bmi, category

实践4:避免在循环中多次返回

# ❌ 不好的做法
def find_number(numbers, target):
    """查找数字"""
    for num in numbers:
        if num == target:
            return True
        else:
            return False  # 错误的位置

# ✅ 好的做法
def find_number(numbers, target):
    """查找数字"""
    for num in numbers:
        if num == target:
            return True
    return False

九、常见错误与调试

错误1:忘记return语句

# ❌ 错误
def add(a, b):
    result = a + b
    # 忘记return,返回None

result = add(5, 3)
print(result)  # 输出:None

# ✅ 正确
def add(a, b):
    return a + b

错误2:return后面缺少返回值

# ❌ 错误(意图是返回值)
def calculate(a, b):
    return  # 只写了return,没有返回值
    a + b

result = calculate(5, 3)
print(result)  # 输出:None

# ✅ 正确
def calculate(a, b):
    return a + b

错误3:错误使用返回值

# ❌ 错误
def get_sum(numbers):
    total = 0
    for num in numbers:
        total += num
        return total  # 只返回第一个数

# ✅ 正确
def get_sum(numbers):
    total = 0
    for num in numbers:
        total += num
    return total  # 返回总和

调试技巧:打印返回值

def debug_function(x):
    """带调试信息的函数"""
    result = x * 2
    print(f"调试:函数返回值 = {result}")
    return result

# 调用函数
value = debug_function(5)
print(f"接收到的值:{value}")

十、小结

知识点 说明
return语句 用于返回函数结果
返回值类型 可以是任意类型(数字、字符串、列表、字典等)
多个返回值 使用元组返回,可以解包接收
None 表示"无值",常用于查找失败等情况
隐式返回 没有return语句时返回None
立即退出 执行return后立即退出函数

十一、课后练习

练习1

定义函数calculate_area(radius),计算圆的面积并返回结果。

练习2

定义函数get_stats(numbers),返回最小值、最大值、平均值三个值。

练习3

定义函数find_word(text, word),查找单词在文本中的位置,返回索引或None。

练习4

定义函数validate_password(password),验证密码强度,返回(is_valid, message)元组。

练习5

定义函数swap(a, b),交换两个变量的值,返回交换后的结果。

« 上一篇 函数参数-可变参数 下一篇 » 变量作用域