函数的闭包

      闭包

学闭包之前,要记住这么一句话,名称空间与作用域,(作用域关系在函数定义阶段时就已经固定死了,与调用位置无关)

1、闭指的是函数是一个内部函数

2、包指的是:指的是该函数包含对外部作用域(非全局作用域)名字的引用。

案例(1):

def outter():

  x=1

  def inner():

    print(x)

     return inner

f = outter()

f()

案例(2)

def outter(x)

  def inner()

    print(x)

  return inner

f = outter()

f()

                                                                               装饰器

1、什么是装饰器

器指的是工具,而程序中的函数就具备某一功能的工具。

装饰指的是为被装饰器对象添加额外功能

就目前的知识来看:

  定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外的功能

2、为什么要用装饰器

     两大原则:

    (1) 不修改原代码

     (2)不改变原来的调用

软件的维护应该遵循开发封闭原则

开放封闭原则指的是:

软件一旦上线运行后对修改源代码是封闭的,对扩展功能的是开发的。

重点:装饰器是闭包和函数作用域、函数对象的综合实践。

案例(1)

import time


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


def decorator(func):
    '''
    装饰的外层函数      
    :param func: 
    :return: wrapper 的内存地址
    '''
    def wrapper():
        '''
        被装饰的函数
        :return: 
        '''
        #当前时间戳
        start = time.time()
        #原函数》》指向index
        func()
        stop = time.time()
        print('the run is %s'%(stop-start))
    #返回函数名,打破层级限制    
    return wrapper   

index = decorator(index)
index()

案例(2)(如果装饰器有返回值怎么办)

import time


def index():
    print('welcome to index')
    time.sleep(3)
    return 123456


def decorator(func):
    '''
    装饰的外层函数
    :param func:
    :return: wrapper 的内存地址
    '''
    def wrapper():
        '''
        被装饰的函数
        :return:
        '''
        #当前时间戳
        start = time.time()
        #原函数》》指向index
        res = func()
        stop = time.time()
        print('the run is %s'%(stop-start))
        return res
    #返回函数名,打破层级限制
    return wrapper
#这里的index不是源函数index()
#decorator执行的是wrapper函数
index = decorator(index)
res = index()
print(res)

  

案例(3)(带参数的函数)

import time


def index(name):
    print('welcome  %s to index page'%name)
    time.sleep(3)
    return 123456


def decorator(func):
    '''
    装饰的外层函数
    :param func:
    :return: wrapper 的内存地址
    '''
    
    #这里使用*args,**kwargs的好处就是可以传参数,可以不传参数
    def wrapper(*args,**kwargs):
        '''
        被装饰的函数
        :return:
        '''
        #当前时间戳
        start = time.time()
        #原函数》》指向index
        res = func(*args,**kwargs)
        stop = time.time()
        print('the run is %s'%(stop-start))
        return res
    #返回函数名,打破层级限制
    return wrapper
#这里的index不是源函数index()
#decorator执行的是wrapper函数
index = decorator(index)
res = index('alex')
print(res)

案例(5)(python装饰器)

import time


def decorator(func):
'''
装饰的外层函数
:param func:
:return: wrapper 的内存地址
'''

#这里使用*args,**kwargs的好处就是可以传参数,可以不传参数
def wrapper(*args,**kwargs):
'''
被装饰的函数
:return:
'''
#当前时间戳
start = time.time()
#原函数》》指向index
res = func(*args,**kwargs)
stop = time.time()
print('the run is %s'%(stop-start))
return res
#返回函数名,打破层级限制
return wrapper


@decorator #index=decorator(index)
def index(name):
print('welcome %s to index page'%name)
time.sleep(3)
return 123456
#index()调用wrapper函数
index('egon')

  

猜你喜欢

转载自www.cnblogs.com/wuheng-123/p/9168919.html