python基礎(chǔ)類(lèi)型(三):可調(diào)用類(lèi)型——函數(shù)和方法

一琼稻、可調(diào)用類(lèi)型

在 python中所有的類(lèi)型都是對(duì)象幻馁,即使是 int庇配,float這些其他語(yǔ)言中的基礎(chǔ)類(lèi)型在 python中也是以對(duì)象的形式存在尼夺,函數(shù)和方法也不例外尊残。

在 python中函數(shù)和方法是可調(diào)用類(lèi)型的兩個(gè)子集,可調(diào)用類(lèi)型一共有 5種:

類(lèi)型名稱(chēng) 描述
types.BuiltinFunctionType 內(nèi)置函數(shù)或方法
type 內(nèi)置類(lèi)型和類(lèi)的類(lèi)型
object 所有類(lèi)和類(lèi)型的祖先
types.FunctionType 用戶(hù)定義的函數(shù)
types.MethodType 類(lèi)方法

最后兩種就是我們常說(shuō)的函數(shù)和方法淤堵,函數(shù)在類(lèi)外被定義夜郁,而方法在類(lèi)里面被定義,我們也可以說(shuō)方法是類(lèi)里面的函數(shù)粘勒,如:

# 在類(lèi)外定義的是函數(shù)
def function_1():
    print("Hello World. This is a function.")

class TestClass:
    # 在類(lèi)里面定義的是方法
    def function_2():
        print("Hello World. This is a method.")

需要注意的是竞端,在 C++、JAVA這些面向?qū)ο蟮恼Z(yǔ)言中函數(shù)和方法指的是同一個(gè)概念庙睡,它們沒(méi)有像 python一樣做出類(lèi)型區(qū)分事富,只是在叫法上有些區(qū)別而已。

在這篇教程中我們只講函數(shù)乘陪,至于方法等我們講到類(lèi)的時(shí)候再詳細(xì)地講统台,在這之前大家像用函數(shù)一樣用方法就行。

二啡邑、函數(shù)的屬性

前面我們講到每個(gè)函數(shù)都是一個(gè)對(duì)象贱勃,對(duì)象自然有對(duì)應(yīng)的屬性:

  1. __doc__:函數(shù)的注釋?zhuān)褪蔷o挨著函數(shù)名的一個(gè)字符串,用來(lái)注釋函數(shù)谤逼,文檔生產(chǎn)工具可以根據(jù)這些字符串生成對(duì)應(yīng)的文檔贵扰,如:

    
    def f(name="name"):
        """
        This is a function.
        """
        pass
    
    
    print(f.__doc__)
    
    """
    
        This is a function.
        
    """
    
  2. __name__:函數(shù)的名字,如:

    def function_name():
        pass
    
    print(function_name.__name__)
    # function_name
    
  3. __defaults__:包含默認(rèn)參數(shù)名的元組流部,如:

    def function_defaults(args_1, args_2='name'):
        pass
    
    print(function_defaults.__defaults__)
    # ('name',)
    

三戚绕、函數(shù)的參數(shù)

函數(shù)的參數(shù)有兩種,位置參數(shù)和關(guān)鍵字參數(shù)枝冀,這兩者又分為有默認(rèn)值和沒(méi)有默認(rèn)值兩種類(lèi)型舞丛。

位置參數(shù)和關(guān)鍵字參數(shù)的主要區(qū)別是耘子,位置參數(shù)在傳遞的時(shí)候可以不指定變量名,而是按照約定的順序進(jìn)行賦值球切,而關(guān)鍵字參數(shù)必須指定變量名才能對(duì)其進(jìn)行賦值谷誓,如:


def function_args(a1, a2):
    print("a1:", a1, "a2", a2)
    
function_args('1','2')
# a1: 1 a2 2
# a1和 a2都是位置參數(shù),第一個(gè)參數(shù)賦值給 a1吨凑,第二個(gè)參數(shù)賦值給 a2

def function_keyword_args(a1, *, a2):
    print("a1:", a1, "a2", a2)
    
function_keyword_args('1', a2='2')
# 此時(shí)再使用 function_keyword_args('1', '2')會(huì)報(bào)錯(cuò)
# 因?yàn)?a2是關(guān)鍵字參數(shù)捍歪,必須指定變量名

所有的參數(shù)默認(rèn)為位置參數(shù),只有當(dāng)使用 *分隔時(shí)后面的參數(shù)才會(huì)被看作關(guān)鍵字參數(shù)怀骤。

注意:

在定義函數(shù)時(shí)上面四種參數(shù)的書(shū)寫(xiě)順序是有嚴(yán)格限制的费封,位置參數(shù)必須聲明在最前面焕妙,同時(shí)有默認(rèn)值的參數(shù)必須在沒(méi)有默認(rèn)值的參數(shù)后面蒋伦,如:

