python中的閉包和裝飾器的使用示例
函數(shù)參數(shù)
在python中,函數(shù)可以當(dāng)作參數(shù)使用
def func01():
print("func01 is show ......")
# func01()
# 函數(shù)名存放的是函數(shù)所在空間的地址
# print(func01)
# 函數(shù)名也可以像普通變量一樣賦值
# func02 = func01
# func02()
def foo(func):
func()
foo(func01)閉包的構(gòu)成條件
1.在函數(shù)嵌套(函數(shù)里面再定義函數(shù))的前提下
2.內(nèi)部函數(shù)使用了外部函數(shù)的變量(還包括外部函數(shù)的參數(shù))
3.外部函數(shù)返回了內(nèi)部函數(shù)
# 閉包的構(gòu)成條件:
# 1在函數(shù)嵌套(函數(shù)里面再定義函數(shù))的前提下
def func_out(num1):
def func_inner(num2):
# 2內(nèi)部函數(shù)使用了外部函數(shù)的變量(還包括外部函數(shù)的參數(shù))
num = num1 + num2
print("num的值為", num2)
# 3外部函數(shù)返回了內(nèi)部函數(shù)
return func_inner
# 創(chuàng)建閉包實(shí)例
f = func_out(10)
# 執(zhí)行閉包
f(1)
f(2)基礎(chǔ)的閉包的使用
# 外部函數(shù)
def config_name(name):
# 內(nèi)部函數(shù)
def say_info(info):
print(name + ":" + info)
return say_info
tom = config_name("tom")
tom("你好")
tom("你在嗎")
jerry = config_name("jerry")
jerry("你好")
jerry("我在呢")
# 外部函數(shù)
def config_name(name):
# 內(nèi)部函數(shù)
def say_info(info):
print(name + ":" + info)
return say_info
tom = config_name("tom")
tom("你好")
tom("你在嗎")
jerry = config_name("jerry")
jerry("你好")
jerry("我在呢")nonloal關(guān)鍵字的使用
1.非局部聲明變量指代的已有標(biāo)識(shí)符是最近外面函數(shù)的已聲明變量,但是不包括全局變量。這個(gè)是很重要的,因?yàn)榻壎ǖ哪J(rèn)行為是首先搜索本地命名空間。nonlocal聲明的變量只對局部起作用,離開封裝函數(shù),那么該變量就無效。
2.非局部聲明不像全局聲明,我們必須在封裝函數(shù)前面事先聲明該變量
3.非局部聲明不能與局部范圍的聲明沖突
# 外部函數(shù)
def func_out(num1):
# 內(nèi)部函數(shù)
# aaa = 10
def func_inner(num2):
nonlocal num1
num1 = num2 + 10
print(num1)
func_inner(10)
print(num1)
return func_inner
# num1 = 10
# f = func_out(10)
# 調(diào)用閉包 = 內(nèi)部函數(shù) num2 = 10
# f(10)
func_out(10)基礎(chǔ)代碼實(shí)現(xiàn)(裝飾器)
# 1.定義一個(gè)裝飾器(裝飾器的本質(zhì)是閉包)
def check(fn):
def inner():
print("登錄驗(yàn)證")
fn()
return inner
# 需要被裝飾的函數(shù)
def comment():
print("發(fā)表評論")
# 2使用裝飾器裝飾函數(shù)(增加一個(gè)登錄功能)
comment = check(comment)
comment()裝飾器的基本使用
# 1定義一個(gè)裝飾器(裝飾器的本質(zhì)是閉包)
def check(fn):
def inner():
print("請先登陸")
fn()
return inner
# 2使用裝飾器裝飾函數(shù)(增加一個(gè)登陸功能)
# 解釋器遇到@check 會(huì)立即執(zhí)行 comment = check(comment)
@check
def comment():
print("發(fā)表評論")
comment()裝飾器的使用
import time
# 1 定義裝飾器
def get_time(fn):
def inner():
start = time.time()
fn()
end = time.time()
print("時(shí)間:", end - start)
return inner
# 2 裝飾函數(shù)
# 要被裝飾的函數(shù)
@get_time
def func():
for i in range(100000):
print(i)
func()有參數(shù)的裝飾器的使用
# 定義裝飾器
def logging(fn): # fn = sum_num
def inner(a, b):
fn(a, b)
return inner # sum_num = inner
# 使用裝飾器裝飾函數(shù)
@logging
def sum_num(a, b):
result = a + b
print(result)
sum_num(1, 2)帶有返回值的裝飾器
# 定義裝飾器
def logging(fn): # fn = sum_num
def inner(a, b):
result = fn(a, b)
return result
return inner # sum_num = inner
# 使用裝飾器裝飾函數(shù)
@logging
def sum_num(a, b):
result = a + b
return result
result = sum_num(1, 2)
print(result)帶有不定長參數(shù)的裝飾器
# 定義裝飾器
def logging(fn): # fn = sum_num
def inner(*args, **kwargs):
fn(*args, **kwargs)
return inner # sum_num = inner
# 使用裝飾器裝飾函數(shù)
@logging
def sum_num(*args, **kwargs):
print(args, kwargs)
sum_num(1, 2, 3, age="18")帶有參數(shù)的裝飾器的使用
# 裝飾器
def logging(flag): # flag = "+"
# 外部函數(shù)
def decorator(fn):
# 內(nèi)部函數(shù)
def inner(num1, num2):
# 判斷流程
if flag == "+":
print("--正在努力加法計(jì)算--")
elif flag == "-":
print("--正在努力減法計(jì)算--")
result = fn(num1, num2)
return result
return inner
# 返回裝飾器
return decorator
# 被帶有參數(shù)的裝飾器裝飾的函數(shù)
@logging('+') # 1 logging("+") 2 @decorator起到裝飾器的功能了
def add(a, b):
result = a + b
return result
# 執(zhí)行函數(shù)
result = add(1, 3)
print(result)類裝飾器的使用
# 定義類裝飾器
class Check(object):
def __init__(self, fn):
self.__fn = fn
def __call__(self, *args, **kwargs):
print("登錄")
self.__fn()
@Check
def comment():
print("發(fā)表評論")
comment()到此這篇關(guān)于python中的閉包和裝飾器的使用的文章就介紹到這了,更多相關(guān)python閉包和裝飾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3.4 將16進(jìn)制轉(zhuǎn)成字符串的實(shí)例
今天小編就為大家分享一篇python3.4 將16進(jìn)制轉(zhuǎn)成字符串的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Python使用oslo.vmware管理ESXI虛擬機(jī)的示例參考
oslo.vmware是OpenStack通用框架中的一部分,主要用于實(shí)現(xiàn)對虛擬機(jī)的管理任務(wù),借助oslo.vmware模塊我們可以管理Vmware ESXI集群環(huán)境。2021-06-06
個(gè)人微信公眾號(hào)接入ChatGPT的教程分享
這篇文章主要為大家詳細(xì)介紹了如何為個(gè)人微信公眾號(hào)接入ChatGPT,文中的實(shí)現(xiàn)步驟講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-05-05
Python中基本的日期時(shí)間處理的學(xué)習(xí)教程
這篇文章主要介紹了Python中基本的日期時(shí)間處理的學(xué)習(xí)教程,日期時(shí)間相關(guān)模塊的使用是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10
Django學(xué)習(xí)教程之靜態(tài)文件的調(diào)用詳解
這篇文章主要給大家介紹了關(guān)于Django學(xué)習(xí)教程之靜態(tài)文件調(diào)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用django具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
淺談keras中的后端backend及其相關(guān)函數(shù)(K.prod,K.cast)
這篇文章主要介紹了淺談keras中的后端backend及其相關(guān)函數(shù)(K.prod,K.cast),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
macOS M1(AppleSilicon) 安裝TensorFlow環(huán)境
蘋果為M1芯片的Mac提供了TensorFlow的支持,本文主要介紹了如何給使用M1芯片的macOS安裝TensorFlow的環(huán)境,感興趣的可以了解一下2021-08-08
Python3實(shí)現(xiàn)Excel行分級(jí)與單元格填色
這篇文章主要為大家詳細(xì)介紹了如何使用Python3實(shí)現(xiàn)Excel行分級(jí)與單元格填色功能,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2025-02-02

