ython 函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码块,它能提高代码的复用性、可读性和可维护性。下面从核心概念、定义 / 调用、参数、返回值、作用域等方面,系统讲解函数的基础。
一、函数的核心作用
- 封装逻辑:把一段重复执行的代码打包成函数,避免重复编写;
- 模块化编程:将复杂程序拆分成多个小函数,各司其职;
- 易维护:修改函数内部逻辑,所有调用处都会生效,无需逐处修改。
二、函数的定义与调用
1. 定义语法
使用 def 关键字定义函数,基本结构:
python
运行
def 函数名(参数列表):
"""函数文档字符串(可选,用于说明函数功能)"""
函数体(要执行的代码)
[return 返回值] # 可选,无return则默认返回None
2. 基础示例
python
运行
# 定义一个无参数、无返回值的函数
def say_hello():
"""打印问候语"""
print("Hello, Python!")
# 调用函数(必须调用才会执行函数体)
say_hello() # 输出:Hello, Python!
# 定义有参数、有返回值的函数
def add(a, b):
"""计算两个数的和并返回结果"""
result = a + b
return result
# 调用函数并接收返回值
sum_result = add(3, 5)
print(sum_result) # 输出:8
三、函数的参数(核心重点)
参数是函数接收外部输入的 “入口”,分为以下几类:
1. 位置参数(必选参数)
调用时必须按顺序传递的参数,数量要与定义时一致:
python
运行
def print_info(name, age):
print(f"姓名:{name},年龄:{age}")
# 正确调用(按位置传参)
print_info("张三", 20) # 输出:姓名:张三,年龄:20
# 错误调用(参数数量不匹配)
# print_info("李四") # 报错:缺少1个必选参数'age'
2. 默认参数
定义时给参数指定默认值,调用时可省略该参数(默认参数必须放在位置参数之后):
python
运行
def print_info(name, age=18): # age默认值为18
print(f"姓名:{name},年龄:{age}")
# 省略默认参数,使用默认值
print_info("李四") # 输出:姓名:李四,年龄:18
# 覆盖默认值
print_info("王五", 25) # 输出:姓名:王五,年龄:25
⚠️ 注意:默认参数建议使用不可变类型(如数字、字符串、元组),避免使用列表 / 字典等可变类型(否则多次调用会累积修改)。
3. 关键字参数
调用时通过参数名=值的形式传参,顺序可任意:
python
运行
def print_info(name, age):
print(f"姓名:{name},年龄:{age}")
# 关键字参数调用
print_info(age=22, name="赵六") # 输出:姓名:赵六,年龄:22
4. 可变长度参数(*args 和 **kwargs)
用于接收不确定数量的参数:
*args:接收任意数量的位置参数,打包成元组;**kwargs:接收任意数量的关键字参数,打包成字典。
python
运行
# *args示例:求和任意个数的数字
def sum_all(*args):
total = 0
for num in args:
total += num
return total
print(sum_all(1, 2, 3)) # 输出:6
print(sum_all(10, 20, 30, 40)) # 输出:100
# **kwargs示例:打印任意关键字信息
def print_kwargs(**kwargs):
for key, value in kwargs.items():
print(f"{key}:{value}")
print_kwargs(name="孙七", gender="男", score=90)
# 输出:
# name:孙七
# gender:男
# score:90
四、函数的返回值(return)
return用于将函数的结果返回给调用者,执行到return时函数立即结束;- 无
return或return后无值,函数默认返回None; - 可返回多个值(本质是返回元组,可解包)。
python
运行
# 无返回值
def func1():
print("无返回值")
res1 = func1()
print(res1) # 输出:None
# 返回单个值
def func2():
return 100
res2 = func2()
print(res2) # 输出:100
# 返回多个值
def func3():
return 1, 2, 3 # 等价于 return (1, 2, 3)
a, b, c = func3()
print(a, b, c) # 输出:1 2 3
五、函数的作用域
变量的作用域指变量能被访问的范围,分为:
1. 局部作用域(Local)
函数内部定义的变量,仅在函数内可访问,外部无法访问。
2. 全局作用域(Global)
函数外部定义的变量,整个程序中可访问(函数内可读取,修改需用global关键字)。
python
运行
# 全局变量
num = 10
def test1():
# 读取全局变量
print(num) # 输出:10
def test2():
# 修改全局变量(需声明global)
global num
num = 20
test1()
test2()
print(num) # 输出:20
# 局部变量
def test3():
local_num = 30
print(local_num) # 函数内可访问
test3()
# print(local_num) # 报错:局部变量外部无法访问
3. nonlocal 关键字(嵌套函数用)
用于在嵌套函数中修改外层函数的局部变量(非全局):
python
运行
def outer():
num = 10
def inner():
nonlocal num # 声明修改外层局部变量
num = 20
inner()
print(num) # 输出:20
outer()
六、函数的嵌套与递归(基础拓展)
1. 函数嵌套
函数内部定义另一个函数,内层函数仅在外层函数内可调用:
python
运行
def outer_func():
print("外层函数")
def inner_func():
print("内层函数")
inner_func() # 外层函数内调用内层函数
outer_func()
# 输出:
# 外层函数
# 内层函数
2. 递归函数(基础)
函数调用自身,需满足两个条件:
- 有明确的终止条件(避免无限递归);
- 每次调用都向终止条件靠近。
示例:计算阶乘(n! = n × (n-1) × ... × 1)
python
运行
def factorial(n):
# 终止条件:n=1时返回1
if n == 1:
return 1
# 递归调用:n! = n × (n-1)!
return n * factorial(n-1)
print(factorial(5)) # 输出:120(5×4×3×2×1)
七、基础注意事项
- 函数名命名规则:小写字母,多个单词用下划线分隔(如
add_num),避免与 Python 内置函数重名(如print、sum); - 文档字符串:用
""" """包裹,可通过函数名.__doc__查看,提升可读性; - 函数调用前必须先定义(或先声明);
- 避免函数过长:一个函数尽量只做一件事,保持简洁。
总结
Python 函数的核心是定义(def)- 传参(多种参数类型)- 执行(函数体)- 返回(return) ,掌握参数和作用域是基础重点,灵活运用函数能大幅提升代码质量。