闭包函数 装饰器

什么是闭包函数

  闭:指的是闭包函数数定义在一个函数内部的函数

  包:该内部函数包含对外城函数作用域名字的引用

  需要结合函数对象的概念将闭包函数返回到全局作用域去使用,从而打破函数层级的限制

为什么要用闭包函数

  闭包函数提供了一种为函数体传值的解决方案

如何用闭包函数

# 为函数体传值的方式一:参数
# def func(x,y):
#     print(x+y)
#
# func(1,2)          3

# 为函数体传值的方式二:闭包
def outter(x,y):
    # x=1
    # y=2
    def func():
        print(x+y)
    return func

f=outter(1,2)
f()                          3
f()                          3
f()                          3

 解决方案一:参数
# def get(url):
#     response=requests.get(url)
#     if response.status_code == 200:
#         print(len(response.text))

# get(‘https://www.baidu.com‘)
# get(‘https://www.baidu.com‘)
# get(‘https://www.baidu.com‘)
# get(‘https://www.tmall.com‘)
# get(‘https://www.tmall.com‘)

# url1=‘https://www.baidu.com‘
# url2=‘https://www.tmall.com‘
#
# get(url1)
# get(url1)
# get(url1)
#
# get(url2)
# get(url2)
# get(url2)

 解决方案二:闭包
# def outter(url):
#     # url=‘https://www.baidu.com‘
#     def get():
#         response=requests.get(url)
#         if response.status_code == 200:
#             print(len(response.text))
#     return get
#
# baidu=outter(‘https://www.baidu.com‘)
# baidu()
# baidu()
# baidu()
#
# tmall=outter(‘https://www.tmall.com‘)
# tmall()
# tmall()
# tmall()

装饰器

  器:指的是具备某一功能的工具

  装饰:值的是为了被装饰器对象添加新的功能

  装饰器就是用来为了被装饰对象添加新功能的工具

   注意: 装饰器本身可以是任意可调用对象,被装饰器的对象也可以是任意可调用对象

为什么用装饰器

  开放封闭原则:封闭值的是对修改源代码封闭,对扩展功能开放

  装饰器的实现必须遵循量大原则:

    1 不修改被装饰对象的源代码

    2不修改被装饰对象的调用方式

  装饰器的目标:就是在遵循1和2原则的前提下为被装饰对象添加上新功能

import time

def index():
    print(‘welcome to index page‘)
    time.sleep(3)

def outter(func): # func=最原始那个index的内存地址
    def wrapper():
        start=time.time()
        func() #最原始的那个index的内存地址()
        stop=time.time()
        print(‘run time is %s‘ %(stop - start))
    return wrapper

index=outter(index) #index=outter(最原始那个index的内存地址) #index=wrapper的内存地址
index() #wrapper的内存地址()

装饰器的语法糖:在被装饰器对象正上方单独一行写@装饰器的名字

  python解释器一旦运行到@装饰器的名字,就会调用装饰器然后将被装饰函数的内存地址当做参数传递给装饰器,最终将装饰器调用的结果赋值给原函数名 (原函数名[email protected]外层函数运行结果返回值(二层函数名:就是加新功能的新函数名))

import time
#
# def timmer(func): #func=最原始那个home函数的内地址
#     def wrapper(*args,**kwargs): #args=(‘egon‘,) kwargs={}
#         start=time.time()
#         res=func(*args,**kwargs) #最原始那个home函数的内地址(‘egon‘)
#         stop=time.time()
#         print(‘run time is %s‘ %(stop - start))
#         return res
#     return wrapper
#
# @timmer #index=timmer(index)
# def index():
#     print(‘welcome to index page‘)
#     time.sleep(3)

装饰器模板

import time

def outer(func):  def wrapper(*args,**kwargs):    #在调用函数前增加新功能    res=func(*args,**kwargs) #调用被装饰的 也就是最原始的那个函数    #在调用函数后加功能    return res  return wrapper

@outter  #index=outer(index) #index =wrapperdef index():  print (‘welcome to index page‘)  time.sleep(3)

index()

ef wrap(fn):
    def inner(*args,**kwargs):
        print(‘前面增功能‘)
        result=fn(*args,**kwargs)
        print(‘后面增功能‘)
        return result
    return inner
@wrap
def fn1():
    print(‘fn1的原功能‘)
@wrap
def fn2(a,b):
    print(‘fn2的原有功能‘)
@wrap
def fn3():
    print(‘fn3的原有功能‘)
    return True
@wrap
def fn4(a,*,x):
    print(‘fn4原有功能‘)
    return True
