# FDCSC110 Oct22 Handout - String --- ## Data Types ### 變數類型 - **Text Type**: `str` - **Numberic Types**: `int`, `float`, `complex` - **Sequence Types**: `list`, `tuple`, `range` - **Mapping Type**: `dict` - **Set Types**: `set`, `frozenset` - **Boolean Type**: `bool` - **Binary Types**: `bytes`, `bytearray`, `memoryview` ### 宣告方法 可以直接設值,讓編譯器自己判斷。 ```python= x = "Hello World" # str x = 10 # int x = 10.5 # float x = 1j # complex x = ["Fudan", "Computer", "Science"] # list x = ("Fudan", "Computer", "Science") # tuple x = range(10) # range x = {"Club" : "FDCSC", "Ranking" : 1} # dict x = {"Fudan", "Computer", "Science"} # set x = frozenset({"Fudan", "Computer", "Science"}) # frozenset x = True # bool x = b"Hello" # bytes x = bytearray(10) # bytearray x = memoryview(bytes(10)) # memoryview ``` 或者是可以直接用 `class` 的**建構元**。 這裡舉幾個例子 ```python= x = str("Hello World") # str x = int(10) # int x = dict(Club="FDCSC", Ranking=1) ``` 剩下的就依此類推,把**資料結構**的名稱加上()裡面放入需要的**引數**就可以了。 ## Numbers **Number Type**有 `int`、`float`、`complex`。 ### int 就是**整數**的意思,在 `Python` 中,所有的整數預設都是用 `int` 儲存的。 `int` 支援的運算子有 `+`、`-`、`*`、`/`、`//`、`**`、`%`、`>`、`<`、`==` 等運算子。 ### float 就是**浮點數**的意思,比較熟悉的講法是**小數**,所有的小數預設都是用 `float` 儲存的。 `float` 支援的運算子有 `+`、`-`、`*`、`/`、`//`、`**`、`%`、`>`、`<`、`==` 等運算子。 ### complex 這個可能比較不熟悉一點,在數學上這是**複數**。 **複數**,是數系中範圍最廣的,包含了**實數**和**虛數**。 `複數 = 實部 + 虛部`,而在 `Python` 中一個複數可以表示為 `"float" + "float + j"` (例如:`1+2j`) `float` 支援的運算子有 `+`、`-`、`*`、`/`、`**`、`>`、`<`、`==` 等運算子。 ## Strings `str`,也就是字串,是一個非常重要的東西,可以說是本節課的重點。 講到這裡應該都知道怎麼宣告了,就直接進到用法。 ### 取值 `str` 可以取出字串中特定的字元,或是特定的一段子字串。 範例程式碼 ```python= s = 'FDCSC' print(s[0]) # 'F' print(s[2:5]) # 'CSC' ``` 在上面的程式碼中, `s[0]` 代表的是取出第**1**個字元, `s[2:5]` 代表的是取出第**2~4**個字元。 ### 修改 由於可以修改 `str` 的函數很多,這裡就講一些比較常用的。 範例程式碼 ```python= s = 'FDCSC' s[0] = 'D' # s = 'DDCSC' s = ' ABCKINGDOM '.strip() # s = 'ABCKINGDOM' s = s.replace('ABC', 'DD') # s = 'DDKINGDOM' s = s + 'GG' # s = 'DDKINGDOMGG' s = 'Ranking: {}, Score: {:.2f}'.format(1, 99.9999) # s = 'Ranking: 1, Score: 100' s = 'Ranking: {}, Score: {:.3f}'.format(1, 99.9949) # s = 'Ranking: 1, Score: 99.995' s = '{}*{}={}'.format(1, 2, 1*2) # s = '1*2=2' s = 2*s # s = '1*2=21*2=2' s = 3*'a' # s = 'aaa' ``` - **LINE: 3**: 把第一個字元設為 `'D'` - **LINE: 4**: 所有的 `'ABC'` 變成 `'DD'` - **LINE: 5**: 在字串的末端加上 `'GG'` - **LINE: 6**: `format()` 的用意是把字串中 `{}` 依序改變成**引數**的值,而 `{:.2f}` 代表的是四捨五入到小數點後第 2 位 - **LINE: 7**: 同**LINE: 6**,但是變成四捨五入到小數點後第 3 位 - **LINE: 8**: 同**LINE: 6** - **LINE: 9**: 這個等同於 `s+s` 也就是把 `'1*2=2'` 的末端再加上一個 `'1*2=2'` - **LINE: 10**: 這行就是把 `s` 設為 3 個 `'a'` ### 其他輔助函數 這裡介紹幾個好用的輔助函數 ```python= a = 'a123a' b = '123' c = 'aa' e = '(2**2 + 3/2 + 100%4)%17' r = '1 a b cde 3.5' print(a.isdecimal()) # False print(b.isdecimal()) # Talse print(c.isdecimal()) # False print(a.isalpha()) # False print(b.isalpha()) # False print(c.isalpha()) # Talse print(eval(e)) # 5.5 print(r.split()) # ['1', 'a', 'b', 'cde', '3.5'] print(e.find('3/')) # 8 print(e.count('2')) # 3 print(len(a)) # 5 ``` - `isdecimal()` 是用來判斷字串裡的字元是否全部都是數字 - `isalpha()` 是用來判斷字串裡的字元是否全部都是字母 - `eval()` 是用來執行字串中的程式碼 - `split()` 把字串中以空白分開的字元視為一個變數,並且存進一個 `list` 裡面 - `find()` 是用來找出第一個在字串中出現的連續子字串,並回傳他的 `index` (索引值) - `count()` 是用來數一個連續子字串出現過幾次 - `len()` 會回傳字串的長度 ## Scope 一個變數可以依據他宣告的地方不同而分成**全域變數**和**區域變數**。 下面就用範例程式碼來講解 ```python= n, m = 1, 2 def add(): a, b = n, m return a+b print(add()) # 3 ``` 在上面的程式碼中, `n`、`m` 是屬於**全域變數**, `a`、`b` 是屬於 `add()` 函數 的**區域變數**。 **全域變數**的意思就是在這個程式碼的任何地方都可以使用的變數, **區域變數**就是只能在特定區域使用的變數, 例如 `a`、`b` 為 `add()` 函數中的**區域變數**, 所以 `a`、`b` 只能在 `add()` 函數中使用。 另外在宣告前面加上 `global` 就會讓那個變數宣告成**全域變數**。 ```python= n, m = 1, 2 def add(): global a, b a, b = n, m return a+b print(add()) # 3 ``` 在上面的程式碼中 `a`、`b` 為**全域變數** ## Map 現在我們要來拆解第一次上課的程式碼了, 還記得下面這行毒瘤嗎? ```python= m, n = map(int, input().split()) ``` 現在你應該除了 `map()` 函數都要看的懂了。 其實 `map()` 就是把 `input().split()` 回傳的 `list` 的每一項執行**引數1**的函數, 而我們帶入的是 `int()`,所以這行程式碼的意思就是 > 把輸入拆解成 `list` 之後,把每一項轉換成 `int`,並且在轉換成 `tuple`,最後把前兩個變數分別存入 `n`、`m`。 這句話如果現在不懂沒關係,等你寫久了會慢慢懂得:poop:。 題外話,如果輸入超過 1 個空白,`Python` 會出現 `Exception`,並且終止程式。