函数是 Python 中封装代码逻辑的基本单元,它将实现特定功能的代码块命名并打包,以便在程序中重复调用,从而减少代码冗余、提高可读性和可维护性。无论是简单的数学计算还是复杂的业务逻辑,都可以通过函数实现模块化管理。Python 的函数定义灵活,支持多种参数类型,能适应不同的调用场景。掌握函数的定义方法和参数类型,是编写结构化 Python 代码的核心技能。
一、Python 函数的定义方法
Python 函数通过def关键字定义,基本语法格式为:
def 函数名(参数列表): """函数文档字符串(可选,用于说明函数功能)""" # 函数体(实现功能的代码块,需缩进) return 返回值(可选)
(一)函数定义的基本要素
函数名:遵循标识符命名规则(字母、数字、下划线组成,不能以数字开头),建议使用小写字母和下划线(蛇形命名法),做到 “见名知意”(如calculate_sum、get_user_info)。
参数列表:函数接收的输入数据,可包含零个或多个参数,多个参数用逗号分隔。
函数体:实现函数功能的代码,需通过缩进(通常 4 个空格)与其他代码区分。
返回值:通过return语句将结果返回给调用者,若省略return,函数默认返回None。
(二)函数定义示例
无参数、无返回值的函数
def print_welcome(): """打印欢迎信息""" print("欢迎使用本程序!")# 调用函数print_welcome() # 输出:欢迎使用本程序!
有参数、有返回值的函数
def add(a, b): """计算两个数的和并返回""" result = a + b return result# 调用函数并接收返回值sum_result = add(3, 5)print(sum_result) # 输出:8
包含文档字符串的函数
文档字符串(docstring)用于说明函数功能,可通过help()函数查看:
def multiply(x, y): """ 计算两个数的乘积 参数: x: 第一个乘数 y: 第二个乘数 返回: 乘积结果 """ return x * yhelp(multiply) # 显示函数文档
二、Python 函数的参数类型
Python 函数的参数类型丰富,可根据传递和接收方式分为以下几类,灵活满足不同的调用需求。
(一)位置参数(必选参数)
位置参数是最基本的参数类型,必须按照定义时的顺序传递,且数量与定义一致,否则会报错。
示例:
def greet(name, age): print(f"你好,我叫{name},今年{age}岁")# 按位置传递参数greet("Alice", 20) # 输出:你好,我叫Alice,今年20岁greet(20, "Alice") # 逻辑错误(参数顺序颠倒),输出:你好,我叫20,今年Alice岁
(二)关键字参数
调用函数时,通过 “参数名 = 值” 的形式指定参数,可忽略参数顺序,提高代码可读性。
示例:
# 用关键字参数调用greet函数greet(age=20, name="Alice") # 输出:你好,我叫Alice,今年20岁(顺序无关)
关键字参数常与位置参数结合使用,但位置参数必须放在关键字参数之前:
greet("Bob", age=22) # 正确:位置参数在前,关键字参数在后# greet(name="Bob", 22) # 错误:关键字参数不能在位置参数之前
(三)默认参数
定义函数时,为参数指定默认值(参数名=默认值),调用时可省略该参数(使用默认值)。
示例:
def power(base, exponent=2): """计算base的exponent次方,默认平方""" return base ** exponentprint(power(3)) # 省略exponent,使用默认值2:3^2=9print(power(3, 3)) # 指定exponent为3:3^3=27
注意:默认参数必须放在位置参数之后,否则会导致语法错误。
(四)可变参数(*args)
当参数数量不确定时,可在参数名前加*定义可变参数,接收任意数量的位置参数,返回一个元组。
示例:
def calculate_sum(*args): """计算任意数量数字的和""" total = 0 for num in args: total += num return totalprint(calculate_sum(1, 2, 3)) # 3个参数:6print(calculate_sum(10, 20, 30, 40)) # 4个参数:100print(calculate_sum()) # 0个参数:0
调用时,也可将列表或元组拆分为可变参数传递(在变量前加*):
nums = [1, 2, 3, 4]print(calculate_sum(*nums)) # 等价于calculate_sum(1,2,3,4),输出10
(五)关键字可变参数(**kwargs)
在参数名前加**定义关键字可变参数,接收任意数量的关键字参数,返回一个字典(键为参数名,值为参数值)。
示例:
def print_info(**kwargs): """打印任意关键字参数信息""" for key, value in kwargs.items(): print(f"{key}: {value}")print_info(name="Alice", age=20, gender="female")# 输出:# name: Alice# age: 20# gender: female
调用时,可将字典拆分为关键字可变参数传递(在变量前加**):
user_info = {"name": "Bob", "age": 22}print_info(** user_info) # 等价于print_info(name="Bob", age=22)
三、参数类型的组合使用
实际开发中,多种参数类型可组合使用,但需遵循固定顺序:位置参数 → 默认参数 → 可变参数(*args) → 关键字可变参数(**kwargs)。
示例:综合参数类型的函数
def func(a, b, c=0, *args, **kwargs): print(f"位置参数:a={a}, b={b}") print(f"默认参数:c={c}") print(f"可变参数:args={args}") print(f"关键字可变参数:kwargs={kwargs}")# 调用函数func(1, 2, 3, 4, 5, x=6, y=7)# 输出:# 位置参数:a=1, b=2# 默认参数:c=3# 可变参数:args=(4, 5)# 关键字可变参数:kwargs={'x': 6, 'y': 7}
四、函数使用的注意事项
-** 作用域 :函数内部定义的变量为局部变量,仅在函数内有效;函数外部定义的全局变量需用global声明才能在函数内修改。
函数嵌套 :函数内部可定义另一个函数(嵌套函数),内部函数可访问外部函数的变量(闭包特性)。
避免过多参数 **:函数参数过多(如超过 5 个)会降低可读性,可通过字典或类封装参数。
Python 函数的定义简洁灵活,通过不同类型的参数可满足多样化的调用需求:位置参数保证基本输入,关键字参数提升可读性,默认参数简化常用场景,可变参数适应不确定输入。掌握这些参数类型的使用规则,能让函数更通用、更易用,是编写高质量 Python 代码的关键。合理封装函数,既能减少重复代码,又能让程序结构更清晰,为后续维护和扩展提供便利。