1. 程式人生 > >孤荷凌寒自學python第十七天初識Python的函式

孤荷凌寒自學python第十七天初識Python的函式

孤荷凌寒自學python第十七天初識Python的函式

 

(完整學習過程螢幕記錄視訊地址在文末,手寫筆記在文末)

函式是能夠完成指定運算並返回運算結果的程式碼塊。是結構化程式設計重要的結構。

我首先發現python的函式定義非常簡潔,沒有定義的修飾詞,如多數語言中用到的函式定義的修飾詞private public 等在python中是不存在!!

一、python函式的定義格式

def 函式名([引數列表]):

       函式體

       就是函式內具體執行的程式碼塊

 

引數列表,是指函式的形式引數,簡稱為“形參”,一個函式可以沒有形參,也可以有多個形參。

多個形參之間用逗號分隔。

python的函式的形參有以下幾種可能:

第一種:必須形參

必須形參就是說,在呼叫這個函式時,必須給函式的這個形參指定一個實際的引數物件(稱之為“實參”),否則函式無法執行指定的運算。所以稱之為必須形參。

第二種:可選形參

可選形參與必須形參不同,當呼叫這個函式的時候,對於可選形參,可以給這個可選形參指定一個實際的引數物件(稱之為“實參”),也可以不指定,都不會對函式的運算有任何影響。

可選形參在定義時必須在形參名稱後加上=號,並賦予預設值。

第三種:可變形參

這是python中非常獨到的設計。這種函式的形參,在函式定義時只看到有一個形參,然而,這個形參卻可以接收任意數量的實際引數。

可變形參在函式定義時,必須在形參名之前新增一個*號。

第四種:關鍵字引數

也就是在呼叫函式時,先寫形參名(或字典KEY名——這是針對可變引數的情況)然後加上等號再寫上實際引數物件名,稱之為關鍵字引數,通過關鍵字引數給函式的形參賦值指定實參,可以保證引數傳遞的一一對應,也方便閱讀理解。

在定義函式的關鍵字引數的形參時,在形參前必須標註兩個半形*號。

且函式的關鍵字引數也是屬於可變形參的一種,特別用於接收字典類的物件實參。

 

二、函式的必須形參

先測試如下:

def func(var,var2):

    return var + var2

我定義了一個函式 ,函式名為:func

此函式有兩個形式引數:var  var2

這兩個形參都是函式 func 的 必須形參

要呼叫func函式時,必須給這兩個 必須形參 指定 對應的實際引數物件,否則,呼叫會失敗,會出現錯誤提示。

繼續測試呼叫:

def func(var,var2):

    return var + var2

intC=func() #這一次呼叫沒有給兩個 必須形參 指定實際引數物件(簡稱“實參”),會報錯

執行測試就會是下面的錯誤提示:

TypeError: func() missing 2 required positional arguments: 'var' and 'var2'

現在繼續測試給兩個 必須形參 指定實際引數物件,再測試:

def func(var,var2):

    return var + var2

intA=24567

intB=98765

intC=func(intA,intB)

print(intC)

這次測試運算結果是函式呼叫成功,列印了正確運算結果:

123332

 

三、函式的可選形參

先修改上面的測試如下:

def func(var,var2=100):

    return var + var2

上面的函式與之前的不同在於第二個形參var2被修改成了 可選形參,因為在定義此表參時,就給此形參進行了初始化預設值的賦值,即是說,在沒有給可選形參傳遞 實際引數時,就會使用預設值100作為var2的值。

繼續測試如下:

def func(var,var2=100):

    return var + var2

intA=24567

intB=98765

intC=func(intA,intB) #這一次呼叫函式 func 給可選形參 var2 指定了實際引數物件 intB

print('intC=',intC)

intD=func(intA) #這一次呼叫函式 func 沒有給可選形參 var2 指定實際引數物件。則函式 func在運算時會使用var2的預設定義值100

print('intD=',intD)

執行結果 :

intC= 123332

intD= 24667

 

在其它程式語言中,呼叫函式時,可選形參可以以,,,,的形式跳過,但python中這種寫法是不行的。

 

四、函式的可變形參

先定義一個有可變形參的測試函式:

def func(var,*var2):

return var, '的資訊有:',var2

在上面的函式中,我給函式定義了一個可變形參 var2,可變形參的特徵是,前面有一個半形*號。

可變形參可以接收多個實際引數,下面繼續測試:

def func(var,*var2):

return var, '的資訊有:',var2

strName='孤荷凌寒'

strA='男'

strB='37 years old'

strC='175cm'

strR1=func(strName,strB) #這一次呼叫函式 func 給可變形參 var2 指定了一個實際引數物件 strB

print('strR1=',strR1)

strR2=func(strName,strB,strC)  #這一次呼叫函式 func 給可變形參 var2 指定了兩個實際引數物件  strB  strC

print('strR2=',strR2)

運算結果如下:

strR1= ('孤荷凌寒', '的資訊有:', ('37 years old',))

strR2= ('孤荷凌寒', '的資訊有:', ('37 years old', '175cm'))

從運算結果中,我們可以看出,當給可變形數指定的多個 實際引數傳遞進入函式後,函式是將可變形參收到的多個實際引數作為 元組來處理的!

那麼其實呼叫函式時,給函式的可變形參 指定對應的實際引數時,可以直接傳遞一個元組物件作為可變形參的實際引數,我修改測試程式碼如下:

def func(var,*var2):

    return var, '的資訊有:',var2

