Python 函数全解:从基础函数到装饰器实战
前言
函数是 Python 代码封装、复用最核心的工具。不管是小型管理系统,还是大型项目,都会大量使用函数。本篇文章循序渐进,从函数基础定义、参数体系、变量作用域,再到匿名函数、递归、闭包、装饰器完整梳理,搭配可运行代码案例,适合零基础巩固与面试复习。
目录
1. 函数基础
1.1 什么是函数
函数就是封装一段具备独立功能的代码块,给代码命名,实现一次定义、多次调用。 作用:
- 代码复用,避免大量重复代码
- 简化结构,提高可读性
- 方便维护,修改只需改动函数内部
1.2 函数的定义与调用
语法:
python
运行
# 定义函数
def 函数名(参数):
函数体代码
# 调用函数
函数名()
示例:
python
运行
def greet():
print("Hello Python函数")
# 调用
greet()
1.3 函数的返回值
return 用来把函数内部的数据传递到函数外部;
- 没有写 return,默认返回
None - return 执行后,函数立刻终止,后面代码不再运行
- 可以返回单个值、多个值(自动封装为元组)
python
运行
def add(a, b):
return a + b
res = add(3,5)
print(res)
2. 函数参数详解
2.1 位置参数
调用函数时,实参按照顺序依次匹配形参,顺序不能乱。
python
运行
def user_info(name,phone):
print(name,phone)
# 顺序一一对应
user_info("张三","13800138000")
2.2 默认参数
定义形参时直接赋值,如果调用不传参,自动使用默认值。 ⚠️ 注意:默认参数不要使用可变对象(列表、字典)!
python
运行
def show_msg(text="默认文本"):
print(text)
show_msg()
show_msg("自定义内容")
2.3 关键字参数
调用时通过 形参名=值 传参,可以不遵循定义顺序。
python
运行
def user_info(name,phone):
print(name,phone)
# 关键字传参,顺序随意
user_info(phone="13900139000", name="李四")
规则:位置参数必须放在关键字参数前面!
2.4 可变参数
*args 不定长位置参数
收集所有多余位置参数,打包成元组 tuple
python
运行
def func(*args):
print(args)
func(1,2,3,4) # args = (1,2,3,4)
**kwargs 不定长关键字参数
收集所有多余关键字参数,打包成字典 dict
python
运行
def func(**kwargs):
print(kwargs)
func(name="王五",age=20)
# kwargs = {"name":"王五","age":20}
通用模板:def func(a, b=10, *args, **kwargs):
2.5 参数解包
* 解包序列 (列表 / 元组),**解包字典,把容器内元素拆分传入函数
python
运行
def calc(a,b,c):
print(a+b+c)
nums = [10,20,30]
calc(*nums) #等价calc(10,20,30)
data = {"a":1,"b":2,"c":3}
calc(**data) #等价calc(a=1,b=2,c=3)
3. 变量作用域
3.1 局部变量与全局变量
- 全局变量:函数外部定义,整个文件都能访问
- 局部变量:函数内部定义,仅函数内有效,外部无法访问
python
运行
num = 100 #全局变量
def test():
x = 20 #局部变量
print(num) #内部可读全局变量
test()
# print(x) 报错,外部不能访问局部变量
3.2 global 与 nonlocal
- global:在函数内部声明变量为全局变量,修改全局变量
python
运行
count = 0
def add_count():
global count
count += 1
- nonlocal:嵌套函数中,声明使用外层函数的局部变量(不是全局)
python
运行
def outer():
n = 10
def inner():
nonlocal n
n += 5
print(n)
inner()
outer()
3.3 globals () 与 locals ()
globals():返回当前全部全局命名空间字典locals():返回当前作用域局部命名空间字典
python
运行
a = 10
print(globals())
def demo():
b = 20
print(locals())
demo()
4. 高级函数
4.1 匿名函数 lambda
lambda 快速创建简单单行函数,不需要 def 命名 语法:lambda 参数: 返回表达式
python
运行
#普通函数
def add(x,y):
return x+y
#等价lambda
f = lambda x,y:x+y
print(f(2,3))
经常搭配 sorted ()、map ()、filter () 使用。
4.2 高阶函数
满足条件:参数是函数 或者 返回值是函数
python
运行
def calc(func, a, b):
return func(a,b)
res = calc(lambda x,y:x*y,4,5)
print(res)
常见内置高阶函数:map、filter、sorted、reduce
4.3 递归函数
函数自己调用自己,必须设置终止条件,否则无限递归报错。 结构:递归表达式 + 基线条件(退出条件)
python
运行
# 计算阶乘 n! = 1*2*3...*n
def factorial(n):
if n == 1:
return 1
return n * factorial(n-1)
print(factorial(5))
注意:Python 存在默认递归深度限制,不适合超大层数递归。
5. 闭包与装饰器
5.1 闭包
闭包条件:
- 嵌套函数
- 内层函数使用外层函数变量
- 外层函数返回内层函数 优点:保存外层函数变量状态
python
运行
def outer(msg):
def inner():
print(f"消息:{msg}")
return inner
f = outer("快递管理系统")
f()
5.2 装饰器
装饰器本质:特殊闭包 作用:不修改原函数代码、不修改原函数调用方式,给函数新增功能。 通用模板:
python
运行
def decorator(func):
def wrapper(*args, **kwargs):
#执行函数前拓展逻辑
print("函数执行前")
res = func(*args, **kwargs)
#执行函数后拓展逻辑
print("函数执行后")
return res
return wrapper
#语法糖 @装饰器名
@decorator
def hello():
print("执行hello函数")
hello()
5.3 装饰器常用案例
- 计时器装饰器(统计函数运行耗时)
- 日志记录装饰器
- 权限校验装饰器 计时器示例:
python
运行
import time
def timer(func):
def wrap(*args,**kwargs):
start = time.time()
result = func(*args,**kwargs)
end = time.time()
print(f"函数耗时:{end-start:.4f}秒")
return result
return wrap
@timer
def test():
time.sleep(1)
test()
总结
- def 定义函数,return 返回数据;
- 参数分为位置、默认、关键字、*args、**kwargs,掌握参数解包;
- global 操作全局变量,nonlocal 操作外层嵌套变量;
- lambda 快速实现简易函数,递归注意终止条件;
- 闭包保存上下文,装饰器基于闭包实现无侵入扩展功能。
更多推荐



所有评论(0)