【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
2
3
4
5
6
7
8
9
10
11
>>> number = 0xA0F # 十六進位
>>> number
2575

>>> number=0o37 # 八進位
>>> number
31

>>> number = 0b1011 # 二進位
>>> number
11

二進位以「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
2
from math import ceil
print(ceil(1.2)) # 2

:::danger
必須注意:這樣子引入模組只有引入 ceil() 而已,並沒有引入整個 math 函式庫,所以要呼叫 math.ceil() 不須加上 math.,打上 ceil() 就好。
:::

可以引入多個:

1
2
from math import ceil, floor
print(floor(1.2)) # 1

接下來將列出以下幾個較為常用的數學函數:

Number函數描述
1abs(x)回傳數字的絕對值,如 abs(-1) 回傳 1。
2math.ceil(x)回傳無條件進位後的數字,如 math.ceil(4.1) 回傳 5。
3math.floor(x)回傳無條件捨取後的數字,如 math.floor(4.9) 回傳 4。
4math.fabs(x)回傳數字的絕對值(以浮點數方式回傳),如 math.fabs(-1) 回傳 1.0。
5max(x1, x2, x3, …)回傳所有引數中的最大值,引數可為序列(如列表、元組)。
6min(x1, x2, x3, …)回傳所有引數中的最小值,引數可為序列(如列表、元組)。
7pow(x, y)x**y 運算後的值。
8sqrt(x)回傳數字的平方根(二次方根)。

以下是一個範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import math

# 範例數字
num1 = -4.7
num2 = 16
num3 = 5

# 1. abs(x)
absolute_value = abs(num1)
print(f"abs({num1}) = {absolute_value}")

# 2. math.ceil(x)
ceiling_value = math.ceil(num1)
print(f"math.ceil({num1}) = {ceiling_value}")

# 3. math.floor(x)
floor_value = math.floor(num1)
print(f"math.floor({num1}) = {floor_value}")

# 4. math.fabs(x)
fabs_value = math.fabs(num1)
print(f"math.fabs({num1}) = {fabs_value}")

# 5. max(x1, x2, x3, ...)
maximum_value = max(num1, num2, num3)
print(f"max({num1}, {num2}, {num3}) = {maximum_value}")

# 6. min(x1, x2, x3, ...)
minimum_value = min(num1, num2, num3)
print(f"min({num1}, {num2}, {num3}) = {minimum_value}")

# 7. pow(x, y)
power_value = pow(num3, 2)
print(f"pow({num3}, 2) = {power_value}")

# 8. sqrt(x)
sqrt_value = math.sqrt(num2)
print(f"sqrt({num2}) = {sqrt_value}")

註:f”math.ceil({num1})” 表示字串格式化,想了解請至下文。

輸出:

1
2
3
4
5
6
7
8
abs(-4.7) = 4.7
math.ceil(-4.7) = -4
math.floor(-4.7) = -5
math.fabs(-4.7) = 4.7
max(-4.7, 16, 5) = 16
min(-4.7, 16, 5) = -4.7
pow(5, 2) = 25
sqrt(16) = 4.0

隨機數函數(Random Functions)


隨機數函數模組的引入:

import random

以下是幾個我們在 Python 中較為常用的隨機數函數:

Number函數描述
1random.choice(seq)從序列的元素中隨機挑選一個元素,例如random.choice(range(10)),從 0 到 9 中隨機挑選一個整數。
2random.randrange ([start,] stop [,step])從指定範圍內,以指定基數遞增的集合中取得一個隨機數,基數預設值為 1
3random.random()隨機產生下一個實數,它在 [0,1] 範圍內。注意:產生的內容包含小數。
4random.shuffle(lst)將列表的所有元素隨機排序。
5random.randint(start, stop)隨機產生整數。

以下是一個範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import random

# random.choice(seq)
colors = ['red', 'blue', 'green', 'yellow', 'black']
chosen_color = random.choice(colors)
print(f"隨機挑選的顏色: {chosen_color}")

# random.randrange([start,] stop [,step])
random_number = random.randrange(1, 20, 2)
print(f"從1到19之間(奇數)隨機選擇的數字: {random_number}")

