我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python---闭包

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python---闭包

1.闭包理解

  1. 闭包定义:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包

2.必报的构成条件:

  • 在函数嵌套(函数里面在定义函数)的前提下

  • 内部函数使用了外部函数的变量(还包括外部函数的参数)

  • 外部函数返回了内部函数

3.闭包书写步骤:

  • 定义外部函数

  • 定义外部函数,在内部函数中使用外部函数的变量

  • 外部函数返回内部函数的地址

代码需求:一个初始值 num对 num 的基础上进行 加法运算
# 定义内部函数:def outer(num):    # 2.定义内部函数,在内部函数中使用外部函数的变量    def inner(num1):        print(num + num1)    # 3.外部函数返回内部函数的地址    return inner  # 函数名字就是函数地址if __name__ == '__main__':    # 创建闭包实例    func = outer(100)  # 此时func相当于是inner    # 调用闭包    func(10)  # 此时调用inner函数,保存的num值为100# 可以创建多个闭包实例,不同的闭包实例之间,不会相互影响

2.闭包的使用

  1. 案例:根据配置信息使用闭包实现不同人的对话信息,例如对话:

张三:到北京了吗?

李四:已经到了,放心吧。

  1. 实现步骤说明

  • 定义外部函数接受不同的配置信息参数,参数是人名

  • 定义内部函数接受对话信息参数

  • 在内部函数里面把配置信息和对话信息进行拼接输出

def outer(name):    # 定义内部函数,参数是 说话的信息    print(f'{name}:到北京了吗?')    def inner(name1):        # 内部函数中,将name和info进行拼接输出        print(f'{name1}:已经到了,放心吧。')    # 外部函数返回内部函数的地址    return inner# 创建闭包实例if __name__ == '__main__':    func = outer('张三')    func('李四')

注意点:由于闭包引用了外部函数的变量,则外部函数的变量没有及时释放,消耗内存。

3.闭包修改外部函数变量(理解)

函数内部想要修改全局变量,使用global关键字
在闭包函数内部,想要修改外部函数的局部变量,需要使用nonlocal关键字
def outer():    num = 10    def inner():        # num = 100  # 不是修改外部变量的值,重新定义的局部变量        nonlocal num  # 声明使用外部变量 num 不重新定义        num = 100    print(f'调用inner之前:{num}')    inner()    print(f'调用inner之后:{num}')    return innerfunc = outer()func()

4.装饰器(理解)

装饰器的功能:就是给已有函数添加新的功能           1.不修改已有函数的1源代码           2.不修改已有函数的调用方式           3.给函数添加功能 装饰器本质就是一个闭包函数,只不过比较特殊1.定义外层函数(要求参数只有一个,类型是函数类型,调用时传参传递的是原函数)2.定义内层函数,在内层函数中,书写新的功能,并在合适的时机调用原函数3.返回内部函数的地址 装饰器的书写方法: 新的功能和原函数进行对比,查看需要的新的功能,将新功能书写在inner的内层函数中案例需求:原函数: comment()  一个评论功能新的需求:在评论之前,检查是否登录
# -------------------装饰器-----------------def login_check(fn):    def inner():        # 书写新的功能,使用print进行模拟        print('登录验证......')        # 新的功能书写完成之后,调用原函数        fn()    return inner# 装饰器的语法糖格式,@login_check  # comment =login_check(comment)def comment():    # 使用print输出模拟评论功能    print('进行评论检查......')# 在调用之前创建闭包实例# func = login_check(comment)comment = login_check(comment)if __name__ == '__main__':    comment()

5.装饰器语法糖格式替换时机

