5 函數· Python 資料科學入門 - Yao-Jen Kuo
文章推薦指數: 80 %
其實我們已經開始使用函數了,例如我們請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""
延伸文章資訊
- 1Python 数学模块(Math) - 菜鸟教程
了解Python中可用的所有数学函数以及如何在程序中使用它们。Python中的数学模块是什么?math 模块是Python中的标准模块,并且始终可用。要在此模块下使用数学函数, ...
- 2Python常用的數學函數-软件开发平台及语言笔记大全(超详细)
在交互模式下輸入上面的指令,然後回車,看到下面的信息:. Help on built-in function pow in module math: pow(...) pow ...
- 3Python math 模块 - 菜鸟教程
Python math 模块Python math 模块提供了许多对浮点数的数学运算函数。 math 模块下的函数,返回值均为浮点数,除非另有明确说明。 如果你需要计算复数,请使用cmath ...
- 4數學math - Python 教學 - STEAM 教育學習網
Python 的標準函式「math」提供了許多常用的數學函式,例如三角函數、四捨五入、指數、對數、平方根、總和...等,都能夠透過math 標準函式來進行運算。
- 5Python/基礎數學- 維基教科書,自由的教學讀本 - Wikibooks
< Python. Python使用與C、Java類似的運算符,支持整數與浮點數的數學運算。 ... 除了求絕對值函數 abs() 外,大多數數學函數處於 math 和 cmath 模塊內。