真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

包含python函數(shù)修飾參數(shù)的詞條

python中怎么設(shè)定函數(shù)形參的類型

直接寫(xiě)個(gè)名字就行。python的一切默認(rèn)都是對(duì)象,參數(shù)沒(méi)使用前,是沒(méi)有類型的。甚至函數(shù)寫(xiě)不寫(xiě)行參都無(wú)所謂。

創(chuàng)新互聯(lián)建站專注于玉溪網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供玉溪營(yíng)銷型網(wǎng)站建設(shè),玉溪網(wǎng)站制作、玉溪網(wǎng)頁(yè)設(shè)計(jì)、玉溪網(wǎng)站官網(wǎng)定制、小程序設(shè)計(jì)服務(wù),打造玉溪網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供玉溪網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

Python中的“ @”(@)符號(hào)有什么作用?

【@】符號(hào)在python中是裝飾器的意思。

裝飾器對(duì)一個(gè)可調(diào)用對(duì)象(函數(shù)、方法、類等等)進(jìn)行裝飾,它返回的也是一個(gè)可調(diào)用對(duì)象。

一般情況下,裝飾器是對(duì)被裝飾對(duì)象的修飾與增強(qiáng)。用現(xiàn)實(shí)事物類比的話,可以類比為中間商:中間商不生產(chǎn)產(chǎn)品,它將工廠生產(chǎn)的產(chǎn)品進(jìn)行包裝、運(yùn)輸后再銷售給顧客。裝飾器不實(shí)現(xiàn)核心功能,它提供對(duì)目標(biāo)函數(shù)調(diào)用的封裝與強(qiáng)。

它裝飾的方法返回值是一個(gè)對(duì)象(BillList、Bill、List[BillDetail]等),而裝飾器【enabled_cache】的作用如它的名稱一樣:使用緩存??梢钥吹?,這個(gè)裝飾器函數(shù)中定義了一個(gè)函數(shù)【wrapper】然后將這個(gè)wrapper作為返回值。這樣,原本調(diào)用ProductionBos.bill_with_last_week的代碼就不需要做任何改變就能享受到ProductionBos.bill_with_last_week原有的功能(得到一個(gè)BillList對(duì)象)和enabled_cache提供的附加功能(如果該對(duì)象有緩存,就不再?gòu)臄?shù)據(jù)庫(kù)查詢)。

Python進(jìn)階精華-編寫(xiě)裝飾器為被包裝的函數(shù)添加參數(shù)

注意:這種發(fā)方法并不是裝飾器最常用的功能,但是在降低代碼重復(fù)上可謂是首屈一指。比如:如果不使用裝飾器,上述代碼可能會(huì)很多:

當(dāng)然,這里也有一個(gè)潛在的風(fēng)險(xiǎn),就是當(dāng)裝飾器包裹的函數(shù)已經(jīng)用了debug作為參數(shù)名,那么裝飾器這里將會(huì)報(bào)錯(cuò),所以要添加額外的一些判斷來(lái)完善代碼:

最后還剩下一部分比較難理解的地方,我將理解的注釋在每行代碼上方,這個(gè)問(wèn)題就是,在打印被修飾函數(shù)的參數(shù)簽名時(shí),其實(shí)并不能正確顯示參數(shù)簽名,原因是因?yàn)楸粀rapper修飾過(guò)后的函數(shù)實(shí)際上應(yīng)該使用的是wrapper的參數(shù)簽名表,例如:

所以,接下來(lái),完成最后最難的一步:

python 函數(shù)參數(shù)類型

python 的函數(shù)參數(shù)類型分為4種:

1.位置參數(shù):調(diào)用函數(shù)時(shí)根據(jù)函數(shù)定義的參數(shù)位置來(lái)傳遞參數(shù),位置參數(shù)也可以叫做必要參數(shù),函數(shù)調(diào)用時(shí)必須要傳的參數(shù)。

當(dāng)參數(shù)滿足函數(shù)必要參數(shù)傳參的條件,函數(shù)能夠正常執(zhí)行:

add(1,2) #兩個(gè)參數(shù)的順序必須一一對(duì)應(yīng),且少一個(gè)參數(shù)都不可以

當(dāng)我們運(yùn)行上面的程序,輸出:

當(dāng)函數(shù)需要兩個(gè)必要參數(shù),但是調(diào)用函數(shù)只給了一個(gè)參數(shù)時(shí),程序會(huì)拋出異常

add(1)

當(dāng)我們運(yùn)行上面的程序,輸出:

