国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

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

APICloud / 2434人閱讀

摘要:調(diào)用函數(shù)時(shí),必須傳入且傳入的兩個(gè)值按照位置順序依次賦給參數(shù)和,若缺省,則會(huì)報(bào)錯(cuò)。例如二默認(rèn)參數(shù)在函數(shù)定義中,為參數(shù)預(yù)先定義默認(rèn)值。執(zhí)行相當(dāng)于調(diào)用如果要求的四次方,則需要執(zhí)行設(shè)置默認(rèn)參數(shù)的好處默認(rèn)參數(shù)可以簡(jiǎn)化函數(shù)的調(diào)用,降低調(diào)用函數(shù)的難度。


題外話:因?yàn)闀r(shí)間關(guān)系,沒(méi)能保持一定的更新頻率。但還是會(huì)一直堅(jiān)持的~

之前介紹了Python函數(shù)的定義,今天分享一下Python函數(shù)的參數(shù)吧!內(nèi)容會(huì)有點(diǎn)多~

Python的函數(shù)定義比較簡(jiǎn)單,借助于關(guān)鍵字def進(jìn)行實(shí)現(xiàn),但是參數(shù)的靈活度卻非常大。除了正常定義的必選參數(shù)外,還可以使用默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)、命名關(guān)鍵字參數(shù)以及參數(shù)組合,這使得函數(shù)定義出來(lái)的接口,不僅能處理復(fù)雜的參數(shù),還能簡(jiǎn)化調(diào)用者的代碼。


一、位置參數(shù)

在函數(shù)定義的時(shí)候,指定參數(shù)的位置順序。位置參數(shù)必須在被調(diào)用函數(shù)定義中的準(zhǔn)確順序來(lái)進(jìn)行傳遞。

例如:計(jì)算x的n次方

def powern(x,n):
    s = 1
    while n >0:
        s = s * x
        n = n -1
    return s

x與n這兩個(gè)參數(shù)都是位置參數(shù)。調(diào)用函數(shù)時(shí),必須傳入且傳入的兩個(gè)值按照位置順序依次賦給參數(shù)x和n,若缺省,則會(huì)報(bào)錯(cuò)。例如:

>>> powern(5)
Traceback (most recent call last):
File "", line 1, in 
TypeError: powern() missing 1 required positional argument: "n"
二、默認(rèn)參數(shù)

在函數(shù)定義中,為參數(shù)預(yù)先定義默認(rèn)值。當(dāng)在函數(shù)調(diào)用時(shí),若沒(méi)有為參數(shù)提供指定值,則使用默認(rèn)值。
例如:仍舊是求x的n次方,但是默認(rèn)為x的3次方。

def powern( x,n = 3):
    s = 1
    while n >0:
        s = s * x
        n = n -1
    return s

執(zhí)行:powern(2),相當(dāng)于調(diào)用powern(2,3)
如果要求2的四次方,則需要執(zhí)行:powern(2,4)

設(shè)置默認(rèn)參數(shù)的好處?
默認(rèn)參數(shù)可以簡(jiǎn)化函數(shù)的調(diào)用,降低調(diào)用函數(shù)的難度。無(wú)論是簡(jiǎn)單調(diào)用還是復(fù)雜調(diào)用,函數(shù)只需定義一個(gè)。
例如上述powern()的例子,當(dāng)傳入n的其他值時(shí),則可以實(shí)現(xiàn)x的其他n次方。

但是在使用默認(rèn)參數(shù)的時(shí)候,如果使用不當(dāng),也會(huì)有坑。先來(lái)了解一下可變參數(shù)和不可變參數(shù)作為函數(shù)參數(shù)時(shí)的不同:

不可變參數(shù)作為函數(shù)參數(shù)

>>> a = 1
>>> def func(a):
...     print("func_id:",id(a))
...     a = 2
...     print("after_func_id:",id(a),"id(2):",id(2))
...
>>> print("out_of_func_id:",id(a),"id(1):",id(1))
out_of_func_id: 501962480  id(1): 501962480   # 全局變量a的id
>>> func(a)            # 將全局參數(shù)a傳入函數(shù)
func_id: 501962480    # a=1 的id
after_func_id: 501962496  id(2): 501962496  
>>> print(a)            # 退出函數(shù),a的值仍為1
1

