python基础---闭包

闭包

**闭包函数:**声明在一个函数中的函数,叫做闭包函数。

**闭包:**内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。

这一个和类比较类似, 属性加方法, 但是比较轻量

  • 特点

让外部访问函数内部变量成为可能;

局部变量会常驻在内存中;

可以避免使用全局变量,防止全局变量污染;

会造成内存泄漏(有一块内存空间被长期占用,而不被释放)

一个函数里面嵌套另一个函数, 里面的函数使用了外部函数的局部变量

python 复制代码
def who(name):
    def do(content):
        print("(%s):%s" % (name, content))
    return do


zhangsan = who("zhangsan")
lisi = who("lisi")

zhangsan("hello")
lisi("world")

实际就是使用使用一个函数生成另一个函数, 这一个函数实用了外部变量

可以使用dwl对这个闭包进行释放

改变变量

在闭包里面如果没有使用特殊的关键字进行声明, 外部函数里面的变量不能直接修改, 加一个nonlocal之后就可以修改了

python 复制代码
def counter(start = 0):
    def increment():
        nonlocal start
        start += 1
        return start
    return increment

c = counter()
print(c())
print(c())
print(c())
c1 = counter(10)
print(c1())
print(c1())

示例

python 复制代码
def make_filter(keep):
    def the_filter(file_name):
        file = open(file_name)
        lines = file.readlines()
        file.close()
        filter_doc = [i for i in lines if keep in i]
        return filter_doc
    return the_filter

filter = make_filter("python")
print(filter("main.py"))
相关推荐
七月稻草人4 分钟前
飞算JavaAI:人工智能与Java的创新融合与应用前景
开发语言·人工智能·ai编程·java开发·飞算javaai炫技赛
励志成为糕手10 分钟前
从反射到方法句柄:深入探索Java动态编程的终极解决方案
java·开发语言
是乐谷32 分钟前
饿了么招java开发咯
java·开发语言·人工智能·程序人生·面试·职场和发展
hongjunwu36 分钟前
Java集合的遍历方式(全解析)
java·开发语言·windows
cccc来财1 小时前
Golang的本地缓存freecache
java·开发语言·jvm
Vallelonga1 小时前
关于 Rust 异步(无栈协程)的相关疑问
开发语言·后端·rust
q567315231 小时前
Rust爬虫与代理池技术解析
开发语言·爬虫·python·rust
Dxy12393102161 小时前
Python如何合并两个Excel文件
爬虫·python·excel
Alt.92 小时前
SpringMVC(二)
java·开发语言·mvc
fsnine2 小时前
数字图像处理基础——opencv库(Python)
人工智能·python·opencv