【Python基礎教學】資料型態函數及方法(上)【part-8】
【Python基礎教學】資料型態函數及方法(上)【part-8】
哈囉大家好,很感謝你點進本文章,我是一名高中生,是電腦社社團的社長,由於我並不是 Python 這方面非常精通的專家,所以若文章有些錯誤請見諒,也可向我指正錯誤。另外本文章的用意是作為電腦社社團的教材使用而編寫的。
接下來,讓我們進入正題。
當我們在 part 7 談完迴圈以後,其實大部分的簡易實作題型都能勉強應付了,不過我們現在所缺少的是「演算法」、「Python 內建函數及方法」的認知學習及實際應用,接下來會慢慢教給各位上述所言,首先,讓我們先從資料型態的函數及方法開始。
數字(Number)
Number 的資料型態被定義為不可變物件,這意味著如果改變 Number 的數值的話,Python 將會自動分配記憶體空間給新的數值。
Python 支援以下三種不同的數值型態:
整數(integer-簡寫為 int):通常被稱為是整數,可以是正或負整數,「不含小數點」。 Python3 整數是沒有限制大小的,可以當作 Long 型態使用,所以 Python3 沒有 Python2 的 Long 型態。布林 (bool) 是整數型態的子型態(所以 bool 也是整數)。
浮點數(float):浮點數由「整數部分」與「小數部分」組成,浮點數也可以使用科學計數法表示(2.5e2 = 2.5 x 102 = 250 -> 這是電腦中使用科學記號的方式)。
複數(complex):複數由「實數部分」和「虛數部分」構成,可以用 a + bj,或者是complex(a,b) 表示,複數的實部 a 和虛部 b 都是浮點數。
我們可以使用電腦中常用的二進位(binary)、八進位(octal)、十六進位(hexadecimal -> 簡稱:hex)來表示整數:
1 | number = 0xA0F # 十六進位 |
二進位以「0b」作為開頭,後面輸入二進位數字;八進位以「0o(小寫O)」作為開頭,後面輸入八進位數字;十六進位以「0x」開頭,後面輸入十六進位數字。
:::success
這樣整理就懂!
二進位 -> 0b + 二進位數字(0、1),0b 把它想成二進位的英文為 binary,0 是觸發二進位數字的關鍵字。
八進位 -> 0o + 八進位數字(1、2、3、4、5、6、7),0o 八進位的英文是 octal。
十六進位 -> 0x + 十六進位數字(1、2、3、4、5、6、7、8、9、A、B、C、D、E、F),0x 十六進位的英文是 hexadecimal。
:::
如何導入模組?
很簡單,我們可以使用 import <函式庫> 指令來引入模組,如下所示:
import math
這樣便能引入數學相關的模組,就可以使用相關的函數了。
覺得名稱太長?用以下方式可以簡短:
import math as m
又或者是你只想要引入幾個方法或函數就好,可這樣做:
1 | from math import ceil |
:::danger
必須注意:這樣子引入模組只有引入 ceil() 而已,並沒有引入整個 math 函式庫,所以要呼叫 math.ceil() 不須加上 math.,打上 ceil() 就好。
:::
可以引入多個:
1 | from math import ceil, floor |
接下來將列出以下幾個較為常用的數學函數:
| Number | 函數 | 描述 |
|---|---|---|
| 1 | abs(x) | 回傳數字的絕對值,如 abs(-1) 回傳 1。 |
| 2 | math.ceil(x) | 回傳無條件進位後的數字,如 math.ceil(4.1) 回傳 5。 |
| 3 | math.floor(x) | 回傳無條件捨取後的數字,如 math.floor(4.9) 回傳 4。 |
| 4 | math.fabs(x) | 回傳數字的絕對值(以浮點數方式回傳),如 math.fabs(-1) 回傳 1.0。 |
| 5 | max(x1, x2, x3, …) | 回傳所有引數中的最大值,引數可為序列(如列表、元組)。 |
| 6 | min(x1, x2, x3, …) | 回傳所有引數中的最小值,引數可為序列(如列表、元組)。 |
| 7 | pow(x, y) | x**y 運算後的值。 |
| 8 | sqrt(x) | 回傳數字的平方根(二次方根)。 |
以下是一個範例:
1 | import math |
註:f”math.ceil({num1})” 表示字串格式化,想了解請至下文。
輸出:
1 | abs(-4.7) = 4.7 |
隨機數函數(Random Functions)
隨機數函數模組的引入:
import random
以下是幾個我們在 Python 中較為常用的隨機數函數:
| Number | 函數 | 描述 |
|---|---|---|
| 1 | random.choice(seq) | 從序列的元素中隨機挑選一個元素,例如random.choice(range(10)),從 0 到 9 中隨機挑選一個整數。 |
| 2 | random.randrange ([start,] stop [,step]) | 從指定範圍內,以指定基數遞增的集合中取得一個隨機數,基數預設值為 1 |
| 3 | random.random() | 隨機產生下一個實數,它在 [0,1] 範圍內。注意:產生的內容包含小數。 |
| 4 | random.shuffle(lst) | 將列表的所有元素隨機排序。 |
| 5 | random.randint(start, stop) | 隨機產生整數。 |
以下是一個範例:
1 | import random |
輸出(由於隨機性,所以生成的答案不同):
1 | 隨機挑選的顏色: blue |
三角函數(Trigonometric Functions)
注意:三角函數需要引入 math 模組。
在高中階段我們只會學到 sin、cos、tan,以及弧度、角度的轉換,所以我們只列出以下幾種:
| Number | 函數 | 描述 |
|---|---|---|
| 1 | math.sin(x) | 回傳 x 的正弦值。 |
| 2 | math.cos(x) | 回傳 x 的餘弦值。 |
| 3 | math.tan(x) | 回傳 x 的正切值。 |
| 4 | math.degrees(x) | 將弧度轉換成角度,如 degrees(math.pi/2),回傳 90.0。 |
| 5 | math.radians(x) | 將角度轉換成弧度。 |
註:math.pi 為圓周率。
1 | import math |
輸出:
1 | sin30: 0.49999999999999994 |
字串(String)
由於字串在前面章節已經有大致上說明及講解,所以於本章節會簡單帶過。
字串是由兩個雙引號或兩個單引號所組成,引號裡面可存放字元,如下所示:
1 | "雙引號是字串" |
:::danger
不過要注意的是,單雙引號必須成對,不能寫單引號加雙引號,否則程式會出錯。
:::
我們可以透過以下方式擷取字串值:
1 | a = "Hello" |
跳脫字元(Escape Character)
跳脫字元又可稱為逸出字元、轉義字元(大陸說法),而在 Python 中,若要使用跳脫字元,我們會在前面加上一個反斜線「\」。
接下來我們將來認識幾個較為常用的跳脫字元:
「\」,作用是顯示出「\」,程式碼範例如下所示:
1 | print("\\") |
「\’」,作用是顯示出一個單引號「’」,程式碼範例如下所示:
1 | print('\'') |
若要顯示出雙引號,就如單引號的範例一樣,各位可以自己試試看。
「\n」,作用為換行,程式碼範例如下所示:
1 | print("1\n") |
可以看到當 1 顯示出來後,便又跳了一行。
補充:這個東西我們在前面講基本資料型態時講過,在字串前面加上一個 r(無論大小寫),都能夠使跳脫字元無效化,就是讓他現出原形,如下所示:
1 | print(r"\n") |
字串格式化-舊版(String-formating)
在 Python 中,字串格式化就如同我們在 C 語言中使用 printf() 一樣的語法,我們可以先看到下面的範例,以下是在 Python 中使用字串格式化的範例:
1 | print ("我叫 %s 今年 %d 歲!" % ('阿堯', 17)) |
輸出結果:
1 | 我叫 阿堯 今年 17 歲! |
在 Python 中,我們會使用「%」這個符號來格式化字串,比如說 %s 就是格式化成字串,s 就是 string 的意思。
好,到底什麼是格式化呢?簡單來說就是當我們使用 %s 這個符號時,後面對應的資料(因為 %s 是各式化成「字串」)就會跟 %s 做替換,這個概念有點像是變數的賦值,也就是說 %s = “阿堯”,然後印出的結果就會是 “阿堯” 囉。
那麼接下來以下是字串格式化符號的統整表格:
| 符號 | 敘述 |
|---|---|
| %c | 格式化成「字元」及「ASCII碼」 |
| %s | 格式化成「字串」 |
| %d | 格式化成「整數」 |
| %u | 格式化成「無號整數」 |
| %o | 格式化成「無號八進位數」 |
| %x | 格式化成「無號十六進位數」 |
| %X | 格式化成「無號十六進位數(大寫)」 |
| %f | 格式化成「浮點數,且可指定小數點位數」 |
| %e | 用科學記號格式化浮點數 |
| %E | 同上 |
以下是一個範例:
1 | char = 'A' |
輸出:
1 | 字元及ASCII碼: A |
上述需要使用「%」來進行格式化的方式,都屬於舊版使用,不過無礙,因為這種格式化方式通用於 Python 2、3。
字串格式化-新版(f-string)
f-string 是 Python 3.6 之後版本新增的,稱之為字面量格式化字串,是較新的格式化字串之語法。
實字(或稱字面量:literal)用來表達原始碼中一個固定值的表示法(notation),整數、浮點數以及字串等等都是實字。
範例如下圖所示:
a = 1
a 是變數,1 是實字。
回到 f-string,f-string 是一種比使用 % 符號還要簡單方便的字串格式化用法,那麼到現在我相信各位一定很疑惑到底為什麼需要格式化字串呢?
其實很簡單,若我們想要在字串裡面加入變數,像是這樣:「Your number is : 0」,然後寫個迴圈程式讓他從 0 慢慢疊加到 100,有點像是進度條的概念。若我們沒有格式化這種東西,那麼就很難去實現這個動作了,或者是說幾乎不可能。也因為有格式化的關係,所以讓字串變得更加靈活。
好,話題回來,以下是 f-string 的用法,在字串前面加上一個 f,在用一個大括號 {} 括起來:
1 | name = 'Handsome Boy' |
這種方法其實就不用特別去判斷是 %s 還是 %d,就會自動轉換資料型態了,是不是非常的方便好用呢?
在 Python 3.8 的版本中可以使用 = 符號來拼接運算表達式與結果:
1 | x = 1 |
:::success
快速整理!
f-string 是 Python 3.6 之後的版本才有,使用方法:在字串前面加上小寫f,字串內部增加大括號 {},裡面可以放運算式及變數。
:::
.format()
「{}」和「format()」是 Python 3 所使用的「新式」格式化,操作方式為「格式化字串.format(資料)」,輸出結果會將資料插入格式化字串的位置,下面的例子,會將 world 和 oxxo 兩個字串,分別插入字串中的兩個 {}。
引用至:文字與字串 ( 格式化 ) - Python 教學 | STEAM 教育學習網
不過作者本人經過相關的查詢後,發現 .format() 其實早在 python 2.6 就已經有了,所以並不是 Python 3。
1 | a = 'hello {}, I am {}' |
範例出處:文字與字串 ( 格式化 ) - Python 教學 | STEAM 教育學習網
使用 .format 的方式其實就有點像是填空格的感覺,不過 .format() 框框裡面的東西並不一定只要填入字串這個資料型態,例如填入 Number、list、tuple 等也是可以的,印出來的結果也如我們預期。
另外在 a 變數這邊,裡面的字串值中的 {} 裡面可以填入數字,用來代表填入資料的「順序」,跟序列(列表、元組那些)一樣,索引(index)預設從 0 開始。
以下是一個範例:
1 | a = 'hello {1}, I am {0}' |
{} 裡可以填入具名引數(Named Arguments),如果將上面程式裡的 {} 加入名稱,就會放入指定名稱的內容。
1 | a = 'hello {m}, I am {n}' |
可以從上述程式碼中看到:在變數 a 裡面字串中的 {} 裡面分別填入 m、n,之後在第二行的 b 變數之字串裡面輸入 m、n 對應的內容。這個概念其實就跟我們之前學的函數中,關鍵字參數是非常類似的,只不過這種用法被移到 .format 的用法上而已。
忘記什麼是關鍵字參數的同學,傳送門點我。
:::success
快速整理!
.format() 可想像成是新式 f-string 的變化版,以下表格整理相異處。
| 屬性 | f-string | .format() |
|---|---|---|
| Python 版本 | Python 3.6 及以上 | Python 2.7 及以上 |
| 語法 | f"Hello, {name}!" | "Hello, {}!".format(name) |
| 可讀性 | 直觀、可讀性較佳 | 可讀性較差,尤其是有多個變數時 |
| 效能 | 通常較 .format() 快 | 相對較慢 |
| 巢狀結構 | 不支援 | 支援(巢狀:"Hello, {}!".format("{}".format(name.upper()))) |
| 擴充性 | 不能處理較複雜的字串 | 比起 f-string 可處理比較多事情 |
| 便利性 | 較方便 | 較為複雜,適合使用在複雜的字串處理 |
| 難易度 | 易上手 | 較難,但是可以控制較多字串處理 |
:::
進階 .format()
{} 裡可以填入字典的引數,如果將上面程式裡的 {} 加入對應的引數,就會放入指定的字典內容。
1 | a = 'hello {0[x][m]}, I am {0[y][m]}' |
看完以上範例的代碼後,不要慌張,接下來讓我替你解釋一下:
首先第一行,依舊是 .format 的那個標準格式,只是各位比較不清楚的是,為什麼要在 [x][m] 前面放一個 0 呢?而這個 0 其實是 .format 方法中引數列表的索引,簡單來說他所指的就是第一個引數,也就是 b。
所以 {0[x][m]} 的意思是:
- 從 .format() 方法中的第一個引數 b 開始。
- 在 b 引數中找到鍵 x 對應的字典。
- 從字典中找到鍵 m 相對應的值,也就是 ‘world’。
接下來的 {0[y][m]} 依此類推,步驟都是一樣的。
新式的格式化字串和 % 定義略有不同,可以加入其他數值,來指定最小寬度、最大字元、對齊與精確度:
| 格式化數值 | 說明 |
|---|---|
| : | 開始需要加上冒號 |
| 不加東西、> | 靠右對齊 |
| < | 靠左對齊 |
| ^ | 置中對齊 |
| 填補字元 | 將不足最小寬度的空白,填滿指定字元 |
| 數字.數字 | 最小寬度.最大字元數,如果後方是 f (%f),第二個數字表示小數點位數 |
資料的型態也由 % 改為「:」表示。
| 格式化字串 | 轉換型態 |
|---|---|
| :s | 字串 |
| :d | 十進制整數 |
| :x | 十六進制整數 |
| :o | 八進制整數 |
| :b | 二進制整數 |
| :f | 十進制浮點數 |
| :e | 指數浮點數 |
| :g | 十進制或指數浮點數 |
1 | a = 'hello {}, I am {}'.format('world','oxxo') |
以上圖表範例來自:文字與字串 ( 格式化 ) - Python 教學 | STEAM 教育學習網
.format() 範例解析
a 變數的部分我們就不再贅述了,相信各位比較有問題的地方應該是 b 變數的地方:
裡面為什麼要放一個 10 呢?這個 10 又代表著什麼意思?
10 其實是代表字串的字元寬度,在當我們使用 .format() 時,可以在格式化字串中指定字元寬度,而{:10s} 中,表示將字串的寬度設為 10 ,如果字串不足 10 個字元,則會用空格填補。
我們可以從輸出結果中看到:”world , I am oxxo” 在 world 的部分,已經占掉了 5 個字元,而剩下的五個字元就再加上五個空格,等同於我們按五次空白鍵,去補充那剩下的 5 個字元。
接下來讓我們看 c 變數,使用了 > 符號,並且放在 10 前面,這代表說讓字串向右靠齊。可以從輸出結果中看到,world 的起始位置並不是在 hello + 空格開始,而是在最右邊、我們將字元寬度填滿的位置。
看到 d 變數,多了一個 ^ 符號,表示讓字串置中對齊,另外 ^ 符號的左邊還多加了 - 符號,代表除了字串 world 填滿的字元寬度之位置以外的空格,用 - 符號來代替。
簡單來說,多了一個 - 符號就是讓空格代替成 - 符號而已。
而變數 e 的部分,則是變動了 {:10.3} ,多了 0.3 出來,這代表只取引數中的字串 「3」 個字元,所以可以看到下面輸出結果只顯示 wor,便結束了。
變數 f 的後面,我們可以發現範例中將 s 換成 f,表示格式化成浮點數,同樣地,多了 0.3 表示只顯示小數點後三位,並且四捨五入。
那這個範例差不多就是這樣,至於大家想用什麼格式化的方式,取決於各位,我個人偏好使用 f-string,因為整體上看來還是這個方法較為便利,且不用特別去注意 %s、%f 什麼的。
字串常用方法(Methods)
| Number | 方法及描述 |
|---|---|
| 1 | capitalize():將字串的第一個字元轉換為大寫 |
| 2 | islower():如果字串中所有字元都是小寫,則回傳 True,否則回傳 False |
| 3 | isupper():如果字串中所有字元都是大寫,則回傳 True,否則回傳 False |
| 4 | isnumeric():如果字串中只包含數字字元,則回傳 True,否則回傳 False |
| 5 | isspace():如果字串中只包含空白,則回傳 True,否則回傳 False |
| 6 | join(seq):以指定字串作為分隔符,將 seq 中所有的元素(元素要是字串)合併為一個新的字串 |
| 7 | len(str):回傳字串長度 |
| 8 | lower():轉換字串中所有大寫字元為小寫 |
| 9 | max(str):回傳字串 str 中最大的字母(ASCII碼) |
| 10 | min(str):回傳字串 str 中最小的字母(ASCII碼) |
| 11 | upper():轉換字串中所有小寫字元為大寫 |
總結
模組(Module)
兩種引入模組的方式:
import <函式庫 or 模組名稱>
or
from <函式庫 or 模組名稱> import <物件>
嫌模組名稱太長,可用 as 將模組名稱改名:
import math as m
以下是今日所學的相關模組:import math、import random
字串格式化(string-formating)
在 python 中共有三種字串格式化的方式:
- 百分比符號
% - .format()
- f-string
用 % 是最原始的格式化方式,各方面的功能較其他兩種差。
f-string 為最新的格式化方式,主打快速方便使用的格式化方法。
.format() 介於 % 與 f-string 之間,最大特點是相容性極好,可同時有 % 跟 f-string 的性質,運算及操作起來會較為複雜一些,但優點是功能極多,適合用於處理複雜的字串。
好那本篇教學就到此為止~感謝您的觀看,以下是一些參考資料:




