5 函數· Python 資料科學入門 - Yao-Jen Kuo

文章推薦指數: 80 %
投票人數:10人

其實我們已經開始使用函數了,例如我們請Python 回傳資料類型的 type() 或者產生 ... import math # 要使用圓周率pi 得引入套件math def circle_area(r): '輸入半徑 ... Python資料科學入門 0關於本書 1開發環境 Python基礎 2基本資料類型 3資料容器 4迴圈與流程控制 5函數 6模組與套件 7類別 附錄1:建立Linux虛擬機 附錄2:日期與時間 PoweredbyGitBook 5函數 5函數 其實我們已經開始使用函數了,例如我們請Python回傳資料類型的type()或者產生數列list的range()都是函數。

函數的使用方法是在小括號中放輸入(input),然後呼叫函數得到輸出(output)。

5.1查詢函數的用法 如果我們不知道某個函數的用法,可以使用help()查詢,了解一個函數的輸入與它可以設定的參,例如查詢range()函數就知道可以指定產出數列的起始值(start預設為0)、終止值(stop)與公差(step預設為1): help(range) 5.2自訂函數 Python自訂函數的架構: deffunction_name(輸入,參數1,參數2,...): ''' Docstrings ''' #主要的程式 return結果 首先給函數取個名字(function_name),接著在小括號中放進輸入(inputs)與參數(parameters),然後附上一段說明(Docstrings),在縮排內撰寫我們主要的程式,最後把輸出結果放在return後面。

5.2.1函數說明文件Docstrings 養成在自訂函數中加入Docstrings說明的好習慣,這有助於分享我們的自訂函數給其他人使用。

Docstrings可以區分為單行與多行,單行的Docstrings用一個單引號(')包起來: deffunction_name(輸入,參數1,參數2,...): '單行的Docstrings' #主要的程式 return結果 多行的Docstrings用三個單引號(''')包起來: deffunction_name(輸入,參數1,參數2,...): ''' 多行的Docstrings 更多的說明內容 ''' #主要的程式 return結果 我們撰寫的Docstrings會在使用help()查詢函數用法的時候出現,例如我們的第一個自訂函數,它的作用是將輸入的數字平方之後回傳,我們就叫它my_squared()函數。

defmy_squared(x): '將輸入的數字平方之後回傳' returnx**2 help(my_squared)#查詢my_squared()函數 5.2.2計算圓面積的函數 熟能生巧,我們來練習自訂一個輸入半徑長度可以計算出圓面積的函數叫做circle_area()! importmath#要使用圓周率pi得引入套件math defcircle_area(r): '輸入半徑長度可以計算出圓面積' returnmath.pi*r**2 printcircle_area(3) 5.2.3計算圓周長的函數 我們接著來練習自訂一個輸入半徑長度可以計算出圓周長的函數叫做circle_circum()! importmath#要使用圓周率pi得引入套件math defcircle_circum(r): '輸入半徑長度可以計算出圓周長' return2*math.pi*r printcircle_circum(3) 5.2.4加入參數 我們把前面兩個自訂函數的功能整合起來到一個函數裡面,這個時候我們會正式納入參數(parameters)的觀念到這個自訂函數中,使用一個布林參數is_area來讓使用者在呼叫函數時決定要計算圓面積或者圓周長。

importmath#要使用圓周率pi得引入套件math defcircle_calculator(r,is_area=True): ''' 輸入半徑長度可以計算出圓面積與圓周長 利用參數is_area決定要回傳圓面積或圓周長 預設回傳圓面積 ''' ifis_area==True: returnmath.pi*r**2 else: return2*math.pi*r printcircle_calculator(3) printcircle_calculator(3,is_area=False) 這裡我們設計is_area參數是有一個預設值True,假如自訂函數時沒有指定is_area參數的預設值並且呼叫函數時也沒有指定,就會出現錯誤訊息: importmath#要使用圓周率pi得引入套件math defcircle_calculator(r,is_area):#沒有指定預設值 ''' 輸入半徑長度可以計算出圓面積與圓周長 利用參數is_area決定要回傳圓面積或圓周長 預設回傳圓面積 ''' ifis_area==True: returnmath.pi*r**2 else: return2*math.pi*r printcircle_calculator(3)#沒有指定is_area參數的值 5.2.5有多個輸出的函數 我們再修正一下circle_calculator()這個自訂函數,讓它可以輸入半徑就一併輸出圓面積與圓周長。

這時我們只要在return敘述後面將兩個輸出用逗號,隔開就會儲存在一個tuple中回傳。

importmath#要使用圓周率pi得引入套件math defcircle_calculator(r): ''' 輸入半徑長度可以計算出圓面積與圓周長 將圓面積與圓周長一起回傳 ''' area=math.pi*r**2 circum=2*math.pi*r returnarea,circum printcircle_calculator(3) 5.3更多自訂函數 5.3.1自訂my_len()函數 我們希望my_len()函數可以計算輸入list中有幾個元素。

defmy_len(x): '計算輸入list中有幾個元素' cnt=0 foriinx: cnt+=1 returncnt num_list=range(1,11) my_len(num_list)#計算num_list中有幾個數字 5.3.2自訂my_sum()函數 我們希望my_sum()函數可以計算輸入list中的數字加總。

