公司網(wǎng)站的seo優(yōu)化怎么做百度網(wǎng)盤人工客服電話多少
一、閉包:
1. 外部函數(shù)嵌套內(nèi)部函數(shù) ?
2. 外部函數(shù)返回內(nèi)部函數(shù) ?
3.內(nèi)部函數(shù)可以訪問外部函數(shù)局部變量?
????????閉包(Closure)是指在一個函數(shù)內(nèi)部定義的函數(shù),并且內(nèi)部函數(shù)可以訪問外部函數(shù)的局部變量,即使外部函數(shù)已經(jīng)執(zhí)行完畢,這種現(xiàn)象稱為閉包。在Python中,閉包常常用來實(shí)現(xiàn)一些特定功能,例如保護(hù)變量、實(shí)現(xiàn)裝飾器等。
import randomdef fun1():print("fun1")datas = []def fun2():datas.append(random.randint(0, 100))print("fun2", datas)return fun2r = fun1()
r()r1 = fun1()
r1()print(id(r), id(r1))
特點(diǎn)和用途:
-
訪問外部變量:閉包可以訪問定義它們的外部函數(shù)的局部變量,即使外部函數(shù)已經(jīng)返回,閉包仍然保留對這些變量的引用。
-
保護(hù)變量:可以通過閉包來保護(hù)數(shù)據(jù),因?yàn)橥獠亢瘮?shù)的局部變量在閉包中不會被銷毀或修改,除非內(nèi)部函數(shù)顯式地修改它們。
-
實(shí)現(xiàn)裝飾器:裝飾器本質(zhì)上就是閉包,它能夠在不修改原函數(shù)代碼的情況下,動態(tài)地增加功能。
閉包在Python中常用于函數(shù)式編程和實(shí)現(xiàn)一些高級的編程模式,能夠提供更靈活和高效的編程解決方案。?
二、裝飾器:
目的:不改變函數(shù)原有實(shí)現(xiàn)給函數(shù)添加新功能
概念:一個閉包就是一個函數(shù)+在創(chuàng)建這個函數(shù)時(shí)可以訪問的變量
實(shí)現(xiàn):閉包+@語法
????????裝飾器(Decorator)是Python中一種特殊的函數(shù),它可以修改其他函數(shù)的行為或功能。裝飾器本質(zhì)上是一個函數(shù),它接收一個函數(shù)作為輸入,并返回一個新的函數(shù)作為輸出。裝飾器通常用于在不改變原函數(shù)代碼的情況下,動態(tài)地增加功能、修改函數(shù)的行為或者執(zhí)行額外的操作。
裝飾器案例:
1.時(shí)間開銷:
import random
import timedatas = [random.randint(1, 1000) for i in range(1000)]
datas_copy = datas.copy()def time_cost(f):def calc(sort_type):start = time.time()f(sort_type)print(f"{f.__name__} {time.time() - start}")return calc@time_cost
def fun1(sort_type):datas.sort(reverse=sort_type)print(datas)@time_cost
def fun2(sort_type):new_datas = sorted(datas_copy, reverse=sort_type)print(new_datas)# fun1 = time_cost(fun1)
fun1(True)# fun2 = time_cost(fun2)
fun2(True)
?權(quán)限校驗(yàn):
user = Nonedef login_required(f):def chair():global userif user:f()else:while True:username = input("用戶名")password = input("密碼")if username == "admin" and password == "666666":user = "admin"f()breakelse:print("用戶名或密碼錯誤")return chairdef index():print("首頁")@login_required
def center():print("個人中心")@login_required
def cart():print("購物車")index()# center = login_required(center)
center()# cart = login_required(cart)
cart()
裝飾器的特點(diǎn)和用途:
-
修改函數(shù)行為:裝飾器允許我們在不修改原函數(shù)代碼的情況下,添加、修改或擴(kuò)展函數(shù)的行為。
-
動態(tài)增加功能:可以在函數(shù)調(diào)用前后執(zhí)行額外的操作,如輸入驗(yàn)證、性能測試、日志記錄等。
-
代碼復(fù)用和簡化:裝飾器可以避免代碼重復(fù),使代碼更加簡潔和易于維護(hù)。
-
裝飾器鏈:可以同時(shí)應(yīng)用多個裝飾器,形成裝飾器鏈,每個裝飾器可以獨(dú)立地修改函數(shù)的行為。
在實(shí)際應(yīng)用中,裝飾器是Python中非常強(qiáng)大和靈活的特性,被廣泛用于Web框架、日志系統(tǒng)、權(quán)限控制等需要動態(tài)修改函數(shù)行為的場景。?