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()

原文地址:https://www.cnblogs.com/ghming/p/8495230.html

时间: 2024-10-07 23:41:56

python闭包、装饰器的相关文章

python 闭包 装饰器

闭包:是由函数和其他相关的引用环境组合而成的实体. 如果一个函数内部,对在外部作用域的变量进行引用,那么内部函数就被认为是闭包(closure). A CLOSURE is a function object that remembers values in enclosing scopes regardless of whether those scopes are still present in memory. >>> def hellocounter(name): count=[

【Python笔记】Python的几个高级语法概念浅析:lambda表达式 && 闭包 && 装饰器

本文主要记录自己对几个高级语法概念的理解:匿名函数.lambda表达式.闭包.装饰器. 这几个概念并非Python特有,但本文只限于用Python做说明. 1. 匿名函数 匿名函数(anonymous function)是指未与任何标识符绑定的函数,多用在functional programming languages领域,典型应用场合: 1) 作为参数传给高阶函数(higher-order function ),如python中的built-in函数filter/map/reduce都是典型的

【Python基础】高阶函数+函数嵌套+闭包 ==装饰器

高阶函数+函数嵌套+闭包 == 装饰器 一 什么是装饰器 二 装饰器需要遵循的原则 三 实现装饰器知识储备 四 高阶函数 五 函数嵌套 六 闭包 七 无参装饰器 八 装饰器应用示例 九 超时装饰器 参考: https://www.cnblogs.com/linhaifeng/articles/6140395.html https://www.cnblogs.com/haiyan123/p/8387769.html 原文地址:https://www.cnblogs.com/XJT2018/p/11

python函数装饰器

学习装饰器前提需要了解高阶函数,函数嵌套,函数闭包 python函数装饰器,顾名思义就是装饰函数,为函数添加新功能的的一种方式. 为什么要使用装饰器呢? 因为函数在运行时,如果不使用装饰器对函数进行功能添加,需要修改函数源代码,这样修改无疑会增加程序的冗余和复杂性,也不便于程序员对其进行修改.使用装饰器,可以在不改变函数源代码和调用方式的前提下,使用语法糖@装饰器,对函数功能进行添加. 装饰器本质上就是一个函数. 我们使用一个简单的例子来实现: import time #这是一个装饰器函数名为t

【转】详解Python的装饰器

原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def say_hello(): print "hello!" def say_goodbye(): print "hello!" # bug here if __name__ == '__main__':

Python 函数装饰器入门

原文链接: --> A guide to Python's function decorators Python功能强劲,语法表现力强,尤其装饰器深深的吸引着我.在设计模式中,装饰器可以在不使用子类的情况下,动态的改变函数,方法以及类的功能.这个功能非常有用,特别在你想扩展函数的功能同时又不想改变原有的函数.的确,我们任意的实现装饰器设计模式,但是,python通过提供简单的语法和特性让装饰器的实现变的如此简单. 在本文中,我将用一组例子来深入浅入python 函数装饰器的功能,所有的例子都是在

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

Python学习---装饰器的学习1210

装饰器的基础 学习前提: 作用域 + 函数的理解 + 闭包  [学习,理解] 代码编写原则: 对修改开放对扩展开放 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象. 装饰器的应用:经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等应用场景.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用. 装饰器作用:装饰器感觉就像是内部函数的

详解Python的装饰器

Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def say_hello(): print "hello!" def say_goodbye(): print "hello!" # bug here if __name__ == '__main__': say_hello() say_goodbye() 但是在实际调用中,我们

python—函数装饰器

闭包 如果在一个内部函数(函数里的函数)里,对在外部作用域(但不是在全局作用域,可以理解为外层函数)的变量进行引用,那么内部函数就被认为是闭包. 例如: def outer(): x=10 # 这里x即为外部作用域变量 def inner(): print(x) return inner # inner函数被称为一个闭包 装饰器 写python代码一定要遵循开放封闭原则.即,可扩展功能,对源代码修改是封闭的.装饰是为函数和类指定管理代码的一种方式.装饰器本身的形式是处理其他的可调用对象的可调用的