Python「內建函數」(built-in functions)就是不用 import,隨時可以直接呼叫的函數,像 print()、len()、range() 這些,都算。
ord():把字元變成對應的數字
ord() 接收一個字元(長度為 1 的字串),回傳它的 Unicode 碼位(整數)。
語法:ord(c) # c 是長度為 1 的字串基本用法:
print(ord('A')) # 65
print(ord('a')) # 97
print(ord('0')) # 48
print(ord(' ')) # 32(空格)
print(ord('\n')) # 10(換行)每個字元在 Unicode 中都有一個唯一的數字編號,ord() 就是用來查這個編號的。
搭配 chr() 互相轉換
ord() 和 chr() 是一對互逆函數。ord() 把字元變數字,chr() 把數字變字元:
print(chr(ord('Z'))) # Z(轉回來)
print(ord(chr(100))) # 100(轉回來)
# 把字元往後移 1 位
print(chr(ord('A') + 1)) # B
print(chr(ord('a') + 1)) # b用 ord() 判斷字元類型
利用 Unicode 碼位的範圍,可以手動判斷字元屬於哪種類型:
def char_type(c):
code = ord(c)
if 48 <= code <= 57:
return '數字'
elif 65 <= code <= 90:
return '大寫字母'
elif 97 <= code <= 122:
return '小寫字母'
else:
return '其他字元'
print(char_type('A')) # 大寫字母
print(char_type('5')) # 數字
print(char_type('z')) # 小寫字母
print(char_type('!')) # 其他字元當然,Python 有內建的 str.isdigit()、str.isupper() 等方法更方便,但理解 ord() 的原理有助於解決更複雜的問題。
ord() 處理中文和 emoji
ord() 不只能處理 ASCII 字元,任何單一 Unicode 字元都行:
print(ord('你')) # 20320
print(ord('好')) # 22909
print(ord('♥')) # 9829
print(ord('😊')) # 128522注意:ord() 只接受長度為 1 的字串,傳入多個字元會報錯:
# ord('AB') # TypeError: ord() expected a character, but string of length 2 found
# ord('') # TypeError: ord() expected a character, but string of length 0 found用 ord() 計算字母距離
因為字母在 Unicode 中是連續排列的,可以用 ord() 來計算兩個字母之間的距離:
# 計算字母是第幾個(A=1, B=2, ...)
def letter_position(c):
return ord(c.upper()) - ord('A') + 1
print(letter_position('A')) # 1
print(letter_position('Z')) # 26
print(letter_position('m')) # 13小小綜合例子
來做一個字串的 ASCII 藝術分析器,統計每個字元的 Unicode 碼位並視覺化:
# 字元碼位分析器
def analyze_string(text):
print(f'分析字串:"{text}"')
print('-' * 40)
for c in text:
code = ord(c)
bar = '█' * (code // 10)
print(f"'{c}' → {code:>6d} {bar}")
codes = [ord(c) for c in text]
print('-' * 40)
print(f'最小碼位:{min(codes)} ({chr(min(codes))})')
print(f'最大碼位:{max(codes)} ({chr(max(codes))})')
print(f'碼位總和:{sum(codes)}')
analyze_string('Hello!')
# 輸出:
# 分析字串:"Hello!"
# ----------------------------------------
# 'H' → 72 ███████
# 'e' → 101 ██████████
# 'l' → 108 ██████████
# 'l' → 108 ██████████
# 'o' → 111 ███████████
# '!' → 33 ███
# ----------------------------------------
# 最小碼位:33 (!)
# 最大碼位:111 (o)
# 碼位總和:533