當(dāng)函數(shù)需要兩個(gè)必要參數(shù),但是調(diào)用函數(shù)只給了三個(gè)參數(shù)時(shí),程序會(huì)拋出異常

add(1,2,3)

當(dāng)我們運(yùn)行上面的程序,輸出

2.關(guān)鍵字參數(shù):用于函數(shù)調(diào)用,通過(guò)“鍵-值”形式加以指定??梢宰尯瘮?shù)更加清晰、容易使用,同時(shí)也清除了參數(shù)的順序需求。

add(1,2) # 這種方式傳參,必須按順序傳參:x對(duì)應(yīng)1,y對(duì)應(yīng):2

add(y=2,x=1) #以關(guān)健字方式傳入?yún)?shù)(可以不按順序)

正確的調(diào)用方式

add(x=1, y=2)

add(y=2, x=1)

add(1, y=2)

以上調(diào)用方式都是允許的,能夠正常執(zhí)行

錯(cuò)誤的調(diào)用方式

add(x=1, 2)

add(y=2, 1)

以上調(diào)用都會(huì)拋出SyntaxError 異常

上面例子可以看出:有位置參數(shù)時(shí),位置參數(shù)必須在關(guān)鍵字參數(shù)的前面,但關(guān)鍵字參數(shù)之間不存在先后順序的

3.默認(rèn)參數(shù):用于定義函數(shù),為參數(shù)提供默認(rèn)值,調(diào)用函數(shù)時(shí)可傳可不傳該默認(rèn)參數(shù)的值,所有位置參數(shù)必須出現(xiàn)在默認(rèn)參數(shù)前,包括函數(shù)定義和調(diào)用,有多個(gè)默認(rèn)參數(shù)時(shí),調(diào)用的時(shí)候,既可以按順序提供默認(rèn)參數(shù),也可以不按順序提供部分默認(rèn)參數(shù)。當(dāng)不按順序提供部分默認(rèn)參數(shù)時(shí),需要把參數(shù)名寫(xiě)上

默認(rèn)參數(shù)的函數(shù)定義

上面示例第一個(gè)是正確的定義位置參數(shù)的方式,第二個(gè)是錯(cuò)誤的,因?yàn)槲恢脜?shù)在前,默認(rèn)參數(shù)在后

def add1(x=1,y) 的定義會(huì)拋出如下異常

默認(rèn)參數(shù)的函數(shù)調(diào)用

注意:定義默認(rèn)參數(shù)默認(rèn)參數(shù)最好不要定義為可變對(duì)象,容易掉坑

不可變對(duì)象:該對(duì)象所指向的內(nèi)存中的值不能被改變,int,string,float,tuple

可變對(duì)象,該對(duì)象所指向的內(nèi)存中的值可以被改變,dict,list

這里只要理解一下這個(gè)概念就行或者自行百度,后續(xù)會(huì)寫(xiě)相關(guān)的專題文章講解

舉一個(gè)簡(jiǎn)單示例

4.可變參數(shù)區(qū)別:定義函數(shù)時(shí),有時(shí)候我們不確定調(diào)用的時(shí)候會(huì)多少個(gè)參數(shù),j就可以使用可變參數(shù)

可變參數(shù)主要有兩類:

*args: (positional argument) 允許任意數(shù)量的可選位置參數(shù)(參數(shù)),將被分配給一個(gè)元組, 參數(shù)名前帶*,args只是約定俗成的變量名,可以替換其他名稱

**kwargs:(keyword argument) 允許任意數(shù)量的可選關(guān)鍵字參數(shù),,將被分配給一個(gè)字典,參數(shù)名前帶**,kwargs只是約定俗成的變量名,可以替換其他名稱

*args 的用法

args 是用來(lái)傳遞一個(gè)非鍵值對(duì)的可變數(shù)量的參數(shù)列表給函數(shù)

語(yǔ)法是使用 符號(hào)的數(shù)量可變的參數(shù); 按照慣例,通常是使用arg這個(gè)單詞,args相當(dāng)于一個(gè)變量名,可以自己定義的

在上面的程序中,我們使用* args作為一個(gè)可變長(zhǎng)度參數(shù)列表傳遞給add()函數(shù)。 在函數(shù)中,我們有一個(gè)循環(huán)實(shí)現(xiàn)傳遞的參數(shù)計(jì)算和輸出結(jié)果。

還可以直接傳遞列表或者數(shù)組的方式傳遞參數(shù),以數(shù)組或者列表方式傳遞參數(shù)名前面加(*) 號(hào)

理解* * kwargs

**kwargs 允許你將不定長(zhǎng)度的鍵值對(duì), 作為參數(shù)傳遞給函數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict

下篇詳細(xì)講解 *args, **kwargs 的參數(shù)傳遞和使用敬請(qǐng)關(guān)注

Python的函數(shù)和參數(shù)

parameter 是函數(shù)定義的參數(shù)形式

argument 是函數(shù)調(diào)用時(shí)傳入的參數(shù)實(shí)體。

對(duì)于函數(shù)調(diào)用的傳參模式,一般有兩種:

此外,

也是關(guān)鍵字傳參

python的函數(shù)參數(shù)定義一般來(lái)說(shuō)有五種: 位置和關(guān)鍵字參數(shù)混合 , 僅位置參數(shù) , 僅關(guān)鍵字參數(shù) , 可變位置參數(shù) , 可變關(guān)鍵字參數(shù) 。其中僅位置參數(shù)的方式僅僅是一個(gè)概念,python語(yǔ)法中暫時(shí)沒(méi)有這樣的設(shè)計(jì)。

通常我們見(jiàn)到的函數(shù)是位置和關(guān)鍵字混合的方式。

既可以用關(guān)鍵字又可以用位置調(diào)用

這種方式的定義只能使用關(guān)鍵字傳參的模式

f(*some_list) 與 f(arg1, arg2, ...) (其中some_list = [arg1, arg2, ...])是等價(jià)的

網(wǎng)絡(luò)模塊request的request方法的設(shè)計(jì)

多數(shù)的可選參數(shù)被設(shè)計(jì)成可變關(guān)鍵字參數(shù)

有多種方法能夠?yàn)楹瘮?shù)定義輸出:

非?;逎?/p>

如果使用可變對(duì)象作為函數(shù)的默認(rèn)參數(shù),會(huì)導(dǎo)致默認(rèn)參數(shù)在所有的函數(shù)調(diào)用中被共享。

例子1:

addItem方法的data設(shè)計(jì)了一個(gè)默認(rèn)參數(shù),使用不當(dāng)會(huì)造成默認(rèn)參數(shù)被共享。

python里面,函數(shù)的默認(rèn)參數(shù)被存在__default__屬性中,這是一個(gè)元組類型

例子2:

在例子1中,默認(rèn)參數(shù)是一個(gè)列表,它是mutable的數(shù)據(jù)類型,當(dāng)它寫(xiě)進(jìn) __defauts__屬性中時(shí),函數(shù)addItem的操作并不會(huì)改變它的id,相當(dāng)于 __defauts__只是保存了data的引用,對(duì)于它的內(nèi)存數(shù)據(jù)并不關(guān)心,每次調(diào)用addItem,都可以修改 addItem.__defauts__中的數(shù)據(jù),它是一個(gè)共享數(shù)據(jù)。

如果默認(rèn)參數(shù)是一個(gè)imutable類型,情況將會(huì)不一樣,你無(wú)法改變默認(rèn)參數(shù)第一次存入的值。

例子1中,連續(xù)調(diào)用addItem('world') 的結(jié)果會(huì)是

而不是期望的

python函數(shù)的幾種參數(shù)類型

#Python 2.5 #這個(gè)可以用修飾器來(lái)完成 #但是一般不會(huì)限制參數(shù)類型 #給你個(gè)思路: def argfilter(*types): def deco(func): #這是修飾器 def newfunc(*args): #新的函數(shù) if len(types)==len(args): correct = True for i in range(len(args)): if not isinstance(args[i], types[i]): #判斷類型 correct = False if correct: return func(*args) #返回原函數(shù)值 else: raise TypeError else: raise TypeError return newfunc #由修飾器返回新的函數(shù) return deco #返回作為修飾器的函數(shù) @argfilter(int, str) #指定參數(shù)類型 def func(i, s): #定義被修飾的函數(shù) print i, s #之后你想限制類型的話, 就這樣: #@argfilter(第一個(gè)參數(shù)的類名, 第二個(gè)參數(shù)的類名, ..., 第N個(gè)參數(shù)的類名) #def yourfunc(第一個(gè)參數(shù), 第一個(gè)參數(shù), ..., 第N個(gè)參數(shù)): # ... # #相當(dāng)于: #def yourfunc(第一個(gè)參數(shù), 第一個(gè)參數(shù), ..., 第N個(gè)參數(shù)): # ... #yourfunc = argfilter(第一個(gè)參數(shù)的類名, 第二個(gè)參數(shù)的類名, ..., 第N個(gè)參數(shù)的類名)(yourfunc)


分享題目:包含python函數(shù)修飾參數(shù)的詞條
新聞來(lái)源:http://weahome.cn/article/doscsgi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部