python中的函数

目录

初识函数

什么是函数

函数的特点

函数的定义

函数的调用

函数的参数

什么是参数

参数的特点

参数的类型

位置参数:

关键字参数

默认参数

可变参数

参数的注意点

函数的返回值

什么是返回值

返回值的特点

返回值的注意点

函数的说明文档

什么是说明文档

说明文档的特点

说明文档的注意点

函数的拆包

什么是拆包

拆包的特点

拆包的注意点

全局变量与局部变量

什么是全局变量

什么是局部变量

全局变量的作用

局部变量的作用

全局变量与局部变量的注意点


初识函数

什么是函数

将一段特定功能的代码打包起来,并通过名字来重复调用的程序结构。

例如,小小勇者有一台留声机,能够把自己的声音记录在留声机里。

python 复制代码
def my_voice():
    print('大家好,我是小小勇者,你们好吗!')

函数的特点

|-------|------------------------|
| 作用 | 解释 |
| 代码复用 | 只需写一次就能够随时调用 |
| 结构清晰 | 能够把逻辑拆成独立的模块 |
| 便于维护 | 当需要修改某个功能点时可直接修改函数内部 |
| 提高可读性 | 可以通过函数名及其说明文档了解函数的具体功能 |

函数的定义

语法结构:

def 函数名(参数列表):

"""说明文档"""

函数体

return 返回值

其中,参数列表、说明文档与返回值可以根据函数的使用场景来判断是否需要选择添加。

例如,小小勇者每次喝完大红瓶都能给自身添加80点生命值,由于喝大红瓶可以是多次重复的动作,可以通过函数存放该功能块。

python 复制代码
def drink_red_potion(health): #定义一个参数用来接收血量值

    """ #这个是说明文档
    喝大红瓶增加生命值
    功能:
        小小勇者每次喝大红瓶都会增加固定的生命值(80点)。
        由于喝大红瓶可以重复使用,因此该功能被封装为函数,方便重复调用。
    参数:
        health (int/float) - 当前生命值
    返回值:
        int/float - 喝完大红瓶后的生命值 
    """

    health += 80
    print(f"喝了大红瓶,生命值增加到 {health}")
    return health  # 返回更新后的生命值

函数的调用

语法结构:

函数名(参数列表)

其中,参数列表需要根据调用的函数的定义的参数相匹配。

例如,小小勇者为了验证大红瓶的回血机制,对上述函数定义的代码进行调用验证。

python 复制代码
hero_health = 100 # 定义小小勇者的初始生命值
def drink_red_potion(health): # 定义函数:喝大红瓶
    """喝大红瓶,增加80点生命值"""
    health += 80
    print(f"喝了大红瓶,生命值增加到 {health}")
    return health  # 返回更新后的生命值

# 使用函数
drink_red_potion(hero_health)  # 第一次喝
drink_red_potion(hero_health)  # 第二次喝
drink_red_potion(hero_health)  # 第三次喝

对代码进行运行测试:

函数的参数

什么是参数

函数参数是函数对外提供输入的接口,用来控制函数行为或传递数据。

参数的特点

|------|---------------------|
| 特点 | 解释 |
| 灵活性 | 通过参数控制函数行为,无需重复修改代码 |
| 复用性 | 同一个函数可处理不同数据 |
| 独立性 | 函数内部操作参数,不必依赖外部变量 |
| 可拓展性 | 支持多种参数类型,可随需求增加 |

参数的类型

位置参数:

按定义顺序传入值。

关键字参数

按参数名传值,顺序可变。

默认参数

在函数定义时提供默认值,可省略。

可变参数

可变元组(*args)接收多个位置参数,可变字典(**kwargs)接收多个关键字参数。

例如,小小勇者在旅途中遇到怪物受伤,他从背包里取出不同药水进行恢复。药水种类不同,恢复效果也不同。为了避免每次都写重复代码,他使用函数并传入参数:药水类型、当前生命值和英雄名字。

python 复制代码
# 小小勇者喝药水示例
def drink_potion(name, health, potion_type="红瓶"):
    """
    英雄喝药水,增加生命值
    参数:
        name (str) - 英雄名称
        health (int) - 当前生命值
        potion_type (str) - 药水类型,默认红瓶
    返回:
        int - 喝药水后的生命值
    """
    if potion_type == "红瓶":
        health += 80
    elif potion_type == "蓝瓶":
        health += 50
    else:
        print("未知药水类型")
    print(f"{name} 喝了 {potion_type},生命值增加到 {health}")
    return health

# 使用故事示例
hero_health = 100
print("小小勇者在林间小道上被怪物攻击,受伤严重。")
hero_health = drink_potion("小小勇者", hero_health)          # 默认红瓶恢复
print("小小勇者继续前进,但遇到新的陷阱,需要蓝瓶恢复体力。")
hero_health = drink_potion("小小勇者", hero_health, "蓝瓶")  # 指定蓝瓶

对代码进行运行测试:

参数的注意点

  • 参数顺序:位置参数必须在默认参数前面,否则报错。

  • 参数类型:传入的值必须符合函数内部操作要求,如数值、字符串或对象。

  • 可变参数要小心顺序和命名,避免覆盖固定参数。

  • 默认参数值为可变对象(如列表)时,需要注意共享状态问题。

