python语法之闭包函数和装饰器

一、闭包函数

1、什么是闭包函数

闭:封闭

包:包裹

闭包函数是函数嵌套、函数对象、名称空间和作用域的集合体。

## 1、闭包函数必须在函数内部定义

##2、闭包函数可以引用外层函数的名字

2、闭包函数结构

def outer(x):
    def inner():
        print(x)
    return inner
inner = outer(2)
inner()

3、传参方式

3.1、直接传参

3.2、闭包传参

4、闭包函数的应用

#需求:爬取某个网站,打印获取数据的长度

#方法一: 直接传参
import requests
def spider_func(url):
    response = requests.get(url)    #发送地址请求指令,获取响应数据
    if response.status_code == 200:  # 判断状态码,200表示访问状态成功
        # print(response.text)      #获取数据文本
        print(len(response.text))   #统计数据长度


url = 'https://www.baidu.com/'
spider_func(url)

#方法二:通过闭包函数接收url地址,执行爬取数据
import requests

def spider_func(url):
    def inner():
        response = requests.get(url)
        if response.status_code == 200:
            print(len(response.text))
    return inner
baidu = spider_func('https://www.baidu.com/')
baidu()

 

二、装饰器

1.1、什么是装饰器

装饰:装饰,修饰

器:工具

装饰的工具。

*****    开放:对函数功能的添加是开放的。

           封闭:对函数功能的修改是封闭的。

1.2、作用

在不修改被装饰对象的 源代码 和 调用方式 的前提下,添加新的功能。

1.3、定义必须遵循

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

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

1.4、为什么使用闭包函数

可以解决代码的冗余,提高代码的可扩展性。

1.5、使用

应用:统计时间, 登录认证,插入日志,性能测试,事物处理,缓存,权限校验等。

例:需求:

统计下载电影的时间

import time

def download_movie(*args,**kwargs):
    print('开始下载电影...')
    time.sleep(3)
    print('电影下载成功')
    return 123

def outer(f):  #f = download_movie
    def inner(*args,**kwargs):
        star_time = time.time()
        res = f(*args,**kwargs)   #f(*args,**kwargs)----> download_movie(*args,**kwargs)
        end_time = time.time()
        print(f'消耗时间为:{end_time - star_time}')
        return res
    return inner
download_movie = outer(download_movie)
download_movie() 

 

2、装饰器语法糖

@:装饰器的语法糖

注意: 在使用装饰器语法糖时,装饰器必须定义在被装饰对象之上。

例:

import time

def outer(func):     #被装饰对象
    def inner(*args,**kwargs):  #被装饰对象的函数
        start_time = time.time()
        res = func(*args, **kwargs)
        end_time = time.time()
        print(f'消耗时间:{end_time - start_time}')
        return res
    return inner
# download_movie = outer(download_movie)
# download_movie()
@outer
def download_movie():
    print('开始下载电影...')
    time.sleep(3)
    print('电影下载成功')
    return 123
download_movie()

 



 

posted @ 2019-11-12 16:20  小猪皮蛋  阅读(303)  评论(0编辑  收藏  举报