def func():    pass  func()需求:统计函数执行所消耗的时间(新)1.执行函数前记录当前时间2.执行函数3.函数执行结束之后,再次记录当前时间(新)两次的时间差就是就是函数执行的时间
-----装饰器语法糖格式替换时机-----import time# 定义装饰器函数:def calc_time(fn):    def inner():        # 记录当前时间        start = time.time()  # 记录当前时间的秒数        fn()        end = time.time()        print(f'函数耗时{end - start}')    return inner# 定义原函数@calc_timedef func():    for i in range(10):        print(i)        time.sleep(0.3)    print('函数执行')if __name__ == '__main__':    func()

6.装饰器输出日志信息

需求:   def func1():       pass   def func2():       pass在每次进入函数时:输出 func1 enter......函数执行结束之后,输出 func leave.....分析步骤:1.函数执行前,输出func1 enter....2.执行函数3.执行结束, 输出 func1 leave.....
# 定义原函数:def logger(fn):    def inner(*args, **kwargs):        print(f'{fn.__name__} enter....')        fn(*args, **kwargs)        print(f'{fn.__name__} leave....')    return inner@loggerdef comment1():    print('评论功能:')@loggerdef func(num):    print(num)if __name__ == '__main__':    comment1()    func(10)

11.装饰带返回值的函数

不管原函数有没有返回值,装饰器的内部函数都应该将fn函数的返回值进行返回

  1. 如果原函数有返回值,返回的就是原函数的返回值

  1. 如果没有返回的是None

#     func(10)# ----装饰带返回值的函数---def logger(fn):    def inner(*args, **kwargs):        print(f'{fn.__name__} enter....')        result=fn(*args, **kwargs)        print(f'{fn.__name__} leave....')        # 函数没有书写返回值,默认返回None        return result    return inner@loggerdef func(into):    return into@loggerdef my_sum(a, b):    return a + bif __name__ == '__main__':    print(func('hello'))    print(func((3, 6)))

12.通用装饰器

def decorate(fn):    def inner(*args,**kwargs):          ...        result=fn(*args,**kwargs)        return result     return inner

13.多个装饰器装饰同一个函数

def comment(info):   return info  1.书写一个装饰器 给原函数的返回值加上p 标签

返回值

2.书写一个装饰器,给 原函数加上 div标签
返回值
# ---多个装饰器装饰同一个函数----def make_p(fn):    def inner(info):        result = fn(info)        return '

' + result + '

' return inner### @make_p# def comment(info):# return info### if __name__ == '__main__':# print(comment('hello world'))def make_div(fn): def inner(info): result = fn(info) return '
' + result + '
' return inner# 多个装饰器装饰同一个函数,装饰顺序是就近原则,谁离原函数近,就先装饰谁# 1.comment =make_p(comment)# 2.comment =make_div(comment)@make_div@make_pdef comment(info): return infoif __name__ == '__main__': print(comment('hello world!'))

14.带参数的装饰器

# 装饰器  make_tag@make_tag('div')@make_tag('p')def comment():    pass1.当代码执行到第4行,@make_tag('div')  def make_tag(tag):   返回一个装饰器
def make_tag(tag):    # 返回一个装饰器    def decorate(fn):        def inner(*args, **kwargs):            result = fn(*args, **kwargs)            return f'<> {tag}>{result}

15.题目训练加强

1.闭包的特点是什么?

1.外部函数中定义了一个内部函数
2.外部函数总是返回内部函数的引用
3.内部函数可以使用外部函数提供的环境变量

2.创建一个闭包,实现统计函数执行的次数功能

有如下调用闭包函数的代码

f=func_count()f()f()f()
def func_count():    num = 0    def inner():        nonlocal num        num += 1        print('hello world')        print(f'共执行次数{num}')    return innerif __name__ == '__main__':    f = func_count()    # 调用闭包    f()    f()    f()

3.实现装饰器,实现对函数执行时间进行计算的能力

import timedef outer(fn):    def inner():        start = time.time()        fn()        end = time.time()        print(f'{end - start}')    return inner@outerdef func():    for i in range(10):        print(i)        time.sleep(0.3)if __name__ == '__main__':    func()

