函数专题1
1. 函数的定义
2. 变量作用域:局部变量和全局变量
3. 函数的参数类型:位置参数、默认参数、不定参数
4. 传递参数的手段:关键词参数
5. 传递参数的顺序:同时出现三种参数类型时
函数的定义
函数的基本写法如下所示:
def function_name(parameter1, parameter2, ...):
"""
Docstring: 描述函数的功能、参数和返回值 (可选但强烈推荐)
"""
# 函数体: 实现功能的代码
# ...
return value # 可选,用于返回结果
- def: 关键字,表示开始定义一个函数。
- function_name: 函数的名称,应遵循Python的命名约定(通常是小写字母和下划线,例如 calculate_area,用英文单词含义和下划线来作为函数名)。
- parameter1, parameter2, ...: 函数的参数(也叫形参),是函数在被调用时接收的输入值。参数是可选的。
- (): 参数列表必须放在圆括号中,即使没有参数,括号也不能省略。
- : 冒号表示函数定义的头部结束,接下来是缩进的函数体。
- Docstring (文档字符串): 位于函数定义第一行的多行字符串(通常用三引号 """Docstring goes here""")。用于解释函数的作用、参数、返回值等。可以通过 help(function_name) 或 function_name.doc 查看。这个写法可选,为了后续维护和查看,建议加上这一段更加规范
- 函数体 (Function Body): 缩进的代码块,包含实现函数功能的语句。
- return value: return 语句用于从函数中返回一个值。如果函数没有 return 语句,或者 return 后面没有值,它会自动返回 None。一个函数可以有多个 return 语句(例如在不同的条件分支中)。
变量作用域
-
局部变量 (Local Variables): 在函数内部定义的变量,只在该函数内部有效。当函数执行完毕后,局部变量通常会被销毁。
-
全局变量 (Global Variables): 在所有函数外部定义的变量,可以在程序的任何地方被访问(但在函数内部修改全局变量需要特殊声明,如 global 关键字,初学阶段可以先避免)。
print("\n--- 变量作用域示例 ---") global_var = "我是一个全局变量" def scope_test(): local_var = "我是一个局部变量" print(f"在函数内部,可以看到局部变量: '{local_var}'") print(f"在函数内部,也可以看到全局变量: '{global_var}'") # global_var = "尝试在函数内修改全局变量" # 如果没有 global 声明,这会创建一个新的局部变量 global_var # print(f"在函数内部,修改后的 '全局' 变量: '{global_var}'") scope_test() print(f"\n在函数外部,可以看到全局变量: '{global_var}'")--- 变量作用域示例 --- 在函数内部,可以看到局部变量: '我是一个局部变量' 在函数内部,也可以看到全局变量: '我是一个全局变量' 在函数外部,可以看到全局变量: '我是一个全局变量'函数的参数类型
参数有以下类型:
- 位置参数 (Positional Arguments): 调用时按顺序匹配。
- 默认参数值 (Default Parameter Values): 定义函数时给参数指定默认值,调用时如果未提供该参数,则使用默认值。
- 可变数量参数 (*args 和 **kwargs):
- *args: 将多余的位置参数收集为一个元组。
- **kwargs: 将多余的关键字参数收集为一个字典。
可能你还听过关键字参数 (Keyword Arguments)这个说法,但是他并非是一种参数,而是一种传递参数的手段: 调用时通过 参数名=值 的形式指定,可以不按顺序。他可以传位置参数的值,也可以传默认参数的值,也可以传可变参数的值,也可以传关键字参数的值。为了可读性,更推荐对所有参数均采取关键字参数传递。
位置参数
def describe_pet(animal_type, pet_name):
"""显示宠物的信息。"""
print(f"\n我有一只 {animal_type}.")
print(f"我的 {animal_type} 的名字叫 {pet_name.title()}.")
describe_pet("猫", "咪咪") # 使用关键字参数,顺序不重要
我有一只 猫.
我的 猫 的名字叫 咪咪.
默认参数
def describe_pet_default(pet_name, animal_type="狗"): # animal_type 有默认值
"""显示宠物的信息,动物类型默认为狗。"""
print(f"我有一只 {animal_type}.")
print(f"我的 {animal_type} 的名字叫 {pet_name.title()}.")
describe_pet_default(pet_name="小黑") # animal_type 使用默认值 "狗"
describe_pet_default(pet_name="雪球", animal_type="仓鼠") # 提供 animal_type,覆盖默认值
# 注意:带默认值的参数必须放在没有默认值的参数之后
我有一只 狗.
我的 狗 的名字叫 小黑.
我有一只 仓鼠.
我的 仓鼠 的名字叫 雪球.
*args (收集位置参数)
当函数被调用时,Python 会先尝试用调用时提供的位置参数去填充函数定义中所有明确定义的、非关键字的形参 (也就是那些普通的,没有 * 或 ** 前缀的参数,包括有默认值的和没有默认值的)。 如果在填充完所有这些明确定义的形参后,调用时还有剩余的位置参数,那么这些“多余的”位置参数就会被收集起来,形成一个元组 (tuple),并赋值给 *args 指定的那个变量(通常就是 args)。 如果调用时提供的位置参数数量正好等于或少于明确定义的形参数量(且满足了所有必需参数),那么 *args 就会是一个空元组 ()。
def make_pizza(size, *toppings):
"""概述要制作的比萨。
*toppings 会将所有额外的位臵参数收集到一个元组中。
"""
print(f"\n制作一个 {size} 寸的比萨,配料如下:")
if toppings: # 只要toppings不为空元组,就会执行
for topping in toppings:
print(f"- {topping}")
else:
print("- 原味 (无额外配料)")
make_pizza(12, "蘑菇")
make_pizza(16, "香肠", "青椒", "洋葱")
make_pizza(9) # toppings 会是空元组
制作一个 12 寸的比萨,配料如下:
- 蘑菇
制作一个 16 寸的比萨,配料如下:
- 香肠
- 青椒
- 洋葱
制作一个 9 寸的比萨,配料如下:
- 原味 (无额外配料)
996

被折叠的 条评论
为什么被折叠?



