• python闭包、装饰器


    内部函数

    闭包:

      闭包将内部函数自己的代码和作用域以及外部函数的作用结合起来。

      闭包的词法变量不属于全局名字空间域或者局部的——而是属于其他的名字空间,带着流浪的作用域。

      闭包对于安装计算,隐藏状态,以及在函数对象和作用域中随意的切换是很有用的。

      闭包也是函数,但是他们能携带一些额外的作用域。

      实例

     

    装饰器

      装饰器是在函数调用之上的修饰

      这些修饰是当声明一个函数或者方法的时候,才会应用的额外调用

      使用装饰器的情形有:

      ——引用日志

      ——增加计时逻辑来检测性能

      ——给函数加入事物的能力

      装饰器实例1:设置验证函数,登录前调用登录验证函数

    user_status = False
    #用户登录后就改变状态为True
    user_status = False
    #用户登录后就改变状态为True


    def login():
    username = 'zhangsan'
    password = 'abc123'
    global user_status

    if user_status == False:
    username1 = input('请输入用户名:')
    password1 = input('请输入密码:')

    if username==username1 and password==password1:
    user_status = True
    print('用户登录成功!')
    else:
    print('用户名或密码错误!')
    else:
    print('用户已登录,验证通过……')


    def home():
    print('首页'.center(20,'-'))


    def america():
    if login():#执行前加上验证

    print('欧美专区'.center(20,'-'))


    def japan():
    login()#执行前验证
    print('日韩专区'.center(20,'-'))



    home()
    america()

     

    装饰器实例2:

      编程原则:

        封闭:已实现的功能代码块不应该被修改

        开放:兑现有功能的扩展开放

    user_status = False
    #用户登录后就改变状态为True
    
    
    def login(func):
        username = 'zhangsan'
        password = 'abc123'
        global user_status
    
        if user_status == False:
            username1 = input('请输入用户名:')
            password1 = input('请输入密码:')
    
            if username==username1 and password==password1:
                user_status = True
                print('用户登录成功!')
            else:
                print('用户名或密码错误!')
    
        elif user_status == True:
            func()
    
    
    
    def home():
        print('首页'.center(20,'-'))
    
    
    def america():
    
        print('欧美专区'.center(20,'-'))
    
    
    def japan():
        
        print('日韩专区'.center(20,'-'))
    
    
    
    home()
    login(america)
    login(japan)

    装饰器实例3

    def login(func):
    
    
        def inner():
            username = 'zhangsan'
            password = 'abc123'
            global user_status
    
            if user_status == False:
                username1 = input('请输入用户名:')
                password1 = input('请输入密码:')
    
                if username==username1 and password==password1:
                    user_status = True
                    print('用户登录成功!')
                else:
                    print('用户名或密码错误!')
    
            if user_status == True:
                func()
                #如果验证通过,就能调用相应的功能
    
        return inner
    
    
    def home():
        print('首页'.center(20,'-'))
    
    
    
    def america():
    
        print('欧美专区'.center(20,'-'))
    
    @login
    def japan():
        print('日韩专区'.center(20,'-'))
    
    home()
    japan()

    装饰器实例4 :带参数的函数

    user_status = False
    #用户登录后就改变状态为True
    
    
    def login(func):
    
    
        def inner(*args, **kwargs):
            username = 'zhangsan'
            password = 'abc123'
            global user_status
    
            if user_status == False:
                username1 = input('请输入用户名:')
                password1 = input('请输入密码:')
    
                if username==username1 and password==password1:
                    user_status = True
                    print('用户登录成功!')
                else:
                    print('用户名或密码错误!')
    
            if user_status == True:
                func(*args, **kwargs)
                #如果验证通过,就能调用相应的功能
    
        return inner
    
    
    def home():
        print('首页'.center(20,'-'))
    
    
    @login
    def america():
    
        print('欧美专区'.center(20,'-'))
    
    @login
    def japan(style):#带参数
        print('日韩专区'.center(20,'-'))
    
    home()
    japan('3p')#调用必须传参
    america()

    装饰器4:增加验证方法,多层嵌套

    user_status = False
    #用户登录后就改变状态为True
    
    
    def login(auth_type):
    
        def auth(func):#把要执行的模块从这里传进来
            def inner(*args, **kwargs):
                if auth_type=='qq':
                    username = 'zhangsan'
                    password = 'abc123'
                    global user_status
    
                    if user_status == False:
                        username1 = input('请输入用户名:')
                        password1 = input('请输入密码:')
    
                        if username==username1 and password==password1:
                            user_status = True
                            print('用户登录成功!')
                        else:
                            print('用户名或密码错误!')
    
                    if user_status == True:
                        return func(*args, **kwargs)
                    #如果验证通过,就能调用相应的功能
                else:
                    print('only support qq')
            return inner
        return auth
    
    def home():
        print('首页'.center(20,'-'))
    
    
    @login('qq')
    def america():
    
        print('欧美专区'.center(20,'-'))
    
    @login('weibo')
    def japan(style):#带参数
        print('日韩专区'.center(20,'-'))
    
    home()
    japan('3p')#调用必须传参
    america()

  • 相关阅读:
    fdfs上传图片成功在浏览器中访问不到404 Not Found
    G1 GC日志:Application time: 0.8766273 seconds
    nginx编译问题:make[1]: *** [/usr/local/pcre//Makefile] Error 127
    Datatable报错Uncaught TypeError: Cannot read property 'cell' of undefined
    信息: Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level
    [HDU1176]免费馅饼(DP)
    [程序员代码面试指南]二叉树问题-找到二叉树中的最大搜索二叉树(树形dp)
    [程序员代码面试指南]二叉树问题-在二叉树中找到累加和为指定值的最长路径长度
    [程序员代码面试指南]数组和矩阵-求最短通路值(BFS)
    [程序员代码面试指南]9-判断点在三角形内
  • 原文地址:https://www.cnblogs.com/ghming/p/8495230.html
Copyright © 2020-2023  润新知