前言

函数是 Python 代码封装、复用最核心的工具。不管是小型管理系统,还是大型项目,都会大量使用函数。本篇文章循序渐进,从函数基础定义、参数体系、变量作用域,再到匿名函数、递归、闭包、装饰器完整梳理,搭配可运行代码案例,适合零基础巩固与面试复习。

目录

前言

1. 函数基础

1.1 什么是函数

1.2 函数的定义与调用

1.3 函数的返回值

2. 函数参数详解

2.1 位置参数

2.2 默认参数

2.3 关键字参数

2.4 可变参数

*args 不定长位置参数

**kwargs 不定长关键字参数

2.5 参数解包

3. 变量作用域

3.1 局部变量与全局变量

3.2 global 与 nonlocal

3.3 globals () 与 locals ()

4. 高级函数

4.1 匿名函数 lambda

4.2 高阶函数

4.3 递归函数

5. 闭包与装饰器

5.1 闭包

5.2 装饰器

5.3 装饰器常用案例

总结


1. 函数基础

1.1 什么是函数

函数就是封装一段具备独立功能的代码块,给代码命名,实现一次定义、多次调用。 作用:

  1. 代码复用,避免大量重复代码
  2. 简化结构,提高可读性
  3. 方便维护,修改只需改动函数内部

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

  1. global:在函数内部声明变量为全局变量,修改全局变量

python

运行

count = 0
def add_count():
    global count
    count += 1
  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 闭包

闭包条件:

  1. 嵌套函数
  2. 内层函数使用外层函数变量
  3. 外层函数返回内层函数 优点:保存外层函数变量状态

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 装饰器常用案例

  1. 计时器装饰器(统计函数运行耗时)
  2. 日志记录装饰器
  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()

总结

  1. def 定义函数,return 返回数据;
  2. 参数分为位置、默认、关键字、*args、**kwargs,掌握参数解包;
  3. global 操作全局变量,nonlocal 操作外层嵌套变量;
  4. lambda 快速实现简易函数,递归注意终止条件;
  5. 闭包保存上下文,装饰器基于闭包实现无侵入扩展功能。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