# random.random()
random_float = random.random()
print(f"隨機生成的小數: {random_float}")

# random.shuffle(lst)
cards = ['Ace', 'King', 'Queen', 'Jack', '10']
random.shuffle(cards)
print(f"隨機排序後的撲克牌: {cards}")

# random.randint(start, stop)
random_integer = random.randint(1, 10)
print(f"隨機生成的整數: {random_integer}")

輸出(由於隨機性,所以生成的答案不同):

1
2
3
4
5
隨機挑選的顏色: blue
119之間(奇數)隨機選擇的數字: 19
隨機生成的小數: 0.0009559929219729035
隨機排序後的撲克牌: ['Ace', '10', 'Jack', 'Queen', 'King']
隨機生成的整數: 8

三角函數(Trigonometric Functions)


注意:三角函數需要引入 math 模組。

在高中階段我們只會學到 sin、cos、tan,以及弧度、角度的轉換,所以我們只列出以下幾種:

Number函數描述
1math.sin(x)回傳 x 的正弦值。
2math.cos(x)回傳 x 的餘弦值。
3math.tan(x)回傳 x 的正切值。
4math.degrees(x)將弧度轉換成角度,如 degrees(math.pi/2),回傳 90.0。
5math.radians(x)將角度轉換成弧度。

註:math.pi 為圓周率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import math

# math.sin(x)
angle_radians = math.pi / 6 # 30度的弧度值
sin_value = math.sin(angle_radians)
print(f"sin30: {sin_value}")

# math.cos(x)
cos_value = math.cos(angle_radians)
print(f"cos30: {cos_value}")

# math.tan(x)
tan_value = math.tan(angle_radians)
print(f"tan30: {tan_value}")

# math.degrees(x)
angle_degrees = math.degrees(math.pi / 2)
print(f"π/2 弧度轉角度: {angle_degrees} 度")

# math.radians(x)
angle_in_degrees = 180
angle_in_radians = math.radians(angle_in_degrees)
print(f"180 度轉弧度: {angle_in_radians} 弧度")

輸出:

1
2
3
4
5
sin30: 0.49999999999999994
cos30: 0.8660254037844387
tan30: 0.5773502691896257
π/2 弧度轉角度: 90.0
180 度轉弧度: 3.141592653589793 弧度

字串(String)

由於字串在前面章節已經有大致上說明及講解,所以於本章節會簡單帶過。

字串是由兩個雙引號或兩個單引號所組成,引號裡面可存放字元,如下所示:

1
2
3
"雙引號是字串"

'單引號也是字串'

:::danger
不過要注意的是,單雙引號必須成對,不能寫單引號加雙引號,否則程式會出錯。
:::

我們可以透過以下方式擷取字串值:

1
2
3
4
5
6
7
8
9
>>> a = "Hello"
>>> a[0]
'H'

>>> a[0:3]
'Hel'

>>>a[-1]
'o'

跳脫字元(Escape Character)


跳脫字元又可稱為逸出字元、轉義字元(大陸說法),而在 Python 中,若要使用跳脫字元,我們會在前面加上一個反斜線「\」。

接下來我們將來認識幾個較為常用的跳脫字元:

「\」,作用是顯示出「\」,程式碼範例如下所示:

1
2
>>> print("\\")
\

「\’」,作用是顯示出一個單引號「’」,程式碼範例如下所示:

1
2
>>> print('\'')
'

若要顯示出雙引號,就如單引號的範例一樣,各位可以自己試試看。

「\n」,作用為換行,程式碼範例如下所示:

1
2
3
4
>>> print("1\n")
1

>>>

可以看到當 1 顯示出來後,便又跳了一行。

補充:這個東西我們在前面講基本資料型態時講過,在字串前面加上一個 r(無論大小寫),都能夠使跳脫字元無效化,就是讓他現出原形,如下所示:

1
2
>>> print(r"\n")
\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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char = 'A'
string = "Hello, World!"
integer = 42
unsigned_integer = 255
octal = 0o123
hexadecimal = 0xABC
float_number = 3.1415926535
scientific = 123456.789