fn1()
fn2(10,29)
fn1()
fn4(19,x=7)
认证功能的装饰器
import time

def auth(func):
    def wrapper(*args,**kwargs):
        inp_user = input(‘please input your username: ‘).strip()
        inp_pwd = input(‘please input your password: ‘).strip()
        if inp_user == ‘egon‘ and inp_pwd == ‘123‘:
            print(‘login successfull‘)
            res=func(*args,**kwargs) # 调用最原始的那个/也就是被装饰的那个函数
            return res
        else:
            print(‘username or password error‘)
    return wrapper

@auth # index=auth(index) #index=wrapper
def index():
    print(‘welcome to index page‘)
    time.sleep(3)

index() #wrapper()
is_login = False  # 登录状态

def login():    usr = input(‘usr: ‘)    if not (len(usr) >= 3 and usr.isalpha()):        print(‘账号验证失败‘)        return False    pwd = input(‘pwd: ‘)    if usr == ‘abc‘ and pwd ==‘123qwe‘:        print(‘登录成功‘)        is_login = True    else:        print(‘登录失败‘)        is_login = False

# 完成一个登录状态校验的装饰器def check_login(fn):    def inner(*args, **kwargs):        # 查看个人主页或销售功能前:如果没有登录先登录,反之可以进入其功能        if is_login != True:            print(‘你未登录‘)            login()        # 查看个人主页或销售        result = fn(*args, **kwargs)        return result    return inner

# 查看个人主页功能@check_logindef home():    print(‘个人主页‘)

# 销售功能@check_logindef sell():    print(‘可以销售‘)

home()

原文地址:https://www.cnblogs.com/lakei/p/10643388.html

时间: 2024-08-27 15:52:06

闭包函数 装饰器的相关文章

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

闭包函数 装饰器 有参装饰器

闭包函数: 1 内部函数 2 包含对外部作用域而非全局作用域的引用闭包函数的特点: 自带作用域  延迟计算 #闭包函数定义 1 def timmer(func): 2 def inner(*args,**kwargs): 3 re = func(*args,**kwargs) 4 return re 5 return inner 6 7 index(): 8 print("hello") 9 10 index = timmer(index) #index == inner 11 ind

<04day>_函数嵌套--闭包函数--装饰器--迭代器--生成器

一.函数的嵌套定义 1.python函数支持嵌套 def f1(): #f1函数的定义 def f2(): #f2函数的定义 print('from f2') def f3(): #f3函数的定义 print('from f3') f2() f1() 嵌套函数--运行结果说明: 1首先调用f1()结果,f1函数为空.担保函f2函数,f2函数有内容打印并且有调用,f2函数包含f3函数,但f3函数无调用. 运行结果: 列子:多个数据之间的大小比较. #!/usr/bin/python # -*- c

day12.1_闭包函数+装饰器

一.闭包函数 闭包的定义:①该函数是一个内部函数 ②该函数包含对外部的作用域(非全局作用域)中名字的引用 1. 为函数体传值的方式 1.1 使用参数形式 1.2 包给函数 def outter(x): def inner(): print(x) return inner #函数当返回值(对象) f=outter(1) #相当于赋值 f() 二.装饰器 1.装饰器是什么? ①为被装饰器对象添加额外的功能  ② 可以当成工具,函数就具备某一功能的工具 装饰器本省可以是任意可调用的对象,被装饰的对象也

Python作用域-->闭包函数-->装饰器

1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修改全局定义的变量(当然有方法可以修改) 下面我们来看看下面实例: x = 1 def funx(): x = 10 print(x) # 打印出10 funx() print(x) # 打印出1 如果局部没有定义变量x,那么函数内部会从内往外

python之闭包函数 装饰器 作业

一:编写函数,(函数执行的时间是随机的) import randomdef t(): time.sleep(random.randrange(1,3)) print('hello')二:编写装饰器,为函数加上统计时间的功能 import timeimport randomdef timebe(func): def wrapper(*args,**kwargs): start_time=time.time() res = func(*args, **kwargs) end_time=time.ti

函数进阶——闭包,装饰器,生成器,迭代器

闭包 函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问他们所在的外部函数中声明的所有局部变量.参数.当其中一个这样的内部函数在包含他们的外部函数之外被调用时,就会形成闭包. 装饰器 在不修改原函数的情况下,给原函数增加新的功能,使得程序变得可扩展 http://www.cnblogs.com/alex3714/articles/5765046.html(转) 列表生成式 1 a = [i+1 for i in range(10)] 2 print(a)#[1,