闭函数:被封闭起来的函数=>定义函数内部的函数;闭函数的特点是只能在函数内用

def outter():    x = 100    def wrapper():        print(x)

包函数:该函数引用了一个名字,该名字是来自与e这一层的
总结:闭包函数指的是定义在函数内部的函数引用了一个来自于外层函数作用域中的名字
闭包函数升级:结合函数对象

def outter():    x = 100    def wrapper():        print(x)    return wrapper  # 千万不要加括号f = outter()print(f)def foo():    x = 666    f()foo()

学闭包函数学到了一种为函数体传参的新的方案
为函数体传参有两种解决方案
方案一:直接以参数的形式传入

def wrapper(x):    print(x)wrapper(100)

方案二:

def outter(x):    def wrapper():        print(x)    return wrapper  # 千万不要加括号f = outter(100)f()

闭包函数的应用-装饰器
1、什么是装饰器
装饰器指的是装饰对象的一种工具,装饰指的则是为被装饰对象添加新功能
但是实现装饰器必须遵循的原则是"开放封闭原则"
开放指的是对拓展新功能是开放的,封闭指的则是对修改源码以及调用方式是封闭的
综上装饰器指的是我们要创建一个工具,该工具可以在遵循原则1和2的前提下还能为被装饰对象添加新功能
原则1、不修改被装饰对象源代码
原则2、不修改被装饰对象调用方式
2、为什么用装饰器
这样做如果更新新功能出现问题可以快速回稳
3、如何实现装饰器
装饰器----------函数
被装饰对象-------函数

准备被装饰者

import timedef index():    print('from index')    time.sleep(3)index()

方案一改变了源代码

import timedef index():    start = time.time()    print('from index')    time.sleep(3)    end = time.time()    print(f"run time is {end - start}")index()

方案二 装饰器的功能需要重复编写造成代码冗余

import timedef index():    print('from index')    time.sleep(3)start = time.time()index()end = time.time()print(f"run time is {end - start}")

方案三 调用方式变了且代码被写死了

import timedef index():    print('from index')    time.sleep(3)def wrapper():    start = time.time()    index()    end = time.time()    print(f"run time is {end - start}")wrapper()

方案四

import timedef index():    print('from index')    time.sleep(3)def outter(index):    def wrapper():        start = time.time()        index()        end = time.time()        print(f"run time is {end - start}")    return wrapperindex = outter(index)index()

方案五

import timedef index():    print('from index')    time.sleep(3)def home(name):    print(f"welcome {name} to home page")    time.sleep(0.5)def outter(func):    def wrapper(*args, **kwargs):        start = time.time()        res = func(*args, **kwargs)        end = time.time()        print(f"run time is {end - start}")        return (res)    return wrapperhome = outter(home)index = outter(index)res = home('holmes')print(res)index()

装饰器语法糖

import timedef outter(func):    def wrapper(*args, **kwargs):        start = time.time()        res = func(*args, **kwargs)        end = time.time()        print(f"run time is {end - start}")        return (res)    return wrapper@outterdef index():    print("from index")    time.sleep(3)@outterdef home(name):    print(f"welcome {name} to xinjiang")    time.sleep(0.5)res = home('holmes')print(res)index()

装饰器模版

def deco(func):    def wrapper(*args,**kwargs):        res=func(*args,**kwargs)        return res    return wrapper

用户登录装饰器

def auth(func):    def wrapper(*args, **kwargs):        inp_name = input('username:').strip()        inp_pwd = input('password:').strip()        if inp_name == 'lu' and inp_pwd == '345':            res = func(*args, **kwargs)            return res        else:            print('登陆失败')    return wrapper@authdef index():    print('from index')    time.sleep(3)index()

时间装饰器

import timedef timmer(func):    def wrapper1(*args, **kwargs):        start = time.time()        res = func(*args, **kwargs)        stop = time.time()        print(stop - start)        return res    return wrapper1

装饰器应用

import timedef timmer(func):    def wrapper1(*args, **kwargs):        start = time.time()        res = func(*args, **kwargs)        stop = time.time()        print(stop - start)        return res    return wrapper1def auth(func):    def wrapper2(*args, **kwargs):        inp_user = input('Username: ').strip()        inp_pwd = input('Password: ').strip()        if inp_user == 'egon' and inp_pwd == '123':            res = func(*args, **kwargs)            return res        else:            print('登录失败')    return wrapper2@auth@timmerdef index():    print('====>index')    time.sleep(3)index()
©著作权归作者所有:来自51CTO博客作者六个橘子的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 函数-对象、嵌套、名称空间与作用域
  2. 函数的递归
  3. Go语言学习笔记4
  4. 「知识点」JavaScript 中11个有趣的事实
  5. Ubuntu系统网络配置及shell脚本编程之函数数组等用法详解
  6. 函数的嵌套调用和链式访问
  7. 函数的形参和实参
  8. 函数的声明和定义
  9. C语言函数功能的强大和入坑体会

随机推荐

  1. android前后摄像头切换
  2. Android SDK安装更新Failed to fetch URL
  3. Android中常见Intent习惯用法-上篇(附源
  4. iphone Android JS的使用
  5. Android项目发布 ---- Jcenter篇
  6. android为文本框设置背景资源-shape
  7. Android简易实战教程--第三十九话《Chron
  8. .Net 转战 Android 4.4 日常笔记(5)--新软
  9. 小胖加入Android Fans的 大军了 呵呵
  10. 在android的java代码中自定义log