Python 自學第三天:數字、字串的基本運算

這篇介紹如何處理數字字串資料型態的基本運算以及常用程式語法。

數字

基本運算

使用加 +、減 -、乘 * 和除 / 做基本運算。

除法還有分兩種:

  • 小數除法:
1
2
x = 3 / 6
print(x) # 0.5
  • 整數除法:
1
2
y = 3 // 6
print(y) # 0 (只取整數,丟掉小數部分)

// 不一定得到整數結果,主要是和分子、分母的型別有關:

1
2
3
4
5
6
y = 13 // 6
print(y) # 2 (只取整數,丟掉小數部分,然後給予整數的型別)
y = 13.0 // 6
print(y) # 2.0 (只取整數,丟掉小數部分,然後給予浮點數的型別)
y = 13 // 6.0
print(y) # 2.0 (只取整數,丟掉小數部分,然後給予浮點數的型別)

除法的餘數

使用 %

1
2
w = 8 % 6
print(w) # 2

指數 (開根號、平方、三次方等)

使用 **

1
2
3
4
z = 2 ** 0.5
a = 5 ** 3
print(z) # 1.4142135623730951 (2^0.5)
print(a) # 125 (5^3 = 5*5*5)

字串

截取字串

可以把一個字串想成是一組 Tuple,每個字母都有對應的位置 (index),從 0 開始編號,如下圖。

中括弧 [] 取得該位置的字元。用 [n:m] 截取從 nm-1 的一段字串。

1
2
3
4
5
6
7
z = "Hello Jenifer"
print(z[0]) # H
print(z[-6]) # e
print(z[0:-1]) # Hello Jenife 取得 0~(-1)(不包含最後一個字元) 位置的字串
print(z[1:5]) # ello 取得 1~5(不包含 5) 位置的字串
print(z[4:]) # o Jenifer 取得 4~最尾 位置的字串
print(z[:4]) # Hell 取得 第一個~4(不包含 4) 位置的字串

字串串接

使用 +

1
2
w = "Hello" + "Jenifer"
print(w) # HelloJenifer

重複輸出

使用 *

1
2
w = "Hello" * 2 + "Jenifer"
print(w) # HelloHelloJenifer

多行輸出

使用 \n'''可換行''' (三個單引號包圍) 或 """可換行""" (三個雙引號包圍)。

1
2
3
4
5
x = "Hello\nJenifer"
y = """Hello
中間的字可以有縮排、空格
空格不會被自動移除
Jenifer"""

包含、不包含

使用 innot in

1
2
3
4
x = "Hello Jenifer"
print("H" in x) # True (大寫 H 在變數 x 中嗎?)
print("E" in x) # False (大寫 E 在變數 x 中嗎?)
print("E" not in x) # True (大寫 E 不在變數 x 中嗎?)

輸出原始字串,移除特殊意義

使用 rR 放在字串第一個引號前面。

1
2
3
print(r"\n") # \n (原本是換行符號)
print(r"\"") # \" (原本是只有輸出 " 引號)
print(R"\u0024") # \u0024 (原本是輸出 $ 符號)

字串格式化

Python 有四種格式化方式。

  1. 「舊式」格式化 %
  2. 「新式」格式化 str.format()
  3. Formatted String Literals 字串字面量 f
  4. Template String 模板字串

這邊簡單介紹一些符號意義和基本使用方法。

符號 將對…進行格式化
s 字串。
d 整數。
b 二進位整數。
o 八進位整數。
x 十六進位整數。使用 X 會輸出大寫
c 轉成相對應的 unicode 字元。
f 浮點數。可指定小數點後的精度。預設小數點後精度 6 位。使用 F 輸出大寫NANIFN
e 用科學方法格式化浮點數。預設小數點後精度 6 位。使用 E 輸出大寫

1.「舊式」格式化 % (2.6 版以前)

在引號中,使用 %符號 表示該位置即將替換的資料或變數。若有多個資料,則用小括弧以 tuple 表示。

1
2
3
4
5
6
7
8
name = "Jenifer"
age = 100
print("My name is %s. I'm %d years old. My grade is %f." % (name, age, 4.3))
print("Hello %s." % name)

# 輸出字串為:
# My name is Jenifer. I'm 100 years old. My grade is 4.300000.
# Hello Jenifer.

%s:會被第一個位置的資料取代。
%d:會被第二個位置的資料取代。以此類推。
% name 和 % (name, age, 4.3):即將取代符號的資料。一個資料或資料組合 (tuple) 前記得要加 %。

也可以使用字典 (dictionary) 格式表示。

1
2
3
4
5
dic = {"name":"Jenifer", "age":100}
print("My name is %(name)s. I'm %(age)d years old." % dic)

# 輸出字串為:
# My name is Jenifer. I'm 100 years old.

