Python_复习_33

+# 函数 —— 2天    # 函数的定义和调用    # def 函数名(形参):        #函数体        #return 返回值    #调用 函数名(实参)    # 站在形参的角度上 : 位置参数,*args,默认参数(陷阱),**kwargs    # 站在实参的角度上 : 按照位置传,按照关键字传    # 返回值:没有返回值 返回一个值 返回多个值    # 接收返回值:没有返回值不接收,返回一个值用一个变量接收,返回多个值用一个变量或者对应数目的变量接收# 闭包函数 —— 在内部函数引用外部函数的变量# 装饰器函数—— 装饰器一定是闭包函数    # 装饰器的作用 : 在不改变原来函数的调用方式的情况下 在这个函数的前后添加新的功能    # 完美的符合了一个开发原则 :开放封闭原则        # 对扩展是开发的        # 对修改是封闭的    # 基础的装饰器        # from functools import wraps        # def wrapper(func):        #     @wraps(func)        #     def inner(*args,**kwargs):        #          ‘‘‘在函数被调用之前添加的代码‘‘‘        #         ret = func(*args,**kwargs)   # func是被装饰的函数 在这里被调用        #         ‘‘‘在函数被调用之后添加的代码‘‘‘        #         return ret        #     return inner        # 使用 —— @wrapper        # @wrapper        # def func():   #inner        #     pass        #        # func.__name__

不使用functools.wraps的装饰器:
def tracer(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        print(‘%s(%r,%r)->%r‘%(func.__name__,args,kwargs,result))
        return result
    return wrapper

@tracer
def fibonacci(n):
    if n in (0,1):
        return n
    return (fibonacci(n-1)+fibonacci(n-2))

fibonacci(3)
print(fibonacci)
print(‘help:‘)
help(fibonacci)

结果:

可以看到,装饰器完全可以正常工作。。。

但是,函数的名字变成装饰器中的包装器了!!!help内置函数也失效了

也就是说,原函数的属性失效了

如果想要保留原函数的属性,就可以用到functools.wraps了

from functools import wraps
def tracer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        print(‘%s(%r,%r)->%r‘%(func.__name__,args,kwargs,result))
        return result
    return wrapper

@tracer
def fibonacci(n):
    if n in (0,1):
        return n
    return (fibonacci(n-1)+fibonacci(n-2))

fibonacci(3)
print(fibonacci)
print(‘help:‘)
help(fibonacci)

结果:


    # 带参数的装饰器        # @wrapper -- > @warapper(argument)        # 三层嵌套函数        # def outer(形参):        #     def wrapper(func):        #         def inner(*args,**kwargs):        #             ‘‘‘在函数被调用之前添加的代码‘‘‘        #             ret = func(*args,**kwargs)   # func是被装饰的函数 在这里被调用        #             ‘‘‘在函数被调用之后添加的代码‘‘‘        #             return ret        #         return inner        #     return wrapper        # @outer(True)        # def func():        #     pass    # 多个装饰器装饰一个函数        # 俄罗斯套娃

    #def wrapper1(func):        #     @wraps(func)        #     def inner(*args,**kwargs):        #         print(‘before 1‘)        #         print(‘******‘)        #         ret = func(*args,**kwargs)   # func是被装饰的函数 在这里被调用        #         ‘‘‘在函数被调用之后添加的代码‘‘‘        #         return ret    # def wrapper2(func):    #     @wraps(func)    #     def inner(*args,**kwargs):    #         print(‘before 2‘)    #         ret = func(*args,**kwargs)   # func是被装饰的函数 在这里被调用    #         ‘‘‘在函数被调用之后添加的代码‘‘‘    #         return ret    #   @wrapper1    #   @wrapper2    #   def func():    #       print(‘111‘)# 迭代器和生成器 —— 两天# 内置函数 —— 两天

原文地址:https://www.cnblogs.com/LXL616/p/10668323.html

时间: 2024-08-30 15:09:56

Python_复习_33的相关文章

Python_复习1

1:#r模式,在文件不存在时,不会创建新的文件 f = open('a.txt','r',encoding = 'utf-8') 2:字符编码 什么是字符编码? 把人类的字符翻译成计算机能认识的数字 什么是字符编码表? ASCII GBK UTF-8 Unicode unicode-------->encode('utf-8')-------------->bytes bytes------------>decode('utf-8')--------------->unicode

Python_复习_习题

# 之前做得的题 以后再遇到能保证会# 下周二考 :所有的知识# 面试题:认真对待## 三元运算符# 接收结果的变量 = 条件为真的结果 if 条件 else 条件为假的结果# 接收结果的变量 = “真结果” if 条件 else “假结果”## 命名空间 和 作用域# 三种:内置 全局 局部# 作用域:全局 局部 globals() locals()# global 在局部声明一个全局变量# nonlocal 在局部声明最近的上一层局部中的变量# 作用域链 : 小范围用变量的时候,先从自己的名

Python_装饰器复习_30

复习: # 装饰器的进阶 # functools.wraps # 带参数的装饰器 # 多个装饰器装饰同一个函数# 周末的作业 # 文件操作 # 字符串处理 # 输入输出 # 流程控制 # 装饰器# 开发原则 : 开放封闭原则# 装饰器的作用 :在不改变原函数的调用方式的情况下,在函数的前后添加功能# 装饰器的本质 : 闭包函数 def wrapper(func): def inner(*args,**kwargs): print('在被装饰的函数执行之前做的事') ret = func(*arg

Python_迭代器和生成器的复习_38

迭代器和生成器 迭代器: 双下方法:很少直接调用的方法,一般情况下,是通过其他方法触发的 可迭代的协议——可迭代协议 含有__iter__ 的方法 ('__iter__' in dir(数据)) 可迭代的一定可以被for循环 迭代器协议:含有 __iter__ 和 __next__ 方法 迭代器一定可以迭代, 可迭代的通过调用 __iter__() 方法就能得到一个迭代器 迭代器的特点: 很方便的使用,一个迭代器只能从前往后,取一次 节省内存空间 生成器: 生成器的本质就是迭代器 生成器的表现形

C++基础复习

一. C++与C的比较: C语言是一个结构化语言,它的重点在于算法和数据结构,C语言的设计首先要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到的输出(或实现过程(事物)控制). C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事物)控制. 所以C语言和C++的最大区别在于它们解决问题的思想不同,一个面向过程一个面向对象. C++对C的"增强",表现在六个方面: 1.类型检测更为严格. 2.

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 责任链模式概念和例子 使用的条件 和状态模式的比较分析 责任链的优缺点 纯的责任链和不纯的责任链 javax.servlet.Filter#doFilter()方法源码分析 基于AOP思想,模拟一个拦截器 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂业务逻辑判断的,那么他们有什么不同呢?回忆状态模式——状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象

