python_August(閉包、裝飾器)

yybokeyuan發表於2024-09-05

目錄
  • 閉包函式
  • 裝飾器
  • 登入裝飾器

閉包函式

列如一個簡單爬蟲,這裡的request需要從第三方庫匯入

# import requests	##pip install request
# response = requests.get('http://www.xiaohuar.com/')
# response.encoding = 'gb2312'	##解碼方式
# data = response.text			###文字
# print(data)

##如果需要在抓或者更改網址就需要再寫一遍
##如response = requests.get('http://www.xiaohuar.com/')
##如response = requests.get('http://www.baidu.com/')

使用一層包裝的時候,寫的稍微簡潔一點了,但是還是要填同一個網址的時候重複填

import requests
def spider(url):
    response = requests.get(url)
    response.endcoding = 'gb2312'
    data = response.text
    return data
pa = spider('http://www.baidu.com/')#這裡就用http就行https安全效能高,需要多次握手等,爬不出來東西
print(pa)	###可以爬出前端的一些資訊

但是終極還是使用閉包,第二次使用就只需要一個f()就行

import requests
def wrapper(url):
    def spider():
        response = requests.get(url)
        response.endcoding = 'gb2312'
        data = response.text
        return data
    return spider

name = '第一次'
f = wrapper('https://www.baidu.com/')##要爬完整請改成http(不要那個s)
print(f(),f'/n**50')
print('*'*50,f"{name}")##自設計分隔符

import time
time.sleep(2)##設定時間間隔
name = '第二次'
print(f())
print('/'*50,f"{name}")##自設計分隔符

裝飾器

裝飾器:改變功能的時候不改變原來的呼叫方式,並且改變原來函式的程式碼

import time
### 這是一個時間驗證模組
def time_count():
    start_time = time.time()##此刻時間
    time.sleep(2.4)
    end_time = time.time()##此刻時間
    timecc = (end_time - start_time)
    return timecc
##下面即為裝飾器模板
def deco(func):
    def wrapper():
        res = func()
        return res
    return wrapper

f = deco(time_count)
print(f())

登入裝飾器

userinfo_dict = {'nick': '123'}
is_login = False  # 定義成可變型別或者使用global

def login(func):
    def wrapper(*args, **kwargs):
        global is_login		###這裡使用全域性定義
        if not is_login:
            username = input('請輸入你的使用者名稱>>>').strip()
            pwd = input('請輸入你的密碼>>>').strip()
            if pwd == userinfo_dict.get(username):
                print('登陸成功')
                is_login = True
                res = func(*args, **kwargs)
                return res
            else:
                print('傻逼,來老子這裡吃霸王餐')
        ###如果已經登入了再重新整理使用程式就不用反覆登入了
        else:
            res = func(*args, **kwargs)
            return res
    return wrapper

def func1():
    pass

login(func1)()

相關文章