strName='孤荷凌寒'

strA='男'

strB='37 years old'

strC='175cm'

tplA=(strA,strB,strC)

strR3=func(strName,*tplA) #當直接將元組物件作為函式可變形參的實際引數傳遞給函式時,元組名稱前也要加一個半形*號

print(strR3)

執行結果如下:

('孤荷凌寒', '的資訊有:', ('男', '37 years old', '175cm'))

 

五、函式的關鍵字形參

先來建構一個有關鍵字形參的函式:

def func(var,**var2):

    return var, '的資訊有:',var2

strName='孤荷凌寒'

strA='男'

strB='37 years old'

strC='175cm'

 

strR1=func(strName,strA=strA,strB=strB,strC=strC)  #這兒給關鍵字形參指定了三個key=value(字典形式)的實際引數

print('strR1=',strR1)

strR2=func(strName,sex='男',age=37,height=175) #這兒給關鍵字形參指定了三個key=value(字典形式)的實際引數

print('strR2=',strR2)

關鍵字形參是:var2 ,關鍵字形參最大的特點是,在形參名之前有兩個半形*號

執行結果如下:

strR1= ('孤荷凌寒', '的資訊有:', {'strA': '男', 'strB': '37 years old', 'strC': '175cm'})

strR2= ('孤荷凌寒', '的資訊有:', {'sex': '男', 'age': 37, 'height': 175})

從執行結果我們可以看出,當函式接收到關鍵字形參對應的實際引數後,是把接收到的多個關鍵字實際引數(是按key=value的字典樣式傳遞給函式的)當作字典來處理的。

那麼,我們也就可以直接將一個字典物件作為函式關鍵字形參的實際引數傳遞給函式:

再測試如下:

def func(var,**var2):

    return var, '的資訊有:',var2

strName='孤荷凌寒'

dicA=dict(sex='男',age=37,height=175)

strR3=func(strName,**dicA)  #這兒給關鍵字形參指定了一個字典物件dicA作為它的實際引數,注意字典物件名稱前加了兩個半形*號

print(strR3)

執行結果:

('孤荷凌寒', '的資訊有:', {'sex': '男', 'age': 37, 'height': 175})

 

 

——————————

今天整理的學習筆記完成,最後例行說明下我的自學思路:

根據過去多年我自學各種程式語言的經歷,認為只有真正體驗式,解決實際問題式的學習才會有真正的效果,即讓學習實際發生。在2004年的時候我開始在一個鄉村小學自學電腦 並學習vb6程式語言,沒有學習同伴,也沒有高師在上,甚至電腦都是孤島(鄉村那時還沒有網路),有的只是一本舊書,在痛苦的自學摸索中,我找到適應自己零基礎的學習方法:首先是每讀書的一小節就作相應的手寫筆記,第二步就是上機測試每一個筆記內容是否實現,其中會發現書中講的其實有出入或錯誤,第三步就是在上機測試之後,將筆記改為電子版,形成最終的修訂好的正確無誤的學習筆記 。

通過反覆嘗試錯誤,在那個沒有分享與交流的黑暗時期我摸黑學會了VB6,爾後接觸了其它語言,也曾聽過付費視訊課程,結果發現也許自己學歷果然太低,就算是零基礎的入門課程,其實也難以跟上進度,講師的教學多數出現對初學者的實際情況並不瞭解的情況,況且學習者的個體也存在差異呢?當然更可怕的是收費課程的價格往往是自己難以承受的。

於是我的所有程式設計學習都改為了自學,繼續自己的三步學習筆記法的學習之路。

當然自學的最大問題是會走那麼多的彎路,沒有導師直接輸入式的教學來得直接,好在網路給我們帶來無限搜尋的機會,大家在網路上的學習日誌帶給我們共享交流的機會,而QQ群等交流平臺、網路社群的成立,我們可以一起自學,互相批評交流,也可以獲得更有效,更自主的自學成果。

於是我以人生已過半的年齡,決定繼續我的程式設計自學之路,開始學習python,只希望與大家共同交流,一個人的獨行是可怕的,只有一群人的共同前進才是有希望的。

誠摯期待您的交流分享批評指點!歡迎聯絡我加入從零開始的自學聯盟。

這個時代網際網路成為了一種基礎設施的存在,於是本來在孤獨學習之路上的我們變得不再孤獨,因為網路就是一個新的客廳,我們時刻都可以進行沙龍活動。

非常樂意能與大家一起交流自己自學心得和發現,更希望大家能夠對我學習過程中的錯誤給予指點——是的,這樣我就能有許多免費的高師了——這也是分享時代,社群時代帶來的好福利,我相信大家會的,是吧!

 

根據完全共享的精神,開源互助的理念,我的個人自學錄製過程是全部按4K高清視訊錄製的,從手寫筆記到驗證手寫筆記的上機操作過程全程錄製,但因為4K高清檔案太大均超過5G以上,所以無法上傳至網路,如有需要可聯絡我QQ578652607對傳,樂意分享。上傳分享到百度網盤的只是壓縮後的720P的視訊。

 

我的學習過程錄影百度盤地址分享如下:(清晰度:1280x720)

連結:https://pan.baidu.com/s/1klavS7rpRDR1QzA3a7Vl4w  密碼:dozb

 

Bilibili:

https://www.bilibili.com/video/av35841556/

 

喜馬拉雅語音筆記:

https://www.ximalaya.com/keji/19103006/139206418