函数
约 1159 字大约 4 分钟
2026-02-04
函数是将一段实现特定功能的代码封装起来的可复用单元,定义一次可多次调用,能大幅减少代码冗余,提高开发效率。Python 中函数分为内置函数(如print()、len())和自定义函数(开发者自己定义)。
自定义函数的核心语法
关键字:def(定义函数)、return(返回结果),语法格式:
def 函数名(参数1, 参数2, ...):
"""函数文档字符串:说明函数的功能、参数、返回值(可选)"""
函数体代码(实现功能)
return 返回值 # 可选,无return则默认返回None- 函数名:遵循变量命名规范,见名知意(如
calc_sum、get_user_info); - 参数:函数的输入,可选(无参数则括号内为空);
- 返回值:函数的输出,可选(无返回值则无需写 return)。
函数的调用
定义函数后不会自动执行,必须通过函数名(参数)调用,调用时参数个数 / 类型需与定义匹配(特殊情况除外)。
# 定义函数:计算两个数的和
def calc_sum(a, b):
"""计算两个数的和
参数:
a:第一个数(int/float)
b:第二个数(int/float)
返回值:
a + b的结果(int/float)
"""
result = a + b
return result
# 调用函数:传入参数,接收返回值
sum1 = calc_sum(10, 20)
sum2 = calc_sum(3.14, 5.86)
print(sum1) # 输出:30
print(sum2) # 输出:9.0
# 无参数、无返回值的函数
def say_hello():
print("Hello Python!")
say_hello() # 调用,输出:Hello Python!函数的参数类型
Python 支持多种参数类型,核心有位置参数、默认参数、关键字参数,灵活使用可提高函数的易用性。
位置参数:按位置传递(默认)
调用时参数的顺序和个数必须与定义完全一致,是最基础的参数类型。
def print_info(name, age):
print(f"姓名:{name},年龄:{age}")
# 位置参数:按顺序传递,name="张三",age=18
print_info("张三", 18) # 输出:姓名:张三,年龄:18
# 顺序错误会导致结果错误
# print_info(18, "张三") # 输出:姓名:18,年龄:张三(不符合预期)默认参数:参数有默认值,调用时可省略
定义时给参数指定默认值,调用时若不传该参数,则使用默认值;若传参,则覆盖默认值。默认参数必须放在位置参数之后。
# 默认参数:gender默认值为"男",放在位置参数后
def print_info(name, age, gender="男"):
print(f"姓名:{name},年龄:{age},性别:{gender}")
# 省略默认参数,使用"男"
print_info("张三", 18) # 输出:姓名:张三,年龄:18,性别:男
# 传参覆盖默认值,使用"女"
print_info("李四", 20, "女") # 输出:姓名:李四,年龄:20,性别:女关键字参数:按参数名传递,顺序可任意
调用时通过参数名=值的方式传递,无需遵守位置顺序,适合参数较多的场景,提高代码可读性。
def print_info(name, age, gender):
print(f"姓名:{name},年龄:{age},性别:{gender}")
# 关键字参数:顺序任意
print_info(age=20, name="李四", gender="女") # 输出:姓名:李四,年龄:20,性别:女
# 位置参数和关键字参数混用:位置参数必须在前
print_info("王五", 22, gender="男") # 正确
# print_info(name="赵六", 25, "女") # 错误:位置参数不能在关键字参数后局部变量与全局变量
根据变量的作用域(生效范围),分为局部变量和全局变量,核心区别在于定义位置和生效范围。
局部变量
- 定义:在函数内部定义的变量;
- 作用域:仅在定义它的函数内部生效,函数外部无法访问;
- 生命周期:函数调用时创建,函数执行结束后销毁。
全局变量
- 定义:在所有函数外部定义的变量;
- 作用域:整个程序(函数内部、外部都能访问);
- 注意:函数内部不能直接修改全局变量,若需修改,需用
global关键字声明。
代码示例
# 全局变量:函数外部定义
a = 100
def test1():
# 函数内部访问全局变量(允许)
print(a) # 输出:100
def test2():
# 局部变量:函数内部定义,仅在test2内生效
b = 200
print(b) # 输出:200
# print(a) # 可访问全局变量a
def test3():
global a # 声明:后续修改的a是全局变量
a = 200 # 修改全局变量
print(a) # 输出:200
test1() # 调用test1,输出100
test2() # 调用test2,输出200
# print(b) # 错误:函数外部无法访问局部变量b
test3() # 调用test3,修改全局变量a为200
print(a) # 输出:200(全局变量已被修改)