Python 编程B11:函数(二)

B站影视 港台电影 2025-11-14 00:05 1

摘要:变量的可见范围称为作用域(Scope),变量存在于内存中的时间长度称为生命周期(Lifetime)。

8.4 变量的作用域与生命周期

变量的可见范围称为作用域(Scope),变量存在于内存中的时间长度称为生命周期(Lifetime)。

8.4.1 局部变量与全局变量

(1)局部变量

在函数内部定义的变量(包括形参)称为局部变量(Local Variable)。

• 作用域:从定义位置开始到函数结束。

• 生命周期:函数被调用时创建,函数返回时销毁。

(2)全局变量

在函数之外定义的变量称为全局变量(Global Variable)。

• 作用域:从定义位置开始至模块或脚本结束。

• 生命周期:程序运行时创建,程序终止时销毁。

示例:

print("函数外部 x =", x)

输出:

函数外部 x = 10

函数内部与外部的 x 各自存在于不同命名空间中,互不影响。

如果需要在函数内部修改全局变量,需使用 global 关键字声明。

add_one计数: 2

global 告诉解释器:此变量来自全局作用域,而不是新建局部变量。

8.4.2 变量查找规则:LEGB 原则

当程序引用一个变量名时,Python 会按照L→E→G→B四个层级依次查找。

缩写

名称

L

Local

当前函数或 lambda 表达式内部的局部作用域

E

Enclosing

外层(非全局)函数的局部作用域

G

Global

当前模块的全局作用域

B

Built-in

Python 内建命名空间(如lensum等)

示例:

outer

输出:

local

Python 按照 LEGB 顺序逐层查找,直到找到匹配的变量名为止。若在各个层级都未找到,将触发 NameError。

8.4.3 nonlocal 声明

在嵌套函数中,如果需要修改外层函数的局部变量,可以使用 nonlocal 关键字。

print(add)

nonlocal 允许访问外层(但非全局)作用域的变量,使嵌套函数能“记住”上次的执行状态。

8.4.4 闭包

当一个函数在其内部定义另一个函数然后返回此函数,并且内部函数引用了外层函数的局部变量时,就形成了(Closure)。

示例:

print(cube(2)) # 8 -> 2 ** 3

闭包中的外层局部变量不会在外层函数结束后立即销毁,而会与内部函数共同存活,直到闭包对象被释放,这是一种延长变量生命周期的机制。

闭包使函数“携带”外部环境变量,共同形成可延续的执行上下文。这是 Python 实现延迟计算、记忆函数状态的重要机制。

8.5 递归函数

若一个函数在其定义体内直接或间接调用自己,这种行为称为递归(Recursion)。递归常用于处理具有自相似结构的问题,如数学计算、树形遍历、分治算法等。

递归函数通常包含两个要素:

• 终止条件:决定递归何时结束。

• 递推关系:描述问题的自我分解。

例 8.5.1:使用递归方法计算阶乘

print(factorial(5))

输出:

120

执行流程为:factorial(5) → 5 * factorial(4) → ... → factorial(1),最终返回 120。

递归在概念上简洁明了,但深度过大可能导致栈溢出,因此在实际应用中应设置合理边界或改写为迭代算法。

例 8.5.2:汉诺塔问题

问题描述:有三根柱子(A、B、C),将 n 个盘子从 A 移到 C,每次只能移动一个盘,且大盘不能压在小盘上。

递归思路:

1、将 n−1 个盘从 A 移到 B(借助 C);

2、将第 n 个盘从 A 移到 C;

3、再将 n−1 个盘从 B 移到 C(借助 A)。

hanoi(3, "A", "B", "C")

汉诺塔体现了递归的“分解–求解–合并”思想,是递归问题的经典模型。

8.6 匿名函数 lambda

在某些场景下,我们仅需要定义一次性的小型函数,例如排序规则、自定义筛选条件或简单运算。为简化函数定义,Python 提供了匿名函数表达式 lambda。

• lambda 表示匿名函数。

• 冒号后必须是一个单一表达式。

• 表达式结果即为函数的返回值。

• lambda 返回的是函数对象。

示例:

print(square(5))25

lambda 可赋值给变量使用,与普通函数行为一致。

8.7 高阶函数

在 Python 中,函数是一等对象(First-Class Object),可以赋值给变量、作为参数传递、或作为返回值返回。

若一个函数接收函数作为参数,或返回另一个函数,则称为(Higher-Order Function)。

Python 中常用的内置高阶函数有 map、filter、reduce、sorted等。

(1)映射函数

将函数 func 作用于中的每个元素,返回一个新的惰性迭代器对象(map 对象)。

示例:

print(list(result))

输出:

每次调用 square 时,局部变量 x 的生命周期只在当前迭代中存在。

map 函数返回迭代器,迭代过程中局部变量逐个创建与销毁。

(2)过滤函数

会保留所有 func(x) 为 True 的元素。

示例:

[2, 4, 6]

filter 适用于数据清洗、条件筛选等场景。

(3)累积函数

会将函数 func 依次作用于序列元素,最终归约成一个值。

示例:

print(result)5050

reduce 的执行逻辑为:((1 + 2) + 3) + 4,常用于聚合操作,如求和、累乘等。

若提供 initializer,则以该值作为初始累积结果。

(4)自定义排序函数

通过 key 指定排序逻辑。

示例:

print(sorted_students[i])

sorted 返回一个新的已排序的列表(list),不会修改原可迭代对象。

例 8.7.1计算所有偶数平方的总和

示例:

print(result)56

filter 筛选偶数 → map 计算平方 → reduce 累加。这体现了函数式编程中“数据流式处理”的思维方式。

小结

本次课学习了函数的进阶用法:理解作用域与生命周期的关系,掌握 global 与 nonlocal 的使用;了解闭包保持外部状态的机制;认识递归的原理及应用;学习了 lambda 匿名函数与高阶函数(map、filter、reduce、sorted 等)的实用方式。

下一课将进入模块化程序设计,学习如何将多个函数组织为模块与包,实现真正的项目级复用。

“点赞有美意,赞赏是鼓励”

来源:岚岚课堂

相关推荐