print("字元及ASCII碼: %c" % char)
print("字串: %s" % string)
print("整數: %d" % integer)
print("無號整數: %u" % unsigned_integer)
print("無號八進位數: %o" % octal)
print("無號十六進位數: %x" % hexadecimal)
print("無號十六進位數(大寫): %X" % hexadecimal)
print("浮點數(預設小數位數): %f" % float_number)
print("浮點數(指定小數位數): %.2f" % float_number)
print("科學記號格式化浮點數: %e" % scientific)
print("科學記號格式化浮點數(大寫E): %E" % scientific)

輸出:

1
2
3
4
5
6
7
8
9
10
11
字元及ASCII碼: A
字串: Hello, World!
整數: 42
無號整數: 255
無號八進位數: 123
無號十六進位數: abc
無號十六進位數(大寫): ABC
浮點數(預設小數位數): 3.141593
浮點數(指定小數位數): 3.14
科學記號格式化浮點數: 1.234568e+05
科學記號格式化浮點數(大寫E): 1.234568E+05

上述需要使用「%」來進行格式化的方式,都屬於舊版使用,不過無礙,因為這種格式化方式通用於 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
2
3
>>> name = 'Handsome Boy'
>>> f'Hello! {name}' # 替換變數
'Hello Handsome Boy'

這種方法其實就不用特別去判斷是 %s 還是 %d,就會自動轉換資料型態了,是不是非常的方便好用呢?

在 Python 3.8 的版本中可以使用 = 符號來拼接運算表達式與結果:

1
2
3
4
5
6
7
>>> x = 1
>>> print(f'{x+1}') # Python 3.6
2

>>> x = 1
>>> print(f'{x+1=}') # Python 3.8
x+1=2

:::success
快速整理!
f-string 是 Python 3.6 之後的版本才有,使用方法:在字串前面加上小寫f,字串內部增加大括號 {},裡面可以放運算式及變數。
:::

.format()


「{}」和「format()」是 Python 3 所使用的「新式」格式化,操作方式為「格式化字串.format(資料)」,輸出結果會將資料插入格式化字串的位置,下面的例子,會將 world 和 oxxo 兩個字串,分別插入字串中的兩個 {}。

引用至:文字與字串 ( 格式化 ) - Python 教學 | STEAM 教育學習網

不過作者本人經過相關的查詢後,發現 .format() 其實早在 python 2.6 就已經有了,所以並不是 Python 3。

1
2
3
a = 'hello {}, I am {}'
b = a.format('world', 'oxxo')
print(b) # hello world, I am oxxo

範例出處:文字與字串 ( 格式化 ) - Python 教學 | STEAM 教育學習網

使用 .format 的方式其實就有點像是填空格的感覺,不過 .format() 框框裡面的東西並不一定只要填入字串這個資料型態,例如填入 Number、list、tuple 等也是可以的,印出來的結果也如我們預期。

另外在 a 變數這邊,裡面的字串值中的 {} 裡面可以填入數字,用來代表填入資料的「順序」,跟序列(列表、元組那些)一樣,索引(index)預設從 0 開始。

以下是一個範例:

1
2
3
a = 'hello {1}, I am {0}'
b = a.format('world', 'oxxo')
print(b) # hello oxxo, I am world (world 和 oxxo 互換了)

{} 裡可以填入具名引數(Named Arguments),如果將上面程式裡的 {} 加入名稱,就會放入指定名稱的內容。

1
2
3
a = 'hello {m}, I am {n}'
b = a.format(m='world', n='oxxo')
print(b) # hello world, I am oxxo

可以從上述程式碼中看到:在變數 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
2
3
4
a = 'hello {0[x][m]}, I am {0[y][m]}'
b = {'x': {'m':'world', 'n':'oxxo'}, 'y':{'m':'QQ', 'n':'YY'}}
c = a.format(b)
print(c) # hello world, I am QQ

看完以上範例的代碼後,不要慌張,接下來讓我替你解釋一下:

