天天看點

《從問題到程式:用Python學程式設計和計算》——2.3 内置函數和數學函數包

本節書摘來自華章計算機《從問題到程式:用python學程式設計和計算》一書中的第2章,第2.3節,作者:裘宗燕 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

算術運算符提供了最基本的算術計算功能,通過寫出複雜的表達式,可以完成許多複雜的計算。另一方面,有些很常用的計算,雖然可以通過簡單計算的組合完成,但如果語言能通過某種易用的方式提供這種功能,程式設計式的人們就更友善了。

python語言裡提供友善使用的複雜功能的概念稱為函數,這個概念與數學裡的函數概念有相似之處。每個函數有一個名字,可以在表達式(或後面的其他結構)裡使用。python語言提供了一組函數(稱為内置函數或标準函數),可以在程式裡直接用。python還通過标準庫的程式包提供了許多有用的函數。

本節首先簡單介紹函數的概念和使用方法,介紹幾個與數值計算有關的内置函數,而後介紹python标準庫的浮點數數學函數包,其中定義了一組常用數學函數,包括三角函數、對數函數、雙曲函數等。

2.3.1 函數及其使用

在python語言裡,函數是一種可以通過調用而被執行的對象。一個函數有一個名字,在寫出的函數名之後寫一對圓括号,括号中寫幾個表達式,就構成了一個函數調用表達式,簡稱函數調用。前面出現過的例如type(1.4)、int(2.3 12)、complex ( 2.3, 3.5) 都是函數調用表達式,其中的type、int、complex在這裡作為函數名,寫在圓括号裡的表達式稱為函數的實際參數,簡稱實參,多個實參之間用逗号分隔。為了更清晰地顯示函數調用中不同的實參,人們一般在逗号之後加一個空格。

type(1.4)表示要求解釋器執行以type為名字的函數,把表達式1.4的值送給它。該函數将完成一些計算,最後傳回一個結果。在前面示例中,我們已經看到解釋器輸出了反映type計算結果的資訊。調用int将傳回一個整數對象,調用complex将傳回一個複數對象。在下面讨論中,通常把“以type為名字的函數”直接說成“函數type”,把“調用以type為名字的函數”說成“調用函數type”或者“調用type”。

函數調用是一種基本表達式,求值這種表達式就是要求執行相應函數,以函數執行的結果對象作為表達式的值,這樣得到的值稱為函數的傳回值。

上面提到的幾個函數都是python語言内部定義的,預設地可以直接使用,是以它們都是内置函數。下面将看到,程式裡還可以使用python标準庫程式包裡定義的函數。2.9節将簡單介紹如何自己定義有用的函數,後面有更多讨論。

2.3.2 處理數值的内置函數

python語言提供了一組内置函數,它們的完整介紹參看附錄b。現在介紹其中幾個與數值計算有關的函數,可以用在表達式裡描述數的計算。

函數abs的實參可以是值為整數、浮點數或複數的表達式,傳回實參的絕對值:

複數的絕對值就是它的模,也就是複平面上這個複數表示的向量的長度。注意,如果實參是整數,abs就傳回整型結果,對于浮點數或複數,它傳回浮點型結果。

内置函數max和min分别求出其實參中的最大值和最小值。這兩個函數的特殊之處在于它們可以有任意多個實參(至少兩個)。例如:

實參可以是任意複雜的表達式,隻要求它們的值可以互相比較。如果隻給min或max一個實參,解釋器就會報錯,說明所給實參不符合函數的要求。

round是另一個有用的函數,它求出浮點數的滿足要求的近似值。這個函數有兩種用法:round(number) 給出由浮點數number舍入得到的整數;另一種調用形式增加第二個指定舍入精度的整數參數,說明小數點後面保留的位數。例如:

最後一個是pow,調用pow(a, b)相當于ab。但pow還能以pow(a, b, c)的形式調用,相當于要求計算ab % c,但其算法更高效(注意,ab可能得到很大的值,而ab % c的值不會超過c,pow利用這一事實簡化計算)。參與計算的整數很大時,這種調用形式就很有價值。在許多密碼計算中需要這種函數。

2.3.3 數學函數包

數值計算中經常需要使用各種常用數學函數,日常使用的科學電腦都有這方面的功能鍵,程式設計語言自然也應該提供相應功能。因為常用數學函數很多,另一方面,許多程式并不需要用數學函數,是以python沒把常用數學函數包括在内置函數中,而是通過标準庫裡的一個程式包提供這些功能。

導入程式包

下載下傳安裝後的python系統已經安裝了标準庫,其中包含一批程式包,提供了許多程式設計中經常需要的重要功能,數學函數包隻是其中一個。每個程式包有一個名字,例如數學函數包的名字是math。如果想用數學函數包(或其他程式包),就必須首先将其導入。導入語句是我們接觸的第一個非表達式的python指令,這種指令稱為語句。

導入語句有幾種使用形式,後面有更詳細的介紹,這裡介紹兩種常用形式。第一種形式要求把程式包裡的全部功能導入,使這些功能都直接可用。例如,math包裡定義了各種三角函數、指數和對數函數等,求弧度的正弦值和餘弦值的函數名字分别為sin和cos。下面程式片段中導入math包并使用了它們:

上面第一行是在未導入math包的情況下調用sin函數,這時系統報錯說“sin沒有定義”。下一條是導入math包的指令,這個指令要求把math包的全部功能導入,使之在随後的計算中可用。最後兩個表達式裡使用了導入的函數sin和cos。

現在說明import語句的兩種描述形式及其意義,以導入數學函數包為例,需要導入其他包時隻需要在相應位置正确寫出包的名字:

1)from math import *:要求導入數學包math裡定義的所有功能,使它們都能在目前的環境中直接使用。

2)from math import sin, cos:選擇性地導入數學包math裡定義的函數sin和cos。采用這種描述形式,可以根據需要導入一個或多個函數,多個函數的名字之間用逗号分隔。在一個程式包裡可能定義了很多東西,而實際程式中往往隻需要用其中定義的幾項功能。在很多情況下,選擇性導入更可取。

math包

math包裡定義了一批數學函數,包括:

1)指數和對數函數,如exp(n) 計算自然常數e的n次幂,log(x) 計算x的自然對數值。還可以用log函數可選的第二個參數指定對數的底,例如log(3.0, 2) 計算3.0的以2為底的對數值,log(11.3, 10) 計算實數11.3的以10為底的對數值。還有sqrt(x) 計算x的平方根。

2)三角函數和反三角函數,如上面用過的sin和cos,還有正切函數tan、反正弦函數asin、反餘弦函數acos等。

3)雙曲函數和反雙曲函數,如sinh和cosh等。

4)其他有用函數,如從角度值計算出弧度值的radians,從弧度值算出角度值的degrees等。數學包裡還定義了表示圓周率和自然對數的底的數學常數pi和e,導入後可以作為運算對象,直接用在表達式中。

更多函數、各函數的功能和使用時的寫法等,在附錄c有些介紹。

有了這些數學函數和常數,我們已經能很友善地實作科學電腦可以完成的所有計算了。例如,計算直徑為12.4的圓球的體積:

計算兩個相鄰邊長度分别為11和17厘米,夾角34°的三角形的面積:

函數radians求出的值是浮點數,在表達式sin(radians(34))裡用作sin的參數。由于函數調用也是表達式,自然可以作為另一個函數的參數。

python還為複數提供了另一個數學包cmath,其中的函數與math類似,但處理的對象是複數。下面表達式驗證了數學裡最奇妙的一個公式:

這裡做的也是近似計算,結果很接近0。