當(dāng)把全局a傳遞給函數(shù)后,函數(shù)自動(dòng)復(fù)制一份引用。執(zhí)行完a=2之后,id(a)的內(nèi)存地址發(fā)生變化。但是跟外層的a沒(méi)有關(guān)系。

可變對(duì)象作為函數(shù)參數(shù)

>>> a = []
>>> def func2(a):
...     print("func2_id:",id(a))
...     a.append(1)
...
>>> print("out_of_func2_id",id(a))
out_of_func2_id 59694296
>>> func2(a)
func2_id: 59694296
>>> print(a)
[1]

變量a的類(lèi)型為list,是可變對(duì)象。函數(shù)的引用指向的是可變對(duì)象,地址沒(méi)有發(fā)生變化,所以函數(shù)操作后,a的內(nèi)容發(fā)生了改變。
所以當(dāng)再次操作func2(a)函數(shù)時(shí),產(chǎn)生跟預(yù)期不一樣的結(jié)果:

>>> func2(a)
func2_id: 59694296    # a地址不變
>>> print(a)
[1, 1]        # 因?yàn)榈谝淮螆?zhí)行func2(a)時(shí),已經(jīng)修改了a=[1],再次調(diào)用時(shí),在[1]里新增

使用可變對(duì)象作為默認(rèn)參數(shù)
例如:

def add_end( L=[] ):  # 設(shè)置為一個(gè)list變量L(對(duì)象可變)
    L.append("end")
    return L
>>> add_end( )
["end"]
>>> add_end()  
["end", "end"]

當(dāng)連續(xù)重復(fù)使用默認(rèn)參數(shù)調(diào)用時(shí),結(jié)果出現(xiàn)錯(cuò)誤。
Python函數(shù)在定義的時(shí)候,默認(rèn)參數(shù)L的值就被計(jì)算出來(lái)了,即[]。L也是一個(gè)變量,它指向?qū)ο骩],每次調(diào)用該函數(shù),如果改變了L的內(nèi)容,則下次調(diào)用時(shí),默認(rèn)參數(shù)的內(nèi)容就變了,不再是函數(shù)定義時(shí)的[]了。
可以改為:

def add_end( L=None ):  # L為不變對(duì)象  
    if L is None:          
    L = []            
    L.append("end")   
    return L      

則無(wú)論調(diào)用多少次,都不會(huì)出現(xiàn)問(wèn)題。
所以,定義默認(rèn)參數(shù)要牢記一點(diǎn):默認(rèn)參數(shù)必須指向不變對(duì)象!因?yàn)椴蛔儗?duì)象一旦創(chuàng)建,對(duì)象內(nèi)部的數(shù)據(jù)就不能修改,這樣就減少了由于修改數(shù)據(jù)導(dǎo)致的錯(cuò)誤。此外,由于對(duì)象不變,多任務(wù)環(huán)境下同時(shí)讀取對(duì)象不需要加鎖。

設(shè)置默認(rèn)參數(shù)時(shí),有幾點(diǎn)需要注意
一.必選參數(shù)在前,默認(rèn)參數(shù)在后,否則Python的解釋器會(huì)報(bào)錯(cuò)。
二.如何設(shè)置默認(rèn)參數(shù)?當(dāng)函數(shù)有多個(gè)參數(shù)時(shí),把變化大的參數(shù)放前面,變化小的參數(shù)放后面。變化小的參數(shù)就可以作為默認(rèn)參數(shù)。
三.不要使用可變對(duì)象作為默認(rèn)參數(shù)。

三、可變參數(shù)*args

可變參數(shù),即傳入的參數(shù)個(gè)數(shù)是可變的,0至任意個(gè)。
因?yàn)閰?shù)個(gè)數(shù)不確定,則可以使用一個(gè)list 或者tuple傳進(jìn)來(lái)。之后在函數(shù)調(diào)用時(shí)會(huì)自動(dòng)組裝為一個(gè)tuple。
例如:

