1、闭包的概念:

  1. 如果在一个函数中,定义了另外一个函数,并且那个函数使用了外面函数的变量,并且外面那个函数返回了里面这个函数的引用,那么称为里面的这个函数为闭包。

2、话不多说,以demo示例:

  1. def Gen(x):
    def fun(y):
    return x+y
    return fun
  1. G = Gen(5) == 等同于 Gen(x)(y)
    print(G(5))
    其中 fun函数就是闭包的意思

3、闭包实现简单的计算器实战

  1. 闭包操作简单计算器

    def calculator(option):
    operator = None
    if option == 1:
    def add(x,y):
    return x+y
    operator = add
    elif option == 2:
    def minus(x,y):
    return x-y
    operator = minus
    elif option == 3:
    def multiply(x,y):
    return x*y
    operator = multiply
    elif option == 4:
    def divide(x,y):
    return x/y
    operator = divide
    else:
    print('输入有误!')
    return operator

    cal = calculator(3)
    ret = cal(2,2)
    print(ret)

4、nonlocal关键字概念

  1. 如果想要在闭包中修改外面函数的变量,这时候应该使用nonlocal关键字,来把这个变量标识为外面函数的变量:
  1. def greet(name):
    def say_hello():
    nonlocal name
    name += 'hello'
    print('hello my name is %s' % name)
    return say_hello
    greet('Auawei')()

5、装饰器概念:

  1. # 装饰器利用了函数也可以作为参数传递和闭包的特性,可以让我们的函数在执行之前或者执行之后方便的添加一些代码。
    # 这样就可以做很多事情了,比如@classmethod装饰器可以将一个普通的方法设置为类方法,@staticmethod装饰器可以将一个普通的方法设置为静态方法等。
    # 所以明白了装饰器的原理以后,我们就可以自定义装饰器,从而实现我们自己的需求
  1. is_user = {
    'username':True
    }

    def case():
    def login_pw(func):
    def wapper():
    if is_user['username'] == True:
    func()
    else:
    print('跳转到登录界面')
    return wapper

    @login_pw
    def edit_user():
    print('编辑用户成功')

    @login_pw
    def add_attr():
    print('新增属性成功')

    # edit_user() ==login_pw(edit_user)()
    edit_user()
    add_attr()
    case()

    其中在edit_user函数上加上@login_pw表示函数装饰器,edit_user() 等同于 login_pw(func)()
    实际上就是 login_pw(edit_user)在运行wapper函数,判断成功后再次运行edit_user()函数。
  1. # 被装饰的函数带有参数该如何解决

    is_user = {
    'username':True
    }

    def case():
    def login_pw(func):
    # *args 位置参数 **kwargs 关键字参数 两者组合再一起是万能参数
    def wapper(*args,**kwargs):
    if is_user['username'] == True:
    func(*args,**kwargs)
    else:
    print('跳转到登录界面')
    return wapper

    @login_pw
    def edit_user(username):
    print('编辑用户成功:%s'%username)

    @login_pw
    def add_attr(title,context):
    print('新增属性成功,标题: %s,内容: %s'%(title,context))

    # edit_user() ==login_pw(edit_user)()
    edit_user('Teacher')
    add_attr('博客园','更新博客')
    case()

    # 带参数的装饰器:
    # 装饰器也可以传递参数。

    def login_required(site='front'):
    def outter_wapper(func):
    def innter_wapper(*args,**kwargs):
    if site == 'front':
    if is_user['username'] == True:
    print('进入前台界面')
    func(*args,**kwargs)
    else:
    print('返回登录前台首页')
    else:
    if is_user['username'] == True:
    print('进入后台界面')
    func(*args,**kwargs)
    else:
    print('返回登录后台首页')
    return innter_wapper
    return outter_wapper

    @login_required()
    def edit_user(username):
    print('编辑用户成功:%s' % username)

    @login_required("flase")
    def add_attr(title,context):
    print('新增属性成功,标题: %s,内容: %s'%(title,context))

    edit_user('KTModel1111')
    add_attr('Title','Teather')
  1. # wraps装饰器:
    from functools import wraps

    def login_required(func):
    @wraps(func)
    def wrapper1(*args,**kwargs):
    if is_user['username'] == True:
    func(*args,**kwargs)
    else:
    print('跳转到登录页面')
    return wrapper1

    @login_required
    def edit_user1(username):
    print('用户名修改成功:%s'%username)

    edit_user1('Key')
    print(edit_user1.__name__)

    # 实战:实现一个可以计算一个函数用时多久的装饰器

    from time import time
    from functools import wraps

    def cal(func):
    @wraps(func)
    def wrapper(*args,**kwargs):
    start = time()
    func(*args,**kwargs)
    end = time()
    ctime = end - start
    print('函数计算时间间隔为%f'%ctime)
    return wrapper

    @cal
    def Add(x,y):
    print(x*y)

    Add(6,4)