def function_args(a1, a2='2', *, a3, a4='4'):
    print("a1:", a1, "a2", a2, "a3:", a3, "a4:", a4)

# 下面的定義是錯(cuò)誤的
# 有默認(rèn)值的參數(shù)在前
def function_args(a2='2', a1, *, a3, a4='4'):
    print("a1:", a1, "a2", a2, "a3:", a3, "a4:", a4)

當(dāng)我們有很多參數(shù)要傳遞給函數(shù)時(shí),我們可能會(huì)寫(xiě)出這樣的代碼:

def function_args(a1, a2, a3, a4, a5, a6, *, b1, b2, b3, b4):
    pass

function_args(1, 2, 3, 4, 5, 6, b1=1, b2=2, b3=3, b4=4)

這樣的代碼可以說(shuō)是很糟糕的代碼了焚鹊,這時(shí)我們可以使用 ***來(lái)簡(jiǎn)化我們的代碼痕届,如:

def function_args(a1, a2, a3, a4, a5, a6, *, b1, b2, b3, b4):
    pass

args = [1, 2, 3, 4, 5, 6]
# 或者 args = (1, 2, 3, 4, 5, 6)
keyword_args = {
    'b1': 1,
    'b2': 2,
    'b3': 3,
    'b4': 4
}

function_args(*ags, **keyword_args)

*的操作對(duì)象是列表或者元組,用來(lái)傳遞位置參數(shù)末患,**的操作對(duì)象是字典研叫,用來(lái)傳遞關(guān)鍵字參數(shù)。

四璧针、函數(shù)作為變量使用

既然函數(shù)是一種特殊的變量類(lèi)型嚷炉,那變量所具有的操作肯定也可以應(yīng)用到函數(shù)上,比如:

  1. 賦值給其他變量:

    def say_hello():
        print("Hello World")
    
    say_hello_2 = say_hello
    say_hello_2()
    # Hello World
    
  2. 作為參數(shù)傳遞

    def say_hello():
        print("Hello World")
    
    def execute_func(func):
        func()
    
    execute_func(say_hello)
    # Hello World
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末探橱,一起剝皮案震驚了整個(gè)濱河市申屹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隧膏,老刑警劉巖哗讥,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異胞枕,居然都是意外死亡杆煞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)腐泻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)决乎,“玉大人,你說(shuō)我怎么就攤上這事派桩∪鹎” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵窄坦,是天一觀的道長(zhǎng)唤反。 經(jīng)常有香客問(wèn)我凳寺,道長(zhǎng),這世上最難降的妖魔是什么彤侍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任肠缨,我火速辦了婚禮,結(jié)果婚禮上盏阶,老公的妹妹穿的比我還像新娘晒奕。我一直安慰自己,他們只是感情好名斟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布脑慧。 她就那樣靜靜地躺著,像睡著了一般砰盐。 火紅的嫁衣襯著肌膚如雪闷袒。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天岩梳,我揣著相機(jī)與錄音囊骤,去河邊找鬼。 笑死冀值,一個(gè)胖子當(dāng)著我的面吹牛也物,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播列疗,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼滑蚯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了抵栈?” 一聲冷哼從身側(cè)響起告材,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竭讳,沒(méi)想到半個(gè)月后创葡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绢慢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年灿渴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胰舆。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骚露,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缚窿,到底是詐尸還是另有隱情棘幸,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布倦零,位于F島的核電站误续,受9級(jí)特大地震影響吨悍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹋嵌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一育瓜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栽烂,春花似錦躏仇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至怀喉,卻和暖如春书妻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背磺送。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工驻子, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灿意,地道東北人估灿。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缤剧,于是被迫代替她去往敵國(guó)和親馅袁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 寫(xiě)在前面的話(huà) 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,764評(píng)論 0 8
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,812評(píng)論 0 38
  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的;脑汗销! 因?yàn)镾cala是基于Java虛擬機(jī),也就是...
    燈火gg閱讀 3,444評(píng)論 1 24
  • 近日抵窒,偶得一夢(mèng)弛针,其情其景,恍若在側(cè)李皇,雖醒時(shí)尤在目削茁,戰(zhàn)戰(zhàn)兢兢,以文載之掉房。 恍惚間應(yīng)在宋時(shí)茧跋,有一商賈,因年代久遠(yuǎn)...
    公丕軍閱讀 1,031評(píng)論 1 1
  • “周百科”?是個(gè)人名還是一本書(shū)哪亿?又是出于好奇粥烁,我開(kāi)始了探索“周百科”是什么的旅程贤笆。 有問(wèn)題,找“度娘”疤肿琛苏潜!...
    氿念姊閱讀 439評(píng)論 0 0