4.一个函数,返回一个字符串,使用装饰器实现对这个字符串添加后缀.txt

def func(fn):    def inner(info):        result = fn(info)        return result + '.txt'    return inner@funcdef comment(into):    return intoif __name__ == '__main__':    print(comment('hello world'))

来源地址:https://blog.csdn.net/zzh_love/article/details/129007703

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python---闭包

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

2023-09-02

python闭包

闭包    1,闭包是嵌套在函数中的    2,闭包是内层函数对外层函数的变量的引用(改变)    3,闭包需要将其作为一个对象返回,而且必须逐层返回闭包举例:    def wrapper():        name = "ghl"  
2023-01-31

python 闭包

这里主要讲解我对于闭包的理解,不太深入,浅谈浅谈哈1、说到闭包我就想先说函数名与变量之间的区别def test(name): def test_in(): print(name) print(locals())te
2023-01-30

python 闭包详解

闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。函数和对象的
2023-01-31

Python闭包与闭包陷阱举例详解

闭包并不只是一个Python中的概念,在函数式编程语言中应用较为广泛,下面这篇文章主要给大家介绍了关于Python闭包与闭包陷阱的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-01-28

谈谈自己的理解:python中闭包,闭包

闭包这个概念好难理解,身边朋友们好多都稀里糊涂的,稀里糊涂的林老冷希望写下这篇文章能够对稀里糊涂的伙伴们有一些帮助~请大家跟我理解一下,如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数。闭包:   在一个外函
2023-01-31

python闭包有哪些

python闭包主要包括函数闭包和装饰器闭包。详细介绍:1、函数闭包是指在一个函数内部返回另一个函数,并且返回的函数能够访问到其内部变量。这样的返回函数就是函数闭包,函数闭包在程序中可以被反复使用,因此可以用来实现一些功能上的封装;2、装饰
python闭包有哪些
2023-10-30

python 闭包&装饰器(一)

一、闭包1.举例def outer(): x = 10 def inner(): # 内部函数 print(x) # 外部函数的一个变量 return inner# 调用inner()函数的方法ou
2023-01-30

Python闭包怎么实现

本篇内容介绍了“Python闭包怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、闭包的概念请大家跟我理解一下,如果在一个函数的内部
2023-06-29

理解python中的闭包

一 什么是闭包?在一个函数内部嵌套定义了另一个函数,其中内部函数使用了外部函数作用域的变量(自由变量),并且外部函数的返回值是内部函数的引用,当外部函数结束时,外部函数的变量会被绑定到内部函数,由此就构成了闭包。闭包的本质是一个函数,它有两
2023-01-31

Python闭包技巧是什么

这篇文章主要讲解了“Python闭包技巧是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python闭包技巧是什么”吧!1.闭包:用函数代替类有时我们会定义只有一个方法(除了__init
2023-06-21

Python中的闭包怎么用

这篇文章主要介绍Python中的闭包怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、闭包概念闭包在函数中提出的概念,简单来说就是一个函数定义中引用了函数外定义的变量,并且该函数可以在其定义环境外被执行。这样的
2023-06-25

Python闭包函数的用法

本篇内容主要讲解“Python闭包函数的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python闭包函数的用法”吧!简而言之, 闭包的特点就是内部函数引用了外部函数中的变量。 在Pytho
2023-06-02

闭包

返回函数不可以引用后续可能会发生变化的变量如果引用,则返回函数的返回值是基于变量最新的值计算而得的如循环变量i,如果返回函数体内用到了i,则i的值是最后一次循环的i的值使用示例  返回函数引用循环变量  def count():   
2023-01-31

Python之类方法,lambda,闭包

类方法lambda闭包classmethodstaticmethodinstancemethod类方法类方法,通过装饰器@classmethod来标明,可以通过实例对象或类对象直接调用的方法。class MyClass(object):
2023-01-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录