Python 程式設計

第 10 章    字串

(1) Python資料型態

∗ Python 內建的資料型態

▸ 原始資料型態 (Primitive data type):int, float, bool

✶ 型態單一,資料不可再分割

▸ 集合資料型態 (Collection data type):str, list, dictionary, ...

✶ 由許多小部份組成,資料可再分割

(2) 字串簡介

∗ 字串 (String)

▸ 由一串字元組成,例如:'Hello world!'

▸ 空字串 (Empty string):沒有字元的字串 ('')

▸ 字串與字串相加 (運算子為 +):將兩個字串連接

hello = 'Hello'
world = 'world!'
print(hello + ' ' + world)
Hello world!

▸ 字串與數字相乘 (運算子為 *):重複字串

hello = 'Hello'
world = 'world!'
print((hello + ' ' + world)*3)
print(hello + ' ' + world*3)      # 遵循運算優先順序
Hello world!Hello world!Hello world!
Hello world!world!world!

▸ 除了上述的加法與乘法計算外,字串不能做任何其他的數學運算,例如,以下都是不合法的:

'message' - 1
'Hello' / 123
message * 'Hello'
'15' + 2

∗ 字串中各個字元的位置

▸ 字串中的字元由左向右排列,位置從 0 開始由左向右遞增,亦可從 -1 開始由右向左遞減,例如:

hello = 'Hello world!'
helloWord.png
✶ 可利用索引運算子 (Index operator) 取出字串中的某字元,索引運算子為內含數字 (即「索引」) 之方括號,例如: hello[8]hello[-4] 都是 'r'
✶ 索引也可以是個表示式,例如:
x, y = 12, 3
print(hello[x-2*y])    # 'w'

(3) 字串方法

∗ 字串是物件 (Object)

▸ 每一個字串物件都有它的屬性 (Attribute) 以及可以呼叫的方法 (Method)

▸ 使用點符號存取屬性及方法,例如:

hello = 'Hello world!'
print(hello.upper())
print(hello.lower())
HELLO WORLD!
hello world!
upper() 將所有字元改為大寫,然後回覆一個新字串
lower() 將所有字元改為小寫,然後回覆一個新字串

▸ 字串常用的方法:

方法說明
upper()回覆一個全大寫的字串
lower()回覆一個全小寫的字串
capitalize()回覆一個首字大寫的字串
split(<x>)以 <x> 字元分解字串,回覆一個串列
若無參數, 則預設字元為空白
strip()回覆一個左右均無空白的字串
lstrip()回覆一個左邊無空白的字串
rstrip()回覆一個右邊無空白的字串
count(<item>)回覆 <item> 子字串出現的次數
replace(<old>, <new>) 將 <old> 子字串置換為 <new>
center(<width>)在 <width> 寬度裡置中
ljust(<width>)在 <width> 寬度裡靠左對齊
rjust(<width>)在 <width> 寬度裡靠右對齊
find(<item>)尋找出現在最左邊的 <item> 字串,如果找不到就回覆 -1
rfind(<item>)尋找出現在最右邊的 <item> 字串,如果找不到就回覆 -1
index(<item>)find(), 但如果找不到就發出執行錯誤
rindex(<item>)rfind(), 但如果找不到就發出執行錯誤

∗ 字串長度:回覆字串裡的字元數量

fruit = 'Banana'
print(len(fruit))
6

∗ 字串切片 (Slicing):從字串中切出一段子字串

hello = 'Hello world!'
print(hello[0:5])      # 從 0 到 4 切出子字串
print(hello[:5])       # 從 0 開始,第一個索引可以省略
print(hello[5:])       # 到最後結束,第二個索引可以省略
print(hello[:])        # 從 0 開始到最後結束,兩個索引都可以省略
print(hello[6:11])     # 從 6 到 10 切出子字串
print(hello[6:100])    # 第二個索引超出範圍:不會有錯誤訊息
Hello
Hello
 world!
Hello world!
world
world!

∗ 字串比較

hello = 'Hello world!'
if hello == 'Hello world!':
    print('字串相同')
else:
    print('字串不同')
字串相同

print(ord('A'))    # 字元轉序數(Ordinal value)
print(ord('B'))
print(ord('5'))
print(ord('a'))
print('apple' > 'Apple')
65
66
53
97
True

print(chr(65))    # 序數轉字元(Character)
print(chr(66))
print(chr(49))
print(chr(53))
print(f'序數 32 的字元是{chr(32)}!!!')    # 空白字元
print(ord(' '))
A
B
1
5
序數 32 的字元是 !!!
32

fruit = 'apple'
if fruit < 'banana':    # 依序數比較
    print(f'水果 {fruit} 在 banana 之前')
elif fruit > "banana":
    print(f'水果 {fruit} 在 banana 之後')
else:
    print('我們沒有香蕉')
水果 apple 在 banana 之前

∗ 字串內容是不可改變的 (Immutable)

hello = 'Hello world!'
hello[0] = 'h'
print(hello)
TypeError: 'str' object does not support item assignment

▸ 解決方案:利用產生新字串方式來改變字串內容

hello = 'Hello world!'
hello = 'h' + hello[1:]
print(hello)
hello world!

▸ 練習 10-1

∗ 字串迴圈

hello = 'Hello world!'
for c in hello:    # 依序取用字串中的字元
    print(c)

for i in range(len(hello)):    # 利用索引取用字串中的字元
    print(hello[i])

for i in range(len(hello)-1, -1, -1):    # 反向
    print(hello[i])

∗ in 運算子:檢查字串中是否有某個子字串

print('p' in 'apple')
print('i' in 'apple')
print('ap' in 'apple')
print('pa' in 'apple')
print('pa' not in 'apple')
True
False
True
False
True

∗ 串連字元

def removeVowels(string):    # 刪除母音字元
    vowels = 'aeiouAEIOU'
    noVowels = ''
    for c in string:
        if c not in vowels:
            noVowels += c    # 舊字串加上一個字元產生新字串
    return noVowels

print(removeVowels('Artificial intelligence'))
rtfcl ntllgnc

∗ 計算某字元出現的次數

def count(text, theChar):
    letterCount = 0
    for c in text:
        if c == theChar:
            letterCount += 1
    return letterCount

print(count('banana', 'a'))
3

▸ 練習 10-2

上一章       下一章