Python的闭包和装饰器你真的了解吗

目录
  • 闭包
  • 装饰器
  • 总结

闭包

闭包就是能够读取其他函数内部变量的函数。

def test1(k, b):
    def test1_1(x):
        print(k*x+b)
    return test1_1
t1 = test1(1, 2)
t1(0)
t1(1)
t1(2)

闭包中修改数据

x = 300
def test1():
    x = 200
    def test2():
        nonlocal x
        print("----1----x = {}".format(x))
        x = 100
        print("----2----x = {}".format(x))
    return test2
t1 = test1()
t1()

装饰器

实现对无参数函数的装饰器

def set_func(func):
    def call_func():
        print("装饰器执行")
        func()
    return call_func
@set_func   # 等价于sumNum = set_func(sumNum)
def sumNum():
    print("sumNum")
sumNum()

实现对有参数函数的装饰器

# 对有参数、无返回值的函数进行装饰
def set_func(func):
    def call_func(num):
        print("装饰器")
        func(num)
    return call_func
@set_func
def sumNum(num):
    print("sumNum = {}".format(num))
sumNum(100)

对不定长参数的函数进行装饰

def set_func(func):
    def call_func(*args, **kwargs):
        print("装饰器")
        func(*args, **kwargs)  # 拆包
    return call_func
@set_func
def sumNum(num, *args, **kwargs):
    print("sumNum = {}".format(num))
    print("args = {}".format(args))
    print("kwargs = {}".format(kwargs))
sumNum(100, 200, c=100)

对有返回值的函数进行装饰

def set_func(func):
    def call_func(*args, **kwargs):
        print("装饰器")
        return func(*args, **kwargs)  # 拆包
    return call_func
@set_func
def sumNum(num, *args, **kwargs):
    print("sumNum = {}".format(num))
    print("args = {}".format(args))
    print("kwargs = {}".format(kwargs))
    return "200 ok"
sumNum(100, 200, c=100)

多个装饰器对同一个函数装饰

def add_h1(func):
    def h1():
        h1_str = "<h1>" + func() + "</h1>"
        return h1_str
    return h1

def add_a(func):
    def call_func():
    	a_str = "<a>" + func() + "</a>"
        return a_str
    return call_func

@add_h1
@add_a
def get_str():
    return "haha"
get_str()

