做购物网站需要什么服务器,科技创新作文,会员积分系统,成都网站设计制作工作室一、变量作用域基础在 Python 中#xff0c;变量根据作用范围可分为三类#xff1a;全局变量#xff1a;定义在函数外部的变量#xff0c;作用范围是整个程序。如果在函数内部需要修改全局变量#xff0c;必须使用global关键字声明。局部变量#xff1a;定义在函数内部的…一、变量作用域基础在 Python 中变量根据作用范围可分为三类全局变量定义在函数外部的变量作用范围是整个程序。如果在函数内部需要修改全局变量必须使用global关键字声明。局部变量定义在函数内部的变量仅在该函数内部有效。需要注意的是这是在不存在内部函数的前提下。非局部变量从内部函数的角度来看外部函数中定义的变量称为非局部变量。当内部函数需要修改非局部变量时必须使用nonlocal关键字进行声明。二、闭包的概念与构成条件闭包是 Python 中一个重要的概念它满足以下三个条件外部函数嵌套内部函数内部函数被返回内部函数访问外部函数的非局部变量闭包的优缺点优点可以避免全局变量被污染是实现装饰器的基础缺点外部函数的非局部变量会一直被内部函数引用导致变量长时间得不到回收可能造成内存泄漏内存泄漏与内存溢出不同内存泄漏是指数据无法回收无法释放内存内存溢出则是指空间不够用数据溢出
注意闭包虽有其用途但应遵循 能不用就不用 的原则
三、闭包实战案例案例 1带限制的年龄增长函数
def outter():a 10 # 局部变量age 1 # 非局部变量def inner(n):nonlocal age # 声明使用外部函数的非局部变量ageif age n 120:age nreturn agereturn 数据不合法return inner # 返回内部函数# 调用方式先获取内部函数再调用内部函数
print(outter()(8)) # 输出9在这个案例中outter()是外部函数inner(n)是内部函数age是外部函数的变量对内部函数来说是是非局部变量内部函数inner(n)访问并修改了非局部变量age外部函数返回了内部函数形成了闭包该闭包实现了年龄增长的功能并限制年龄不超过 120案例 2实现计数器功能
# 实现计数器
def outter1():a 1 # 初始值def inner1(n):nonlocal a # 声明使用外部函数的非局部变量aa n # 累加n值return areturn inner1 # 返回内部函数不要加括号# 使用计数器
o outter1() # 获取内部函数
print(o(1)) # 输出2
print(o(1)) # 输出3
print(o(1)) # 输出4
print(o(1)) # 输出5
print(o(1)) # 输出6这个计数器案例很好地展示了闭包的特性变量a被保存在闭包环境中不会随着外部函数的执行结束而销毁每次调用内部函数都会基于上一次的结果进行计算不需要使用全局变量就能实现状态的保持避免了全局变量污染四、总结 闭包是 Python 中一个强大的特性它通过外部函数嵌套内部函数并让内部函数引用外部函数的变量同时返回内部函数实现了数据的封装和状态的保持。 合理使用闭包可以提高代码的封装性和安全性但也要注意其可能带来的内存问题。在实际开发中应根据具体场景权衡使用遵循 必要时才使用 的原则。 掌握闭包不仅有助于理解 Python 的变量作用域也是学习装饰器等高级特性的基础。希望通过本文的讲解和案例能帮助大家更好地理解和运用 Python 闭包。