ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

闭包函数及其应用

2021-03-29 19:51:37  阅读:151  来源: 互联网

标签:闭包 index 函数 res wrapper 应用 time print def


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

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 time
def index():
    print('from index')
    time.sleep(3)
index()

方案一改变了源代码

import time

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

index()

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

import time

def index():
    print('from index')
    time.sleep(3)

start = time.time()
index()
end = time.time()
print(f"run time is {end - start}")

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

import time

def 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 time

def 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 wrapper

index = outter(index)
index()

方案五

import time

def 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 wrapper

home = outter(home)
index = outter(index)
res = home('holmes')
print(res)
index()

装饰器语法糖

import time

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 wrapper

@outter
def index():
    print("from index")
    time.sleep(3)

@outter
def 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

@auth
def index():
    print('from index')
    time.sleep(3)

index()

时间装饰器

import time

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

    return wrapper1

装饰器应用

import time

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

    return wrapper1

def 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
@timmer
def index():
    print('====>index')
    time.sleep(3)

index()

标签:闭包,index,函数,res,wrapper,应用,time,print,def
来源: https://blog.51cto.com/15129993/2676701

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有