Python基础之函数的闭包与装饰器的介绍的更多相关文章

  1. 13、python中的函数(闭包与装饰器)

    一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函 ...

  2. python基础(三)闭包与装饰器

    闭包(closure): 内嵌函数通过调用外部嵌套函数作用域内的变量,则这个内嵌函数就是闭包. 闭包必须满足三个条件: 必须有一个内嵌函数 内嵌函数必须引用外部嵌套函数中的变量 外部函数的返回值必须是 ...

  3. 一文搞懂Python函数(匿名函数、嵌套函数、闭包、装饰器)!

    Python函数定义.匿名函数.嵌套函数.闭包.装饰器 目录 Python函数定义.匿名函数.嵌套函数.闭包.装饰器 函数核心理解 1. 函数定义 2. 嵌套函数 2.1 作用 2.2 函数变量作用域 ...

  4. day20_函数的闭包 与 装饰器

    #!/usr/bin/env python # -*- coding:utf-8 -*- # # 一些文章 # https://www.cnblogs.com/Vae1242/p/6944338.ht ...

  5. Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析

    Python使用property函数和使用@property装饰器都能定义属性的get.set及delete的访问方法,他们的相同点主要如下三点: 1.定义这些方法后,代码中对相关属性的访问实际上都会 ...

  6. Python之路【第五篇】: 函数、闭包、装饰器、迭代器、生成器

    目录 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之可迭代对象 函数之迭代器 函数之生成器 面向过程的程序设计思想 一.函数进阶之函数对象 1. 函数对象 秉承着 ...

  7. 第十七篇 Python函数之闭包与装饰器

    一. 装饰器 装饰器:可以拆解来看,器本质就是函数,装饰就是修饰的意思,所以装饰器的功能就是为其他函数添加附加功能. 装饰器的两个原则: 1. 不修改被修饰函数的源代码 2. 不修改被修饰函数的调用方 ...

  8. Python的高级特性7:闭包和装饰器

    本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...

  9. python基础之:九步认识装饰器

    step1. 先看个代码吧: def f(): ') f=lambda a:a +100 #覆盖上面的函数f print(f) #函数名指函数所在内存中的位置,入带后面括号表示执行函数 print(f ...

随机推荐

  1. Java设计模式:23种设计模式全面解析(超级详细)以及在源码中的应用

    从网络上找的设计模式, 很全面,只要把UML类图看懂了, 照着类图将代码实现是很容易的事情. 步骤: 先看懂类图, 然后将代码实现, 之后再看文字 http://c.biancheng.net/des ...

  2. Linux芯片驱动之SPI Controller

    针对一款新的芯片,芯片厂商如何基于Linux编写对应的 SPI controller 驱动? 我们先看看 Linux SPI 的整体框架: 可以看到,最底层是硬件层,对应芯片内部 SPI contro ...

  3. 用Java如何设计一个阻塞队列,然后说说ArrayBlockingQueue和LinkedBlockingQueue

    前言 用Java如何设计一个阻塞队列,这个问题是在面滴滴的时候被问到的.当时确实没回答好,只是说了用个List,然后消费者再用个死循环一直去监控list的是否有值,有值的话就处理List里面的内容.回 ...

  4. 【VBA】返回指定范围内的随机整数

    返回指定范围内的随机整数: Sub main() Randomize Debug.Print 随机整数(1, 2) End Sub Function 随机整数(a As Integer, b As I ...

  5. Web 动画原则及技巧浅析

    在 Web 动画方面,有一套非常经典的原则 -- Twelve basic principles of animation,也就是关于动画的 12 个基本原则(也称之为迪士尼动画原则),网上对它的解读 ...

  6. 【NLP学习其一】什么是命名实体识别NER?

    命名实体识别 概念 命名实体识别(Named Entity Recognition,简称NER) , 是指识别文本中具有特定意义的词(实体),主要包括人名.地名.机构名.专有名词等等,并把我们需要识别 ...

  7. Java基准性能测试--JMH使用介绍

    JMH是什么 JMH是Java Microbenchmark Harness的简称,一个针对Java做基准测试的工具,是由开发JVM的那群人开发的.想准确的对一段代码做基准性能测试并不容易,因为JVM ...

  8. python3实现几种常见的排序算法

    python3实现几种常见的排序算法 冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要 ...

  9. Opencv 播放mp4文件和读取摄像头图以及可能会发生的一些异常问题解决方法

    学习内容 学习Opencv 读取并播放本地视频和打开摄像头图像以及可能会发生的一些异常问题解决方法 代码演示 电脑环境信息: OpenCV版本:4.5.2 ,vs2017 1.视频文件读取与播放 加载 ...

  10. AcWing 106. 动态中位数

    依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. #include<bits/stdc++.h> using namespace std; pri ...