defmy_sum(x): '計算輸入list中的數字加總' summation=0 foriinx: summation+=i returnsummation num_list=range(1,11) my_sum(num_list)#計算num_list中數字的加總 5.3.3自訂my_mean()函數 我們希望my_mean()函數可以計算輸入list中的數字平均數,平均數是數字的加總除以個數,這個函數恰好綜合了前面兩個例子。

defmy_mean(x): '計算輸入list中的數字平均數' cnt=0 summation=0.0 foriinx: cnt+=1 summation+=i return(summation/cnt) num_list=range(1,11) my_mean(num_list)#計算num_list中數字的平均數 5.4變數範圍(VariableScope) 在自訂函數時必須意識到變數範圍這個議題,程式中的變數開始被我們區分為區域變數(localvariables)與全域變數(globalvariables),在函數內我們能夠使用兩種類型的變數,但是在函數外,僅能使用全域變數。

用講的很抽象,我們還是動手定義自訂函數來釐清這個概念,用第一個自訂函數my_squared()來演釋: defmy_squared(x): ans=x**2#ans是一個區域變數 returnans printans#在函數外沒有ans 假如我們將ans在函數外也進行指派: ans=0#ans是一個全域變數 defmy_squared(x): ans=x**2#ans是一個區域變數 returnans printmy_squared(3)#區域變數ans的值是9 printans#全域變數ans的值是0 5.5匿名函數(lambda函數) 除了正常的函數自訂結構,我們也可以使用一個稱作lambda函數的寫法,這樣的寫法不需要return敘述,我們來試著將my_squared()函數改寫成lambda函數: my_squared=lambdax:x**2 printmy_squared(3) lambda函數常與map()、filter()或reduce()一起使用,像是利用filter()搭配lambda函數將1到10的偶數挑出來: my_list=range(1,11) printfilter(lambdax:x%2==0,my_list) 或者是利用map()搭配lambda函數將1到10的每一個數字都平方: my_list=range(1,11) printmap(lambdax:x**2,my_list) 或者是利用reduce()搭配lambda函數將1到10的每一個數字加總: my_list=range(1,11) printreduce(lambdax,y:x+y,my_list) 5.6巢狀函數 我們可以在函數裡面嵌入函數,舉例來說,我們可以將前面用來計算平均數的函數my_mean()包含兩個函數,一個是計算總和的函數my_sum(),一個是計算個數的函數my_len()。

defmy_mean(x): '計算平均數' defmy_sum(x): '計算輸入list中的數字加總' summation=0.0 foriinx: summation+=i returnsummation defmy_len(x): '計算輸入list中有幾個元素' cnt=0 foriinx: cnt+=1 returncnt returnmy_sum(x)/my_len(x) #呼叫自訂函數 my_list=range(1,11) printmy_mean(my_list) 5.7錯誤處理 我們在使用內建函數時候常有各種原因會導致錯誤或者警示,這時收到的回傳訊息可以幫助我們修改程式,假如我們執行printint("True")會得到ValueError:invalidliteralforint()withbase10:'True'的回傳訊息。

自訂函數時如果能夠掌握某些特定錯誤,撰寫客製的錯誤訊息,可以讓使用自訂函數的使用者更快完成偵錯,我們可以使用try-except的語法結構進行錯誤處理。

我們修改原本計算平方數的my_squared()當使用者輸入文字時會回傳客製錯誤訊息:「請輸入數值。

」 defmy_squared(x): '計算平方數且具有錯誤處理的函數' try: returnx**2 except: print("請輸入數值。

") my_squared("3") 除了我們在這個例子中遭遇的TypeError以外,也可以針對不同的錯誤類型設計客製錯誤訊息,接著我們再寫一個除法的函數divide()來示範,如果使用者輸入的資料類型錯誤(TypeError)就回傳「請輸入數值。

」假如使用者在除數指定了0(ZeroDivisionError)就回傳「除數不可以為零。

」 defdivide(x,y): try: returnx/y exceptTypeError: print("請輸入數值。

") exceptZeroDivisionError: print("除數不可以為零。

") except: print("其他的錯誤") printdivide("9",3) printdivide(9,0) 5.8彈性參數 Python可以使用*args或**kwargs(Keywordarguments)來分別處理不帶鍵值與帶有鍵值的彈性參數,利用這個特性,我們不一定要將輸入用容器把變數包裝起來。

5.8.1使用*args 我們可以將美國影集六人行(Friends)的六個主要演員直接當作參數輸入函數,略過存放在list的步驟: defoutput_stars(*args): '將輸入的演員一一輸出' forstarinargs: printstar output_stars("JenniferAniston","CourteneyCox","LisaKudrow","MattLeBlanc","MatthewPerry","DavidSchwimmer") 5.8.2使用**kwargs 我們可以將美國影集六人行(Friends)的影集資訊直接當作參數輸入函數,略過存放在dict的步驟: defoutput_info(**kwargs): '將影集資訊一一輸出' forinfoinkwargs: printinfo+":"+str(kwargs[info]) output_info(genre='Sitcom',seasons=10,episodes=236) resultsmatching"" Noresultsmatching""



請為這篇文章評分?