---
# System prepended metadata

title: FDCSC110 Oct22 Handout - String

---

# 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`，並且終止程式。