网易首页 > 网易号 > 正文 申请入驻

Python 编程B11:函数(二)

0
分享至

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 会按照LEGB四个层级依次查找。

缩写

名称

L

Local

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

E

Enclosing

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

G

Global

当前模块的全局作用域

B

Built-in

Python 内建命名空间(如len()sum()等)

示例:

outer()

输出:

local

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

8.4.3 nonlocal 声明

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

print(add()) 

输出:

2

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 表示匿名函数。

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

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

• 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))

输出:

[1, 4, 9, 16]

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

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

(2)过滤函数

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

示例:

print(list(result))

输出:

[2, 4, 6]

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

(3)累积函数

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

示例:

print(result)

输出:

5050

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

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

(4)自定义排序函数

通过 key 指定排序逻辑。

示例:

    print(sorted_students[i])

输出:

{'姓名': '小艾', '成绩': 95}

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

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

示例:

print(result)

示例输出:

56

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

小结

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

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

点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
中国亮出〈波茨坦公告〉王炸!日本若再挑衅,领土范围将成必答题

中国亮出〈波茨坦公告〉王炸!日本若再挑衅,领土范围将成必答题

视觉攻城狮
2025-11-17 00:09:15
战韩国双响!22岁国足红星女友曝光 现场观战+甜蜜互动 私照绝美

战韩国双响!22岁国足红星女友曝光 现场观战+甜蜜互动 私照绝美

我爱英超
2025-11-16 10:06:05
奇迹诞生:补时绝杀,大黑马绝境翻盘,杀入世界杯附加赛

奇迹诞生:补时绝杀,大黑马绝境翻盘,杀入世界杯附加赛

足球狗说
2025-11-17 00:07:54
《凤凰台上》的播出告诉观众:中年古偶真的没市场了!

《凤凰台上》的播出告诉观众:中年古偶真的没市场了!

海绵宝宝的心事
2025-11-15 12:16:02
这是我见过的五官最精致的女性,一脸福相,以后会贵不可言

这是我见过的五官最精致的女性,一脸福相,以后会贵不可言

手工制作阿歼
2025-10-28 14:03:28
街头抓奸!原配抓渣男车内出轨丰满小三,引发围观现场视频曝光!

街头抓奸!原配抓渣男车内出轨丰满小三,引发围观现场视频曝光!

新动察plus
2024-07-22 10:28:08
比福建舰更牛力量出现?军事专家项立刚预言,相当于100艘航母

比福建舰更牛力量出现?军事专家项立刚预言,相当于100艘航母

晓徙娱乐
2025-11-13 13:46:16
全运会最新金牌榜,浙江迫近山东,福建河南亮眼,游泳现“双铜”

全运会最新金牌榜,浙江迫近山东,福建河南亮眼,游泳现“双铜”

第五才子
2025-11-16 23:42:52
“苏贵元”陈坚雄去世三年,遗孀黄敏离开广州,谈再婚子女这样说

“苏贵元”陈坚雄去世三年,遗孀黄敏离开广州,谈再婚子女这样说

丁丁鲤史纪
2025-11-01 08:04:32
蒋经国去世前,为何不传位给自己的儿子,而是表里不一的李登辉?

蒋经国去世前,为何不传位给自己的儿子,而是表里不一的李登辉?

芳芳历史烩
2025-10-19 15:46:54
高市早苗拒不认错,日本通知中国,不解决问题,就驱逐中方外交官

高市早苗拒不认错,日本通知中国,不解决问题,就驱逐中方外交官

大白话瞰世界
2025-11-13 13:21:29
中国与俄罗斯投弃权票

中国与俄罗斯投弃权票

澎湃新闻
2025-11-15 14:02:04
日本政府正式宣布!11 月 11 日日本政府官宣 2026 年上调签证费

日本政府正式宣布!11 月 11 日日本政府官宣 2026 年上调签证费

南权先生
2025-11-13 15:52:13
古天乐回应“不用智能手机”传闻

古天乐回应“不用智能手机”传闻

大象新闻
2025-11-16 13:34:13
乱套了!全运会乒乓球,朱雨玲1-4无缘奖牌,陈梦怒吼摘得铜牌

乱套了!全运会乒乓球,朱雨玲1-4无缘奖牌,陈梦怒吼摘得铜牌

阿鰤科普记录
2025-11-16 23:31:39
苹果计划将iPhone发布调整为固定的秋季与春季两次的模式

苹果计划将iPhone发布调整为固定的秋季与春季两次的模式

cnBeta.COM
2025-11-16 22:27:19
笑死!山航还是太权威了,网友:差点端着饭下飞机

笑死!山航还是太权威了,网友:差点端着饭下飞机

夜深爱杂谈
2025-11-15 21:49:27
为何说梅毒病是最脏的病?医生详细讲解,隔着屏幕都感到头皮发麻

为何说梅毒病是最脏的病?医生详细讲解,隔着屏幕都感到头皮发麻

小舟谈历史
2025-10-15 09:30:14
娃哈哈大战终结!离职41天后,宗馥莉博弈失败,无奈选择低头妥协

娃哈哈大战终结!离职41天后,宗馥莉博弈失败,无奈选择低头妥协

吭哧有力
2025-10-24 12:02:29
“房产税”要落实了?原财政部长作出回应,有2类人或要叫苦了

“房产税”要落实了?原财政部长作出回应,有2类人或要叫苦了

墨兰史书
2025-11-16 07:05:03
2025-11-17 01:35:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1591文章数 68关注度
往期回顾 全部

科技要闻

雷军,怒了!刚刚连发多条微博

头条要闻

央视:若高市早苗死不悔改 日本将万劫不复

头条要闻

央视:若高市早苗死不悔改 日本将万劫不复

体育要闻

最佳新秀候选!2028美国男篮有他一个位置

娱乐要闻

CEO爆料肖战《藏海传》狂赚几十亿!

财经要闻

房源暗中调价 央企举报广州国资房企

汽车要闻

"冰彩沙"全配齐 红旗HS6 PHEV预售17.88万起

态度原创

数码
房产
健康
教育
军事航空

数码要闻

华为鸿蒙HarmonyOS 6.0.0.112版本首曝,支持电脑投平板

房产要闻

首开狂卖6.68亿!海口这个顶级教育红盘,引爆海口楼市!

血液科专家揭秘白血病七大误区

教育要闻

妈妈晒高二儿子吃宵夜,女网友眼睛看直了:这颜值,小姑娘遭殃了

军事要闻

海军四川舰顺利完成首次航行试验

无障碍浏览 进入关怀版