欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python-闭包函数和装饰器

程序员文章站 2022-06-28 23:46:23
[TOC] 闭包函数 什么是闭包? 函数的内部函数,对外部作用域,而非全局作用域的引用。 可以打破层级关系,把局部变量拿到全局使用,并且可以把外部的变量x封装到f2中,然后下车直接调用f2就行了。 全局中相同名字的变量不会影响局部的变量。 两种为函数传参的方式 使用参数的形式 包给函数 闭包函数的应 ......

目录

闭包函数

什么是闭包?

函数的内部函数,对外部作用域,而非全局作用域的引用。

可以打破层级关系,把局部变量拿到全局使用,并且可以把外部的变量x封装到f2中,然后下车直接调用f2就行了。

x = 10
def f1(x): # f1()== f2
    # x = 2
    def f2():

        print(x)
    return f2 # 把f2函数当做一个返回值返回给f1.
f2 =f1(1) # f1()就相当于把f2的值拿到,然后在赋值给一个变量名为f2。
f2()

1

全局中相同名字的变量不会影响局部的变量。

两种为函数传参的方式

使用参数的形式

def f1(x):
    print(x)

f1(1)

1

包给函数

def f1(x):
    def f2():
        print(x)
    return f2

f = f1(2)
f()

2

闭包函数的应用

闭包的意义:

返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹一层作用域,这使得,该函数无论在何处调用,都优先使用自己外层包裹的作用域。

应用领域:延迟计算、爬虫领域。

import requests

def outter(url):  #outter() == spider ;spider() == response == requests.get(url)
    def spider():  # spider() == response
        response = requests.get(url)
        print(response.status_code)
        return response  
    return spider

baidu = outter('https://www.baidu.com')  # baidu == spider
baidu()

200

装饰器

无参装饰器

什么是装饰器

是为被装饰器对象添加额外功能。装饰器本质上也是一个函数,只不过这个函数具有装饰的功能。

为什么要用装饰器

当我们想新增功能,但又不想修改原方法的使用方法,这个时候就可以使用装饰器。

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

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

怎么用装饰器

import time

def time_sleep():

    time.sleep(1)

    print('from time_sleep')

def deco(func):  # deco()== wrapper ; func == time_sleep

    def wrapper():
        start = time.time()
        res = func()
        end = time.time()
        print(end - start)
        return res
    return wrapper

time_sleep = deco(time_sleep)  #func == time_sleep ,括号里的time_sleep才是调用上面函数time_sleep,而前面的time_sleep只是我们自定义的一个接收变量值的变量名。
time_sleep()  # time_sleep() == wrapper()


from time_sleep
1.000948429107666

完善装饰器

返回值的

import time

def time_sleep():

    time.sleep(1)
    return 'longzeluola'

def deco(func):

    def wrapper(*args,**kwargs):
        start = time.time()
        res = func(*args,**kwargs)
        end = time.time()
        print(end - start)
        return res
    return wrapper  ##wrapper() == res == func()

time_sleep = deco(time_sleep) #wrapper
res = time_sleep() #  wrapper()
print(res)

1.0001847743988037
longzeluola

参数的

import time

def time_sleep(x): #给定义了一个形参

    time.sleep(x)
    return 'longzeluola'

def deco(func):

    def wrapper(*args,**kwargs):
        start = time.time()
        res = func(*args,**kwargs)
        end = time.time()
        print(end - start)
        return res
    return wrapper  ##wrapper() == res == func()

time_sleep = deco(time_sleep) #wrapper
res = time_sleep(3) #  wrapper()
print(res)

3.00034236907959
longzeluola

装饰器模板

def deco(func):
    
    def wrapper(*args,**kwargs):
        
        res = func(*args,**kwargs)
        
        return res
    
    return wrapper

语法糖

import time

@deco  # @deco == time_sleep == deco(time_sleep)
def time_sleep(x):

    time.sleep(x)
    return 'longzeluola'

time_sleep(5)

5.000701427459717