python的闭包和装饰器

闭包

闭包的定义

1.闭:定义在函数内部的函数
2.包:内部函数引用了外部函数作用域的名字

函数的参数传达

1.直接传参

def index1(username):
    print(username)
2.闭包来实现函数内参数传达

def outter(x,y):
    # x = 1
    # y = 40
    def my_max():
        if x > y:
            return x+y
        return  y
    return my_max
res1 = outter(1, 40)
print(res1)

res2 = outter(90,200)
print(res2())

闭包实例

import requests

url1 = ‘https://www.baidu.com‘
def my_ger(url):
    response = requests.get(url)
    if response.status_code == 200:
        print(len(response.text))

my_ger(url1)
my_ger(‘https://www.baidu.com‘)

装饰器

装饰器定义

器指的是工具,而程序中的函数就是具备某一功能的工具,所以装饰器指的是为被装饰器对象添加额外功能。因此定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外的功能。

需要注意的是:

装饰器本身其实是可以任意可调用的对象
被装饰的对象也可以是任意可调用的对象

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

不修改被装饰对象的源代码
不修改被装饰对象的调用方式

单函数的实现装饰器的效果(超low版本)

实现函数名为参数的闭包 (simple版本)

实现解决调用函数参数的不固定问题(正常版本)

在被装饰函数正上方,并且是单独一行写上@装饰器名  装饰糖

实现作用 实际为 装饰器函数的返回值(一般都是内层函数的函数名) = 装饰器函数(被装饰函数函数名)

装饰器模板

多层装饰器(包括传参案例)

‘‘‘多层装饰器‘‘‘
import time

user_dic = {‘is_logth‘:None}

def outter(func):
    def get_time(*args, **kwargs):
        start = time.time()
        res = func(*args, **kwargs)
        end = time.time()
        print(f‘func run rime:{(end-start)}‘)
        return res
    return get_time

def login_auth2(data_source, x, t):
    # data_source = ‘file‘
    def login_auth(func):
        # func = index
        def inner(*args, **kwargs):
            if user_dic[‘is_logth‘]:
                res = func(*args, **kwargs)
                return res
            else:
                if data_source == ‘file‘:
                    username = input(‘plesse input your username>>>:‘).strip()
                    password = input(‘plesse input your password>>>:‘).strip()
                    if username == ‘jinpan‘ and password == ‘123‘:
                        user_dic[‘is_logth‘] = True
                        print(func)
                        res = func(*args, **kwargs)
                        return res
                    else:
                        print(‘username or password error‘)
                elif data_source == ‘Mysql‘:
                    print(‘from Mysql‘)
                elif data_source == ‘ldap‘:
                    print(‘ldap‘)
                else:
                    print("暂无该数据来源")
        return inner
    return login_auth

@login_auth2(‘file‘,1,2)
@outter
def index():
    time.sleep(1)
    print(‘index‘)
    return ‘index‘
res = index()
print(res)

装饰器修复器 -- wraps的用法

使用help() __name__ 方法对被装饰器对象时候恢复原有的名字和注释

‘‘‘
装饰器修复器---wraps用法
‘‘‘
from functools import wraps
def outter(func):
    @wraps(func)
    def inner(*args, **kwargs):
        ‘‘‘
        我是inner函数
        :param args:
        :param kwargs:
        :return:
        ‘‘‘
        print(‘执行被装饰函数之前 你可以执行的操作‘)
        res = func(*args, **kwargs)
        print(‘执行被装饰函数之后 你可以执行的操作‘)
        return res
    return inner

@outter
def index():
    """
    这是index函数
    :return:
    """
    pass

print(index)
print(help(index))
print(index.__name__)
index()
‘‘‘
用户查看被装饰函数的函数名的时候查看到的就是被装饰函数本身
用户查看被装饰函数的函数名的时候查看到的就是被装饰函数注释
‘‘‘

装饰器的函数的加载和执行顺序

‘‘‘多层装饰器的练习案例‘‘‘
def outter1(func1):
    print(‘加载了outter1‘)
    def wrapper1(*args,**kwargs):
        print(‘执行了wrapper1‘)
        res1 = func1(*args,**kwargs)
        return res1
    return wrapper1

def outter2(func2):
    print(‘加载了outter2‘)
    def wrapper2(*args,**kwargs):
        print(‘执行了wrapper2‘)
        res2 = func2(*args,**kwargs)
        return res2
    return wrapper2

def outter3(func3):
    print(‘加载了outter3‘)
    def wrapper3(*args,**kwargs):
        print(‘执行了wrapper3‘)
        res3 = func3(*args,**kwargs)
        return res3
    return wrapper3

@outter1
@outter2
@outter3
def index():
    print(‘from index‘)

"""
加载了outter3
加载了outter2
加载了outter1

执行了wrapper1
执行了wrapper2
执行了wrapper3
from index
"""

index()

原文地址:https://www.cnblogs.com/jinpan/p/11173917.html

时间: 2024-10-28 23:35:05

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

Python函数编程——闭包和装饰器

Python函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包.也就是说,内部函数会在外部函数返回后被执行.而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量.参数以及其他内部函数.这些局部变量.参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响. def outer(

Python之闭包and装饰器

闭包和装饰器是Python中非常重要的一种语法格式,在日常工作中应用非常广泛. 首先,我先为大家简单的接受一下闭包的概念. 闭包:闭包是在函数嵌套的基础上,内层函数使用到外层函数的变量,且外层函数返回内层函数的引用的一种语法格式. 闭包的基本格式,代码实现: def outer(): num = 0 def inner(): # 使用外部函数的变量 print(num) return inner # 返回inner函数在内存空间中的地址 # 将outer函数的返回值赋值给变量f,也就是说将f指向

python的闭包及装饰器

闭包: 闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外.所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体 1.函数是一个对象 2.函数执行完成后内部变量回收 3.函数属性 4.函数的返回值 实例一. 分别检测分数科目总分为100.150两种情况的成绩 初级代码如下: # -*- coding:utf-8 -*- ###检测分数总数为100分的及格情况

python的闭包、装饰器和lambda等(笔记)

参考: http://blog.csdn.net/marty_fu/article/details/7679297(闭包,推荐看这个) https://foofish.net/python-decorator.html(装饰器,推荐) http://www.cnblogs.com/tqsummer/archive/2010/12/27/1917927.html(yield) http://www.cnblogs.com/longdouhzt/archive/2012/05/19/2508844.

Python高级--闭包与装饰器

前言:在Python中,闭包是一种非常有用的功能!它通常与装饰器一起搭配使用,可以在不改变被装饰函数的功能的基础上,完成更多的功能.如权限认证. 一.如何定义闭包 1.闭包就是两个嵌套的函数,外层函数返回内层函数的引用,而且外层函数必须携带参数!为什么外层函数必须要有参数呢?可以思考一下! 基本格式如下: 1 def outer_fun(func): 2 def inner_fun(): 3 pass 4 return inner_fun 2.与普通函数的区别: 闭包的外层函数的变量可以在内存中

python中闭包和装饰器

---恢复内容开始--- 使用像javascript和python这样支持面向对象范式的语言进行编程时,都会涉及到闭包的概念以及闭包的使用.我们今天就从这两个方面来讨论一下闭包: 首先是维基百科中关于闭包的概念:在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包.闭包可以用来在一个函数与一组"私有"变量之间创建关联关系.在给定函数被多次调用的过程中,这些私有变量能够保持其持久性. 根据这句话,其实我们自己就可以总结出在python语

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

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

python之闭包,装饰器

目录 函数对象 :相当于变量名 函数对象的作用: 1. 可以引用 2. 可以作为函数的返回值 3. 可以作为容器的元素 4. 可以作为函数的参数 闭包 定义: python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure) 闭包的意义: 返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得该函数无论在何处调用,优先使用自己外层包裹的作用域 装饰器 本质:装饰器 = 函数.

Python之闭包与装饰器

闭包 由于闭包这个概念比较难以理解,尤其是初学者来说,相对难以掌握,所以我们通过示例去理解学习闭包. 给大家提个需求,然后用函数去实现:完成一个计算不断增加的系列值的平均值的需求. 例如:整个历史中的某个商品的平均收盘价.什么叫平局收盘价呢?就是从这个商品一出现开始,每天记录当天价格,然后计算他的平均值:平均值要考虑直至目前为止所有的价格. 比如大众推出了一款新车:小白轿车. 第一天价格为:100000元,平均收盘价:100000元 第二天价格为:110000元,平均收盘价:(100000 +