def calc(numbers):  # 變量        
    sum = 0               
    for n in numbers:       
        sum = sum + n * n   
    return sum            
>>> calc( [1,2,3] )   # 傳入的是一個(gè)list
14

利用可變參數(shù) *args:

def calc( *numbers ):  
    sum = 0        
    for n in numbers:    # 在函數(shù)內(nèi)部,numbers組裝成一個(gè)tuple
    sum = sum + n * n
    return sum
>>> calc( )            # 0個(gè)參數(shù)  
0
>>> calc( 1,3,5,7 )    # 多個(gè)參數(shù) 
84
>>> num = [1,2,3]      # list
>>> calc( *num )       # *list –> tuple
14   
>>> t = (1,3,5)
>>> calc( t )          # tuple(錯(cuò)誤)  
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 4, in calc
TypeError: can"t multiply sequence by non-int of type "tuple"
>>> calc( *t )                  
35

函數(shù)代碼完全不變。但是,調(diào)用該函數(shù)時(shí),可以傳入任意個(gè)參數(shù),包括0個(gè)參數(shù)。

四、關(guān)鍵字參數(shù)**kw

關(guān)鍵字參數(shù)**kw允許傳入0個(gè)至任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict。例如:

def person(name , age , **kw ):
    print("name:",name,"age:",age,"other:",kw)
>>> person("xiong",18)
name: xiong age: 18 other: {}
>>> person("xiong",18,city = "SH")          # city是原本沒(méi)有的參數(shù),但是因?yàn)橛?*kw
name: xiong age: 18 other: {"city": "SH"}

關(guān)鍵參數(shù)有什么用?可以擴(kuò)展函數(shù)的功能。比如在person()函數(shù)里面,可以保證接收到name和age這兩個(gè)參數(shù)。但是如果提供更多參數(shù),也能收到。當(dāng)然也可以先組裝一個(gè)dict,再把該dict轉(zhuǎn)換為關(guān)鍵字參數(shù)傳遞進(jìn)去:

>>> extra ={"city":"shanghai","job":"SET"}                     # dict的定義
>>> person("xiong",18,city = extra["city"],job=extra["job"])   # dict的使用
name: xiong age: 18 other: {"city": "shanghai", "job": "SET"}  # dict的內(nèi)容
>>> person("xiong",18,**extra)
name: xiong age: 18 other: {"city": "shanghai", "job": "SET"}

【總結(jié)】**extra表示把extra這個(gè)dict的所有key-value用關(guān)鍵字參數(shù)傳入到函數(shù)的**kw參數(shù),kw將獲得一個(gè)dict,注意kw獲得的dict是extra的一份拷貝,對(duì)kw的改動(dòng)不會(huì)影響到函數(shù)外的extra。

五、命名關(guān)鍵字參數(shù)

如果要限制關(guān)鍵字參數(shù)的名字,就可以用命名關(guān)鍵字參數(shù)。需要一個(gè)特殊分隔符“”,“”后面的參數(shù)被視為命名關(guān)鍵字參數(shù)。如果缺少“*”,Python解釋器則無(wú)法識(shí)別位置參數(shù)和命名關(guān)鍵字參數(shù)。在調(diào)用時(shí),必須指定參數(shù)名字與參數(shù)值。
例如,只接收city和job作為關(guān)鍵字參數(shù),可以使用如下定義:

def person( name ,age,*,city,job):
    print(name , age , city , job )
>>> person("xiong", 18, city="shanghai", job="tester")
xiong 18 shanghai tester

如果函數(shù)定義中已經(jīng)有了一個(gè)可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個(gè)特殊分隔符*了:

>>> def person( name,age,*args,city,job ):     # 此處city和job也是命名關(guān)鍵字參數(shù)
...   print(name, age, city, job)