算法分析与设计复习

算法分析与设计复习 2016年初,研一上学期期末考试前,复习并总结算法分析与设计科目的内容.复习过程参照<算法导论>中文第2版,同时参照PPT,章节划分根据PPT内容 概要: 第一章 概述 第二章 插入排序&分治策略 第三章 复杂度分析 第四章 堆与堆排序 第五章 快速排序 第六章 线性时间排序 第一章 概述 算法的应用范围 算法在诸如生物等诸多领域有其应用 算法的意义 算法在很多情况下让不可能完成的事情变成了可能,让处理的很慢的过程变快. 一个铺垫 一串不全为0的数,怎么取能拿到一段

复习PHP-语言参考-预定义接口

1.Traversable 他是一个遍历接口规范 注意:发现一个有用的函数get_declared_classes,可以以数组形式显示当前脚本下所有已经定义的类名 2.Iterator Iterator迭代器继承自Traversable,是一种遍历对象内容的对象. 你可以自己写一个子类继承自它,并写上具体遍历的方法. Iterator包含:current(返回当前元素),key(当前键),next(下一个元素),rewind(返回至初始元素),valid(检测当前元素是否存在)五种方法. 3.I

underscore 复习 对象函数 篇章

_.partial = function(func) { var boundArgs = slice.call(arguments, 1); var bound = function() { var position = 0, length = boundArgs.length; var args = Array(length); for (var i = 0; i < length; i++) { args[i] = boundArgs[i] === _ ? arguments[positio