输出为:<h1><a>haha</a></h1>

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • python总结之闭包和装饰器

    目录 一.装饰器 1. 装饰器的简单介绍 2. 装饰器的解析过程 二.闭包 三.闭包中nonlocal语句的使用 1. 外部变量的引用和改写 2. nolocal的使用及特点 四.闭包与装饰器 五.闭包的作用 六.几个小栗子 栗子1: 栗子2: 栗子3 七.特殊的装饰器 property 装饰器 1. 我们为什么需要用到property 2. 使用Getters和Setters 3. property的作用 4. 小栗子 staticmethod装饰器和classmethod装饰器 step1:

  • Python 中闭包与装饰器案例详解

    项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 1.Python中一切皆对象 这恐怕是学习Python最有用的一句话.想必你已经知道Python中的list, tuple, dict等内置数据结构,当你执行: alist = [1, 2, 3] 时,你就创建了一个列表对象,并且用alist这个变量引用它: 当然你也可以自己定义一个类: class House(object): def __init__(self, are

  • python高级语法之闭包和装饰器详解

    一.闭包 闭包的形成条件: 1.函数嵌套. 2.内部函数使用了外部函数的变量或者参数. 3.外部函数返回了使用外 部变量的内部函数. 二.一个简单的例子 def func_out(num1): def inner(num2): res = num1 + num2 print(res) return inner # a = func_out(10)(10) a = func_out(10) a(10) 闭包修改外部函数的变量: 在闭包内修改外部函数的变量需要使用nonlocal关键字 def fu

  • python闭包和装饰器你了解吗

    目录 一.闭包 1. 什么是闭包? 2. 形成闭包的三个条件(缺一不可) 3. 闭包的原理 4. 闭包的好处 二.装饰器 1. 什么是装饰器 2. 装饰器有什么用 3. 小 练 习 三. 编写和使用装饰器 1. 小案例 2.应用注意事项 3.保留元数据-什么是元数据 4.保留元数据-装饰器后为什么元数据会丢失 5.保留元数据 6.小案例 7.内置的装饰器 四. 装饰器的应用 1.为什么使用装饰器 2.在何处使用装饰器 五. 课后作业 1.实现函数注册表 2.完善三创购物系统 总结 一.闭包 1.

  • Python必备基础之闭包和装饰器知识总结

    一.闭包 1.1 三要素 必须有一个内嵌函数 内嵌函数必须引用外部函数中变量 外部函数返回值必须是内嵌函数 1.2 语法 # 语法 def 外部函数名(参数): 外部变量 def 内部函数名(参数): 使用外部变量 return 内部函数名 # 调用 变量 = 外部函数名(参数) 变量(参数) 举个例子 def func01(): # 外部函数 a = 1 # 外部变量 print('外部变量:',a) def func02(num): #内部函数 print("调用内部函数后:",n

  • Python的闭包和装饰器你真的了解吗

    目录 闭包 装饰器 总结 闭包 闭包就是能够读取其他函数内部变量的函数. def test1(k, b): def test1_1(x): print(k*x+b) return test1_1 t1 = test1(1, 2) t1(0) t1(1) t1(2) 闭包中修改数据 x = 300 def test1(): x = 200 def test2(): nonlocal x print("----1----x = {}".format(x)) x = 100 print(&q

  • 简析Python的闭包和装饰器

    什么是装饰器? 装饰器(Decorator)相对简单,咱们先介绍它:"装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数",听起来有点绕,没关系,直接看示意图,其中 a 为与装饰器 @a 对应的函数, b 为装饰器修饰的函数,装饰器@a的作用是: 简而言之:@a 就是将 b 传递给 a(),并返回新的 b = a(b) 栗子: 上面使用@dobi来表示装饰器,其等同于:qinfeng = dobi(qinfeng) 因此装饰器本质

  • 深入理解python中的闭包和装饰器

    python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python2.7,其他版本可能存在差异. 也许直接看定义并不太能明白,下面我们先来看一下什么叫做内部函数: def wai_hanshu(canshu_1): def nei_hanshu(canshu_2): # 我在函数内部有定义了一个函数 return canshu_1*canshu_2 return

  • 详解 Python中LEGB和闭包及装饰器

    详解 Python中LEGB和闭包及装饰器 LEGB L>E>G?B L:local函数内部作用域 E:enclosing函数内部与内嵌函数之间 G:global全局作用域 B:build-in内置作用域 python 闭包 1.Closure:内部函数中对enclosing作用域变量的引用 2.函数实质与属性 函数是一个对象 函数执行完成后内部变量回收 函数属性 函数返回值 passline = 60 def func(val): if val >= passline: print (

  • Python闭包和装饰器用法实例详解

    本文实例讲述了Python闭包和装饰器用法.分享给大家供大家参考,具体如下: Python的装饰器的英文名叫Decorator,作用是完成对一些模块的修饰.所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能)侵入到原有的模块中的代码里去. 闭包 1.函数引用 #coding=utf-8 def test1(): print('This is test1!') #调用函数 test1() #引用函数 ret = test1 #打印

  • 详解python中的生成器、迭代器、闭包、装饰器

    迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1|1可迭代对象 以直接作用于 for 循环的数据类型有以下几种: 一类是集合数据类型,如 list . tuple . dict . set . str 等: 一类是 generator ,包括生成器和带 yield 的generator function. 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable .

  • Python高级特性之闭包与装饰器实例详解

    本文实例讲述了Python高级特性之闭包与装饰器.分享给大家供大家参考,具体如下: 闭包 1.函数参数: (1)函数名存放的是函数的地址 (2)函数名()存放的是函数内的代码 (3)函数名只是函数代码空间的引用,当函数名赋值给一个对象的时候,就是引用传递 def func01(): print("func01 is show") test = func01 print(func01) print(test) test() 结果: 2.闭包: (1)内层函数可以访问外层函数变量 (2)闭

  • Python 中的函数装饰器和闭包详解

    函数装饰器可以被用于增强方法的某些行为,如果想自己实现装饰器,则必须了解闭包的概念. 装饰器的基本概念 装饰器是一个可调用对象,它的参数是另一个函数,称为被装饰函数.装饰器可以修改这个函数再将其返回,也可以将其替换为另一个函数或者可调用对象. 例如:有个名为 decorate 的装饰器: @decorate def target(): print('running target()') 上述代码的写法和以下写法的效果是一样的: def target(): print('running targe

随机推荐