命名關(guān)鍵字參數(shù)必須傳入?yún)?shù)名,如果沒(méi)有傳入?yún)?shù)名,調(diào)用將會(huì)報(bào)錯(cuò):

>>> person("xlp",18,"shanghai","tester")          # 錯(cuò)誤調(diào)用 
Traceback (most recent call last):
  File "", line 1, in 
TypeError: person() missing 2 required keyword-only arguments: "city" and "job"
>>> person("xlp",18,city="shanghai",job="tester")  # 正確調(diào)用 
xlp 18 shanghai tester

命名關(guān)鍵字參數(shù)可以有缺省值,從而簡(jiǎn)化調(diào)用:

>>> def person1(name,age,*,city="shanghai",job):
...   print(name,age,city,job)
...
>>> person1("xlp",18,job="engineer")
xlp 18 shanghai engineer
六、參數(shù)組合

在Python中定義函數(shù),可以用位置參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù),這5種參數(shù)都可以組合使用。
但是要注意,參數(shù)定義的順序必須是:位置參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)。

【總結(jié)】

(1)定義可變參數(shù)和關(guān)鍵字參數(shù)的語(yǔ)法:
*args是可變參數(shù),args接收的是一個(gè)list、tuple;
**kw是關(guān)鍵字參數(shù),kw接收的是一個(gè)dict;
(2)調(diào)用函數(shù)時(shí)如何傳入可變參數(shù)和關(guān)鍵字參數(shù)的語(yǔ)法:
可變參數(shù)直接傳入:func(1,2,3)
可變參數(shù)間接傳入:先組裝成list或tuple,l=(1,2,3),再通過(guò)args傳入,func(l)
關(guān)鍵字參數(shù)直接傳入:func(a=1,b=2)
關(guān)鍵字參數(shù)間接傳入:先組裝成dict,d={‘a(chǎn)’:1,’b’:2},再通過(guò)kw傳入,func(d)
(3)命名關(guān)鍵字參數(shù) 是為了限制調(diào)用者可以傳入的參數(shù)名,同時(shí)可以提供默認(rèn)值。
(4)定義命名的關(guān)鍵字參數(shù)在沒(méi)有可變參數(shù)的情況下,不要忘記寫(xiě)分隔符*,否則定義的將是位置參數(shù)。


? thanks for watching, keep on updating...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/42370.html