函数的返回值

什么是返回值

函数执行后输出的数据,可供调用者使用或更新状态。

返回值的特点

|------|---------------------------|
| 特点 | 解释 |
| 独立性 | 函数内部运算通过返回值输出,而不是直接修改外部状态 |
| 可组合性 | 返回值可作为其他函数的输入,实现链式操作 |
| 信息承载 | 函数不仅执行操作,还传递计算结果、状态或多信息 |

例如,小小勇者找到一个神秘泉水,喝下去可以恢复生命值。他希望每次喝完泉水后能知道当前生命值,方便后续战斗。

python 复制代码
def drink_mystic_water(health):
    """
    神秘泉水恢复生命值
    参数:
        health (int) - 当前生命值
    返回:
        int - 喝水后的生命值
    """
    recovered = 70
    health += recovered
    print(f"小小勇者喝了神秘泉水,生命值增加 {recovered} 点,到 {health}")
    return health

# 使用示例
hero_health = 50
print("小小勇者被强盗袭击,生命值下降到 50。")
hero_health = drink_mystic_water(hero_health)  # 返回值更新生命值
print(f"当前生命值:{hero_health}")

对代码进行运行测试:

返回值的注意点

必须使用return才能返回值,否则默认返回None。多值返回时,拆包变量数量必须匹配。返回值类型需明确,确保调用者可以正确处理。未使用返回值或未接收返回值,计算结果将丢失。

函数的说明文档

什么是说明文档

函数内部的文档字符串,记录函数功能、参数、返回值和使用方法。用三引号""" """包围,写在函数首行。包括功能描述、参数说明、返回值说明、使用示例和注意事项。

说明文档的特点

|-------|-----------|
| 特点 | 解释 |
| 可读性高 | 快速理解函数功能 |
| 可维护性强 | 帮助修改和扩展函数 |

例如,小小勇者学习新的技能------治疗术。他写了函数来封装技能,但为了队友和自己使用方便,他在函数里写了详细说明文档,解释技能作用、参数和效果。

python 复制代码
def heal_skill(health, amount=50):
    """
    治疗术技能
    
    功能:
        小小勇者使用治疗术恢复生命值。
    
    参数:
        health (int) - 当前生命值
        amount (int) - 治疗量,默认 50
    
    返回值:
        int - 治疗后的生命值
    
    使用示例:
        hero_health = heal_skill(100)
    """
    health += amount
    print(f"使用治疗术,生命值恢复到 {health}")
    return health

# 使用示例
hero_health = 120
hero_health = heal_skill(hero_health, 70)

对代码进行运行测试:

说明文档的注意点

说明文档应简明扼要,避免冗余。参数类型、返回值类型要明确,防止误用。对于复杂函数,建议加入示例和注意事项。可以被 IDE、自动文档工具提取,便于团队协作。

函数的拆包

什么是拆包

函数返回多个值时,可通过多个变量同时接收,称为拆包。

拆包的特点

|-----|-----------------------|
| 特点 | 解释 |
| 简洁性 | 不用通过索引访问元组或列表 |
| 可读性 | 每个返回值赋给独立变量,意义明确 |
| 灵活性 | 可返回任意多个相关信息,调用时直接拆包使用 |

例如,小小勇者发现一个藏宝箱,里面有金币、药水和装备。他希望一次性拿到所有信息,不用逐个查询。

python 复制代码
def open_treasure():
    """
    打开宝箱返回内容
    返回:
        gold (int) - 金币
        potion (str) - 药水类型
        item (str) - 装备名称
    """
    return 100, "红瓶", "小盾牌"

# 拆包示例
gold, potion, item = open_treasure()
print(f"获得金币:{gold},药水:{potion},装备:{item}")

对代码进行运行测试:

拆包的注意点

拆包变量数量必须与返回值元素数量一致。可结合列表、字典使用,注意类型匹配。返回值变化时,拆包顺序也可能需要调整。

全局变量与局部变量

什么是全局变量

在函数外定义,整个模块可访问。

什么是局部变量

在函数内部定义,只在函数内有效。

全局变量的作用

  • 方便共享状态或保存程序整体信息。

  • 修改时需明确声明,避免意外覆盖。

局部变量的作用

  • 独立性强,函数内部操作不影响外部。

  • 安全性高,避免数据冲突。

例如,小小勇者收集金币,全局变量保存总金币数。局部变量用来计算每次战斗获得的金币,保证函数独立性。

python 复制代码
# 全局变量
hero_gold = 100

def earn_gold(battle_reward):
    """
    战斗获得金币
    参数:
        battle_reward (int) - 本次战斗奖励
    """
    global hero_gold  # 修改全局变量
    temp_reward = battle_reward  # 局部变量
    hero_gold += temp_reward
    print(f"战斗获得 {temp_reward} 金币,当前总金币 {hero_gold}")

# 使用示例
earn_gold(50)
print(f"全局金币总数:{hero_gold}")

对代码进行运行测试:

全局变量与局部变量的注意点

局部变量在函数外不可访问,必须通过返回值传递。修改全局变量前必须使用global声明,否则会创建局部同名变量。全局变量过多会导致依赖混乱,降低可维护性。建议以局部变量为主,必要时使用全局变量,保持安全与灵活并存。