python語法之閉包函數和裝飾器

1、閉包函數緩存

一、什麼是閉包函數閉包

閉:封閉ide

包:包裹函數

## 一、閉包函數必須在函數內部定義工具

##二、閉包函數能夠引用外層函數的名字性能

二、閉包函數結構測試

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

三、傳參方式網站

3.一、直接傳參url

3.二、閉包傳參spa

四、閉包函數的應用

#需求:爬取某個網站,打印獲取數據的長度

#方法一: 直接傳參
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()

 

2、裝飾器

1.一、什麼是裝飾器

裝飾:裝飾,修飾

器:工具

裝飾的工具。

*****    開放:對函數功能的添加是開放的。

           封閉:對函數功能的修改是封閉的。

1.二、做用

在不修改被裝飾對象的 源代碼 和 調用方式 的前提下,添加新的功能。

1.三、定義必須遵循

不修改被裝飾對象的源代碼。

不修改被裝飾對象的調用方式。

1.四、爲何使用閉包函數

能夠解決代碼的冗餘,提升代碼的可擴展性。

1.五、使用

應用:統計時間, 登陸認證,插入日誌,性能測試,事物處理,緩存,權限校驗等。

例:需求:

統計下載電影的時間

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() 

 

二、裝飾器語法糖

@:裝飾器的語法糖

注意: 在使用裝飾器語法糖時,裝飾器必須定義在被裝飾對象之上。

例:

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()
相關文章
相關標籤/搜索