函数基础

学习如何创建可复用的代码块,理解函数的定义、调用和参数传递

1. 函数定义语法

函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。Python使用 def 关键字来定义函数。

# 基本函数定义语法
def 函数名(参数列表):
    """文档字符串"""
    函数体
    return 返回值
# 实际示例
def greet(name):
    """向用户打招呼"""
    message = f"你好,{name}!"
    return message

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

2. 函数命名规范

命名规则:

  • • 使用小写字母和下划线
  • • 名称应该具有描述性
  • • 避免使用Python关键字
  • • 遵循PEP 8命名规范

示例:

# 好的命名
def calculate_area(radius):
def get_user_name():
def is_valid_email(email):

# 不好的命名
def a():
def getUserName():
def CalculateArea():

3. 参数和返回值

位置参数

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

result = add_numbers(5, 3)  # a=5, b=3
print(result)  # 输出:8

默认参数

def greet(name, greeting="你好"):
    """自定义问候语"""
    return f"{greeting},{name}!"

print(greet("小明"))           # 输出:你好,小明!
print(greet("小红", "嗨"))     # 输出:嗨,小红!

关键字参数

def create_profile(name, age, city="北京"):
    """创建用户档案"""
    return f"姓名:{name},年龄:{age},城市:{city}"

# 使用关键字参数调用
profile = create_profile(name="张三", age=25, city="上海")
print(profile)

4. 作用域概念

Python中的作用域决定了变量的可见性。主要有两种作用域:全局作用域和局部作用域。

# 全局变量
user_name = "小明"

def show_user():
    # 局部变量
    local_name = "小红"
    print(f"局部变量:{local_name}")
    print(f"全局变量:{user_name}")

show_user()
print(user_name)  # 可以访问全局变量
# print(local_name)  # 错误!无法访问局部变量

故事化案例:智能餐厅点餐系统

场景:小王开了一家智能餐厅,需要开发一个点餐系统。系统需要处理菜单管理、订单计算、折扣应用等功能。让我们用函数来实现这些功能!

1. 菜单显示功能

def display_menu(menu_items):
    """显示菜单"""
    print("=== 智能餐厅菜单 ===")
    for index, (item, price) in enumerate(menu_items.items(), 1):
        print(f"{index}. {item} - ¥{price}")
    print("=" * 20)

# 使用示例
menu = {
    "宫保鸡丁": 28,
    "麻婆豆腐": 18,
    "糖醋里脊": 32,
    "清蒸鲈鱼": 45
}
display_menu(menu)

2. 计算订单总价

def calculate_total(order_items, menu):
    """计算订单总价"""
    total = 0
    for item, quantity in order_items.items():
        if item in menu:
            total += menu[item] * quantity
        else:
            print(f"警告:{item} 不在菜单中")
    return total

# 使用示例
order = {"宫保鸡丁": 2, "糖醋里脊": 1}
total = calculate_total(order, menu)
print(f"订单总价:¥{total}")

3. 应用折扣

def apply_discount(total, discount_rate=0.9):
    """应用折扣"""
    if total >= 100:
        discount = total * (1 - discount_rate)
        final_total = total * discount_rate
        print(f"满100减{discount:.0f}元优惠已应用!")
        return final_total
    else:
        print("订单未满100元,无折扣")
        return total

# 使用示例
final_amount = apply_discount(total)
print(f"最终支付:¥{final_amount:.0f}")

练习题(共6个)

练习题1:温度转换器

创建一个函数,将摄氏度转换为华氏度。公式:F = C × 9/5 + 32

要求:函数应该接受摄氏度作为参数,返回对应的华氏度。

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

# 测试
print(celsius_to_fahrenheit(0))    # 32.0
print(celsius_to_fahrenheit(25))   # 77.0
print(celsius_to_fahrenheit(-10))  # 14.0

练习题2:计算器函数

创建一个函数,接受两个数字和一个运算符(+、-、*、/),返回计算结果。

要求:处理除零错误,返回友好的错误信息。

def calculator(num1, num2, operator):
    """简单计算器"""
    if operator == '+':
        return num1 + num2
    elif operator == '-':
        return num1 - num2
    elif operator == '*':
        return num1 * num2
    elif operator == '/':
        if num2 == 0:
            return "错误:除数不能为零"
        return num1 / num2
    else:
        return "错误:无效的运算符"

# 测试
print(calculator(10, 5, '+'))  # 15
print(calculator(10, 0, '/'))  # 错误:除数不能为零

练习题3:列表平均值

创建一个函数,计算数字列表的平均值。如果列表为空,返回0。

def calculate_average(numbers):
    """计算数字列表的平均值"""
    if not numbers:  # 检查列表是否为空
        return 0
    return sum(numbers) / len(numbers)

# 测试
print(calculate_average([1, 2, 3, 4, 5]))  # 3.0
print(calculate_average([]))                # 0
print(calculate_average([100, 200]))       # 150.0

练习题4:密码验证器

创建一个函数,验证密码是否有效。有效密码要求:至少8个字符,包含至少一个数字和一个大写字母。

def validate_password(password):
    """验证密码是否有效"""
    if len(password) < 8:
        return False
    
    has_digit = any(char.isdigit() for char in password)
    has_upper = any(char.isupper() for char in password)
    
    return has_digit and has_upper

# 测试
print(validate_password("password"))    # False
print(validate_password("Password123"))  # True
print(validate_password("short1A"))     # False

练习题5:字符串反转

创建一个函数,反转输入的字符串,并可以选择是否保留空格。

提示:使用可选参数控制是否保留空格。

def reverse_string(text, keep_spaces=True):
    """反转字符串,可选择是否保留空格"""
    if not keep_spaces:
        text = text.replace(" ", "")
    return text[::-1]

# 测试
print(reverse_string("hello world"))      # "dlrow olleh"
print(reverse_string("hello world", False))  # "dlrowolleh"
print(reverse_string("Python"))           # "nohtyP"

练习题6:购物车总价

基于智能餐厅案例,创建一个购物车函数,计算包含商品、数量和折扣的总价。

扩展:添加会员折扣功能,会员享受额外5%折扣。

def calculate_cart_total(items, prices, is_member=False):
    """计算购物车总价"""
    subtotal = 0
    
    for item, quantity in items.items():
        if item in prices:
            subtotal += prices[item] * quantity
        else:
            print(f"商品 {item} 未找到价格")
    
    # 应用折扣
    discount = 0
    if subtotal >= 100:
        discount += subtotal * 0.1  # 满100减10%
    
    if is_member:
        discount += subtotal * 0.05  # 会员额外5%
    
    final_total = subtotal - discount
    return final_total, discount

# 测试
prices = {"苹果": 5, "香蕉": 3, "橙子": 4}
cart = {"苹果": 3, "香蕉": 2}

total, saved = calculate_cart_total(cart, prices, is_member=True)
print(f"总价:¥{total:.0f},节省:¥{saved:.0f}")