可以指定輸出時,最少要預留的字元寬度小數點後精度位數正、負號表示靠右靠左對齊。

1
2
3
4
5
6
7
8
name = "Jenifer"
age = 100
print("My name is (%10s). I'm (%2d) years old. My grade is (%6.3f)." % (name, age, 4.3))
print("Hello (%-10s)." % name)

# 輸出字串為:
# My name is ( Jenifer). I'm (100) years old. My grade is ( 4.300).
# Hello (Jenifer ).

浮點數是以 %總字元位數.小數位數f 表示,總字元包含小數點

2.「新式」格式化 str.format()

在引號中,使用 {} 表示該位置,在第二個引號後 使用 .format() 來輸入即將替換的資料或變數。預設依照資料順序替換 {}

1
2
3
4
5
6
7
8
name = "Jenifer"
age = 100
print("My name is {}. I'm {} years old. My grade is {}.".format(name, age, 4.3))
print("Hello {}.".format(name))

# 輸出字串為:
# My name is Jenifer. I'm 100 years old. My grade is 4.3.
# Hello Jenifer.

還可以根據資料位置關鍵字字典來格式化字串。

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
# 資料位置:
# 用數字表示資料位置,從 0 開始編號。
# 如果想加資料位置,就必須全部添加,否則 Python 無法辨識剩下的資料該填入哪一個位置。
print("My name is {0}. I'm {1} years old. My grade is {2}.".format(name, age, 4.3))
print("{1}, {0}.".format("Hello", name))
# My name is Jenifer. I'm 100 years old. My grade is 4.3.
# Jenifer, Hello.

# 關鍵字:
# 只使用關鍵字時,位置不重要。
print("{someone} uses {tool}.".format(someone="Mary", tool="pens"))
print("{tool} are used by {someone}.".format(someone="Mary", tool="pens"))
# Mary uses pens.
# pens are used by Mary.

# 資料位置和關鍵字:
print("{1} were used by {0} at {time}.".format("Mary", "pens", time="3:00pm"))
# pen were used by Mary at 3:00pm.

# 字典:
dic = {"someone":"Mary", "tool":"pens"}
print("{someone} uses {tool}.".format(**{"someone":"Mary", "tool":"pens"}))
print("{tool} are used by {someone}.".format(**dic))
# Mary uses pens.
# pens are used by Mary.

同時使用資料位置和關鍵字參數時,format() 中的關鍵字參數一定要擺在位置參數後方
format 中填入字典資料時,前面記得加 **

如果要使用符號來格式化不同字串類型,要在在引號中,使用 {:符號} 表示。

1
2
3
4
5
6
7
8
9
name = "Jenifer"
age = 100
print("My name is ({:10s}). I'm ({:<5d}) years old. My grade is ({:^6.2f}).".format(name, age, 4.315))
print("Hello ({:^10s}).".format(name))
print("({:010.2f})".format(3.1234))

# My name is (Jenifer ). I'm (100 ) years old. My grade is ( 4.32 ).
# Hello ( Jenifer ). # 無法真的置中對齊時,向左靠近一個位元。
# (0000003.12)

<、> 或 ^:向左、向右或置中對齊。不加,是預設向左對齊。
若要讓數值前方的空白以 0 填補,可以在指定總字元位數時,前方加上一個 0。

3. Formatted String Literals 字串字面量 f

允許嵌入表達式的字串字面量。使用者可以直接在 {} 中填入變數名稱算式第一個引號前記得加 f

1
2
3
4
5
print(f"My name is ({name:>10s}). I'm ({age:5d}) years old. My grade is ({4.315:06.2f}).")
print(f"Result is ({age + 3:>5d})")

# My name is ( Jenifer). I'm ( 100) years old. My grade is (004.32).
# Result is ( 103).

4. Template String 模板字串

這個有新的概念,暫時無法理解沒關係,可以之後再回來看。

使用 Template() 這個工具,將我們想要製作的字串模板產生出來,使用前記得先引入 (import) 工具。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from string import Template # 引入 Template() 工具
myTemplate = "$someone uses $tool." # 變數前記得加 $
usable_template = Template(myTemplate) # 將字串模板傳入 Template() 工具,會產生出一個真的可以使用的字串模板

# 使用關鍵字:
print(usable_template.substitute(someone="John", tool="cups"))

# 使用字典:
# key 與變數名稱要一樣
dic = {"someone":"Chris", "tool":"plates"}
print(usable_template.substitute(dic))

# John uses cups.
# Chris uses plates.

製作字串模板時,變數前記得加 $
使用 substitute() 函式替換變數的值。替換方法可以用關鍵字字典

參考資料:
彭彭的課程:Python 數字、字串的基本運算
Python 字串格式化教學與範例
如何使用 Python 進行字串格式化