首先第一行,依舊是 .format 的那個標準格式,只是各位比較不清楚的是,為什麼要在 [x][m] 前面放一個 0 呢?而這個 0 其實是 .format 方法中引數列表的索引,簡單來說他所指的就是第一個引數,也就是 b。

所以 {0[x][m]} 的意思是:

  1. 從 .format() 方法中的第一個引數 b 開始。
  2. 在 b 引數中找到鍵 x 對應的字典。
  3. 從字典中找到鍵 m 相對應的值,也就是 ‘world’。

接下來的 {0[y][m]} 依此類推,步驟都是一樣的。

新式的格式化字串和 % 定義略有不同,可以加入其他數值,來指定最小寬度、最大字元、對齊與精確度:

格式化數值說明
:開始需要加上冒號
不加東西、>靠右對齊
<靠左對齊
^置中對齊
填補字元將不足最小寬度的空白,填滿指定字元
數字.數字最小寬度.最大字元數,如果後方是 f (%f),第二個數字表示小數點位數

資料的型態也由 % 改為「:」表示。

格式化字串轉換型態
:s字串
:d十進制整數
:x十六進制整數
:o八進制整數
:b二進制整數
:f十進制浮點數
:e指數浮點數
:g十進制或指數浮點數
1
2
3
4
5
6
7
8
9
10
11
12
13
a = 'hello {}, I am {}'.format('world','oxxo')
b = 'hello {:10s}, I am {:10s}'.format('world','oxxo')
c = 'hello {:>10s}, I am {:>10s}'.format('world','oxxo')
d = 'hello {:-^10s}, I am {:+^10s}'.format('world','oxxo')
e = 'hello {:-^10.3s}, I am {:-^10s}'.format('world','oxxo')
f = 'hello {:-^10.3s}, I am {:^10.3f}'.format('world',123.456789)

print(a) # hello world, I am oxxo
print(b) # hello world , I am oxxo
print(c) # hello world, I am oxxo
print(d) # hello --world---, I am +++oxxo+++
print(e) # hello ---wor----, I am ---oxxo---
print(f) # hello ---wor----, I am 123.457

以上圖表範例來自:文字與字串 ( 格式化 ) - 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方法及描述
1capitalize():將字串的第一個字元轉換為大寫
2islower():如果字串中所有字元都是小寫,則回傳 True,否則回傳 False
3isupper():如果字串中所有字元都是大寫,則回傳 True,否則回傳 False
4isnumeric():如果字串中只包含數字字元,則回傳 True,否則回傳 False
5isspace():如果字串中只包含空白,則回傳 True,否則回傳 False
6join(seq):以指定字串作為分隔符,將 seq 中所有的元素(元素要是字串)合併為一個新的字串
7len(str):回傳字串長度
8lower():轉換字串中所有大寫字元為小寫
9max(str):回傳字串 str 中最大的字母(ASCII碼)
10min(str):回傳字串 str 中最小的字母(ASCII碼)
11upper():轉換字串中所有小寫字元為大寫

總結

模組(Module)


兩種引入模組的方式:

import <函式庫 or 模組名稱>

or

from <函式庫 or 模組名稱> import <物件>

嫌模組名稱太長,可用 as 將模組名稱改名:

import math as m

以下是今日所學的相關模組:import mathimport random

字串格式化(string-formating)


在 python 中共有三種字串格式化的方式:

  • 百分比符號 %
  • .format()
  • f-string

% 是最原始的格式化方式,各方面的功能較其他兩種差。

f-string 為最新的格式化方式,主打快速方便使用的格式化方法。

.format() 介於 % 與 f-string 之間,最大特點是相容性極好,可同時有 % 跟 f-string 的性質,運算及操作起來會較為複雜一些,但優點是功能極多,適合用於處理複雜的字串。

好那本篇教學就到此為止~感謝您的觀看,以下是一些參考資料:

參考資料

Python 3 數字(Number) | 菜鳥教程

Python 3 字串 | 菜鳥教程

文字與字串 ( 格式化 ) - Python 教學 | STEAM 教育學習網

菜鳥工程師 肉豬: 程式 什麼是實字 what is literal