# 資料型態與變數
## 一、文字型(string/char) : 存放文字的資料型態
以雙、三引號包住想要存放的字串(**string**) ex : "Hello World !", '''45002931:$''', "你我,他"
以單引號存放**單一字元**(**char**) ex : 'a', '1'
---
## 1.1常用方法及函式
### 1. len(str)
使用len(字串)可以得到字串長度
> 範例:
```python=1
print(len("NCU CSIE"))
//印出: 8
```
### 2. str + str
可以使用加號(+)來黏合字串
> 範例:
```python=1
print("Str" + "ing")
//印出: String
```
### 3. str * 次數
可以使用乘號(*)來重複印出字串
> 範例:
```python=1
print("Str" * 3)
//印出: StrStrStr
```
---
### 4. Index
電腦會將字串中的字元編號,當我們想特別使用字串裡的某個字時,可以使用index去檢索
> 範例:
<font size = 6>str = "NCU CSIE"</font>
| | N | C | U | | C | S | I | E |
| ----- | --- | --- | --- | --- | --- | --- | --- | --- |
| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
```python=1
print(str[0])
print(str[1:6]) //注意:這裡是1~5不包含6喔!
print(str[-1]) //印出最後一位
print(str[:])
```
> 輸出
```
N
CU CS
E
NCU CSIE
```
---
### 5. str.split()
當我們想以空白或其他字元分割字串時可以使用 `str.split()` ,若無指定則預設為空白
<font size = 5>str.split(想分割的字元)</font>
> 範例:
```python=1
str = "NCU CSIE IS VERY GOOD !"
//以空白分割字串
print(str.split())
//以"E"分割字串
print(str.split("E"))
//這時候再配合(四)教的index就可以輕鬆獲得想要的字串
print(str.split()[0])
```
> 範例:
```
["NCU", "CSIE", "IS", "VERY", "GOOD", "!"]
["NCU CSI", "IS V", "RY GOOD !"]
NCU
```
#### 使用時機範例:
```python=1
str = input() //假設我們輸入:3 10 37 三個數字以空白隔開
若我們要分別存取這三個數字,就可以利用split():
a = str.split()[0]
b = str.split()[1]
c = str.split()[2]
```
## 二、數字(int/float) : 存放數字的資料型態
int: 整數型數字 ex:`-1`, `2147483647`
float: 浮點數型數字 ex:`3.14`, `2.7`
#補充:在python中不需要分各種類型的數字,但在其他程式語言中要分清楚
## 2.1特殊運算
### 1. 整數除法及小數除法
1. 小數除法 (就是平常的除法) ex : `6 / 2 = 3`, `10 / 4 = 2.5`, `7 / 6 = 1.6666667`
2. 整數除法 (只取整數),使用兩個除號 ex : `7 // 6 = 1`, `3 // 6 = 0`
### 2. 指數
使用兩個乘號 `**` ex : `2 ** 2 = 4`, `2 ** 2 ** 2 = 16`, `2 ** 10= 1024`
### 3. 取餘數 / mod
使用 `%` 來獲得餘數 ex : `10 % 4 = 2`, `20 % 2 = 0`, `17 % 6 = 5`
## 三、邏輯型(boolean) : 存放True/False的資料型態
可以使用 `0` 或空字串 `""` 代表 `False`,而其他非零數字和字串都是 `True` ,但最常使用的是 `True(1)`, `Flase(0)`
邏輯型最常使用在後面章節的 if-else 句型中,可以當作判斷某件事情發生的開關,或是某個條件被觸發時的訊號
> 範例:
```python=1
TomIsGirl = False or 0
TomIsBoy = True or 1
print(5 > 10) // 印出False
print(10 > 7) // 印出True
print(10/2 == 5) //印出True # 在電腦中 == 代表平常在用的等於
print(11%2 != 0) //印出True # 而!= 代表不等於
```
## 四、資料型態間的轉換
#### 學完各種資料型態後,我們其實可以把資料轉換成不同的型態
### Casting 型別轉換
| 型別轉換 | 將傳入的物件轉型為 |
| ----------- | -------- |
| int(object) | 整數 | | |
|float(object)| 浮點數
|bool(object) | 布林值
|str(object) | 字串
> 範例
```python=1
print(int(45.23)) //印出 45
print(str(678)) //印出 678
print(bool(78)) //印出 True
print(float(True)) //印出 1.0
```
### type(物件)
#### 使用type()函式來確定物件的資料型態
> 範例:
```python=1
d = "Hello World"
e = 10.23
f = 11
print(type(d))
print(type(e))
print(type(f))
```
> 輸出:
<class 'str'>
<class 'float'>
<class 'int'>
### 進位轉換
將數字轉成二進位bin()、八進位oct()、十六進位hex()
| 進位轉換 | 將數字轉為n進位 |
| ----- | -------- |
| bin() | 二進位 |
| oct() | 八進位 |
| hex() | 十六進位|
### 常用的型別轉換:
> 範例:
```python=1
str = input() //假設輸入為 12 34兩個數字 #input()讀取時為字串!!!
num1 = str.split()[0] // "12"
num2 = str.split()[1] // "34"
```
若我們想要將num1+num2的值印出來:
print(num1 + num2) // 印出1234
這時候因為num1, num2是字串, 所以"12"+"34"印出來為1234
所以這時候我們需要把num1, num2轉成數字才能進行運算並得到我們想要的結果
print(int(num1) + int(num2)) //印出46
# 變數
變數是可以**存放資料**的一個**容器**
變數名稱只能是**英文、數字、底線的組合**,且名稱開頭**不能是數字**
錯誤範例: `#a`, `1234abc`, `a;bc`
正確範例: `apple`, `Aabc123`, `wow_22`
## 一、 宣告變數
**<font size = 4>變數名稱(自訂) = 想要存放的資料</font>**
> 範例:
ApplePrice = 100
fruit = "Apple"
Check = True
---
#補充: 其他程式語言要多寫一個資料型態
**資料型態 變數名稱(自訂) = 想要存放的資料**
> 範例:
string fruit = "apple"
int number = -23
float = 3.14
bool check = true
---
## 二、 變數內的資料處理
若我們想將一個變數裡的數字加1
要寫成 `number = number + 1` 或是 `number += 1`
> 範例:
```python=1
number = 10
number = number + 1
print(number) //印出11
```
> 範例:
若我們想將驚嘆號加到變數裡的字串的後面,可以寫成 `str = str + " !"` 或是 `str += "!"`
```python=1ㄋ
str = "I love coding"
str += " !"
print(str) // 印出 I love coding !
```
## 三、 變數優點
### 1. 可重複使用
> 範例:
```python=1
money = 1000
print("I have " + str(money*4) + " dollars.")
print("Iris has " + str(money*3) + " dollars.")
print("Michael has " + str(money*2) + " dollars.")
```
> 輸出:
I have 4000 dollars.
Iris has 3000 dollars.
Michael has 2000 dollars.
### 2. 增加可讀性
> 範例:
The_longest_English_word = "Pneumonoultramicroscopicsilicovolcanoconiosis"
### 3. 方便修改
> 範例:
fruit = "apple"
print("I like " + fruit + ".")
print("Tom likes " + fruit + ", too.")
print("But Cindy doesn't like " + fruit + ".")
> 輸出1
I like apple.
Tom likes apple, too.
But Cindy doesn't like apple.
這時候我們把fruit裡的資料改成banana,其餘不變
fruit = "banana"
print("I like " + fruit + ".")
print("Tom likes " + fruit + ", too.")
print("But Cindy doesn't like " + fruit + ".")
> 輸出2
I like banana.
Tom likes banana, too.
But Cindy doesn't like banana.
所有的apple都會變為banana了
因此使用變數可以方便我們管理資料以及增加我們的效率
# 練習題
## 一、是非題
1. ( ) 只要使用雙引號括起來的任何字元都是屬於文字型(字串)
2. ( ) `2**3 ` 是`2乘以3再乘以3`的意思
3. ( ) `length(字串)` 可以得到字串的長度
4. ( ) 若要分辨`23841039`1是不是偶數,我們可以判斷 `238410391 % 2` 是不是等於`0`
5. ( ) 若想要以空白分割字串,可以使用 `split(字串)`
## 二、選擇題
1. 以下何者為變數的優點
a. 可重複使用
b. 增加可讀性
c. 方便修改
d. 以上皆是
2. 請問以下程式碼的輸出為何者?
a. 17
b. 71
c. 89
d. 98
```
a = input() //輸入為8
b = input() //輸入為9
print(b+a)
```
## 三、程式題(大家可以在自己的編譯器上試試看)
小百今天體育課測100公尺,但在起跑時不幸摔倒,當他去問體育老師自己跑幾秒時,老師卻只委婉地跟他說他的平均速率是5m/s,請完成下列程式碼幫助小明得到自己的成績。
**hint:平均速率(speed) = 總距離(distance)/總時間(time)**
```
distance =
speed =
time = //請完成前三行程式碼
print("小百100公尺跑了"+time+"秒!")
```
體育老師幫大家100公尺測完秒數後,想要把大家的平均速率都算出來,請幫他寫出一個程式碼,要有兩個輸入(時間、同學名字),輸出為平均速率
**hint:可以參考前一題的程式碼**
```
distance =
time =
name =
speed = //請完成前四行程式碼
print(name+distance+"公尺的平均速率為"+speed+"m/s!")
```