相關(guān)文章

  • 【數(shù)據(jù)科學(xué)系統(tǒng)學(xué)習(xí)】Python # 編程基礎(chǔ)[一]

    摘要:在定義函數(shù)時(shí)給定的名稱(chēng)稱(chēng)作形參,在調(diào)用函數(shù)時(shí)你所提供給函數(shù)的值稱(chēng)作實(shí)參。調(diào)用函數(shù)要調(diào)用一個(gè)函數(shù),需要知道函數(shù)的名稱(chēng)和參數(shù)。默認(rèn)參數(shù)值可以有效幫助解決這一情況。是默認(rèn)參數(shù)定義默認(rèn)參數(shù)要牢記一點(diǎn)默認(rèn)參數(shù)必須指向不變對(duì)象。 關(guān)于數(shù)據(jù)科學(xué)在做什么,我們已經(jīng)在前兩篇文章中進(jìn)行了總結(jié),即專(zhuān)題概述和描述性統(tǒng)計(jì)分析。要進(jìn)行數(shù)據(jù)科學(xué)的探索,需要一個(gè)好工具,就是Python。從本篇開(kāi)始,將總結(jié)學(xué)習(xí)Pyth...

    luckyyulin 評(píng)論0 收藏0
  • Python 調(diào)用 C 動(dòng)態(tài)鏈接庫(kù),包括結(jié)構(gòu)體參數(shù)、回調(diào)函數(shù)

    摘要:調(diào)用以回調(diào)函數(shù)地址為參數(shù)的函數(shù)這個(gè)主題就稍微繞一些了,也就是說(shuō)在接口中,需要傳入回調(diào)函數(shù)作為參數(shù)。這個(gè)問(wèn)題在中也可以解決,并且回調(diào)函數(shù)可以用定義。代碼代碼很簡(jiǎn)單回調(diào)函數(shù)的傳入?yún)?shù)為,返回參數(shù)也是。 項(xiàng)目中要對(duì)一個(gè)用 C 編寫(xiě)的 .so 庫(kù)進(jìn)行邏輯自測(cè)。這項(xiàng)工作,考慮到靈活性,我首先考慮用 Python 來(lái)完成。 研究了一些資料,采用 python 的 ctypes 來(lái)完成這項(xiàng)工作。已經(jīng)...

    NickZhou 評(píng)論0 收藏0
  • C++開(kāi)發(fā)python windows版本擴(kuò)展模塊示例

    摘要:主要是庫(kù)文件頭文件文件不一致的問(wèn)題。定義模塊函數(shù)其中函數(shù)參數(shù)是模塊自身,是傳遞的參數(shù)列表,返回值定義了一個(gè)整形數(shù),這里會(huì)申請(qǐng)空間增加引用計(jì)數(shù),交由來(lái)管理這個(gè)引用。 C++開(kāi)發(fā)python windows版本的擴(kuò)展模塊示例測(cè)試環(huán)境介紹和準(zhǔn)備測(cè)試環(huán)境:操作系統(tǒng):windows10Python版本:3.7.0VS版本:vs2015社區(qū)版(免費(fèi))相關(guān)工具下載:VS版本vs2015社區(qū)版(免費(fèi))...

    junfeng777 評(píng)論0 收藏0
  • C++開(kāi)發(fā)python windows版本擴(kuò)展模塊示例

    摘要:主要是庫(kù)文件頭文件文件不一致的問(wèn)題。定義模塊函數(shù)其中函數(shù)參數(shù)是模塊自身,是傳遞的參數(shù)列表,返回值定義了一個(gè)整形數(shù),這里會(huì)申請(qǐng)空間增加引用計(jì)數(shù),交由來(lái)管理這個(gè)引用。 C++開(kāi)發(fā)python windows版本的擴(kuò)展模塊示例測(cè)試環(huán)境介紹和準(zhǔn)備測(cè)試環(huán)境:操作系統(tǒng):windows10Python版本:3.7.0VS版本:vs2015社區(qū)版(免費(fèi))相關(guān)工具下載:VS版本vs2015社區(qū)版(免費(fèi))...

    Meathill 評(píng)論0 收藏0
  • Python入門(mén)-函數(shù)

    摘要:函數(shù)返回值支持多個(gè),返回多個(gè)時(shí),使用逗號(hào)分隔。如上,與這個(gè)參數(shù)按照由左到右依次賦值給形參和供函數(shù)內(nèi)部使用。在傳入函數(shù)時(shí),便是將這個(gè)引用傳入了函數(shù)。需要使用關(guān)鍵字聲明將變量作用域變?yōu)楹瘮?shù)外部非全局變量,及閉包作用域。 < 返回索引頁(yè) 函數(shù) 函數(shù)定義 返回值 函數(shù)的調(diào)用 函數(shù)的參數(shù) 順序參數(shù) 參數(shù)的默認(rèn)值 可變參數(shù) 關(guān)鍵字參數(shù) 參數(shù)的組合 參數(shù)的專(zhuān)遞 函數(shù)作用域 內(nèi)建...

    genefy 評(píng)論0 收藏0
  • 100 個(gè)基本 Python 面試問(wèn)題第二部分(21-40)

    摘要:為我們提供了許多內(nèi)置函數(shù),例如并提供了創(chuàng)建用戶(hù)定義函數(shù)的能力。會(huì)將該變量視為函數(shù)級(jí)作用域中的局部變量。回到目錄中函數(shù)的用途是什么是中的內(nèi)置函數(shù)之一。請(qǐng)注意,這種類(lèi)型的參數(shù)語(yǔ)法不允許將命名參數(shù)傳遞給函數(shù)。函數(shù)接受一個(gè)稱(chēng)為的可選參數(shù)。 ...

    2450184176 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<