Python計算專題
===
## (1)哈囉
概念:輸入、輸出
Scratch:

Python:
```python=
name = input('請問您的名字是:')
print('哈囉!',name,'您好!')
```
#### input 指令是讓使用者由鍵盤輸入資料,語法為:
:::info
```bash
變數 = input([提示字串])
```
- 使用者輸入的資料是儲存於指定的變數中。
:::
#### print 指令為列印項目,語法為:
:::info
```bash
print(項目1 [,項目2, ..., sep=分隔字元, end=結束字元])
```
- print指令:可以一次列印多個項目,項目之間以逗號 `,` 隔開
- sep分隔字元:如果有多個項目,項目之間使用分隔字元區隔,預設為一個空白字元。
- end結束字元:列印完成時自動加入的字元,預設為一個換行字元。
:::
## (2)求三數之和
概念:字串轉數字、數字運算
Scratch:

Python:
```python=
a = int(input('請輸入數字a:'))
b = int(input('請輸入數字b:'))
c = int(input('請輸入數字c:'))
print(a+b+c)
```
#### 變數與資料型態
:::info
在程式中使用變數來儲存資料,對於不同性質的資料,須決定使用哪種資料型態來儲存,這也會影響到電腦要配置多大的記憶體空間給這個變數使用。
Python變數使用的語法為:
```bash
變數名稱 = 變數值
```
Python會根據變數值設定適合的資料型態。例如:
```python
score = 80 # 整數(int)
average = 80.8 # 浮點數(float)
flag = True # 布林值(b0olean)
name = "John" # 字串(string)
```
:::
#### 資料型態轉換
:::info
資料型態相同的變數才能進行運算,對於某些資料型態,Python能夠進行簡單的自動轉換。
如果是整數與浮點數運算,系統會先將整數轉換浮點數再運算,運算結果為浮點數。例如:
```python
number = 8 + 6.3 # 結果為14.3,浮點數
```
如果系統無法自動進行資料型態轉換,就需使用下列的強制資料轉換指令:
- int() 強制轉換為整數。
- float() 強制轉換為浮點數。
- str() 強制轉換為字串。
例如對整數與字串做加法運算會產生錯誤:
```python
number1 = 56 + "23" # 錯誤,無法進行運算
number2 = 56 + int("23") # 正確,結果為79
```
如果使用input()指令從鍵盤轉入數字,其數字是以字串的資料型態來儲存,必須先將其用int()指令來強制轉換為整數,否則使用加號`+`進行運算,就會變成是字串相加,而不是數值相加。
:::
#### 算術運算符號
:::info
運算符號|意義|範例|運算結果|
----|-------|----|----|
+|加法|8+5|13
-|減法|8-5|3
*|乘法|8*5|40
/|除法|8/5|1.6
%|除法取餘數|8%5|3
//|除法取商數|8//5|1
:::
## (3)求平均數
概念:數字轉文字、文字運算
Scratch:

Python:
```python=
a = int(input('請輸入數字a:'))
b = int(input('請輸入數字b:'))
average = (a + b) / 2
print('平均是'+str(average))
```
### + 運算符號
:::info
加號 `+`可用於數值運算,也可用於字串組合,使用時需注意其所應用的資料型態。
```python
23 + 64 # 正確,結果為87
23 + '64' # 錯誤,無法進行運算
'hello' + 34 # 錯誤,無法進行運算
'hello' + '34' # 正確,結果為 hello34
'hello' + str(34) # 正確,結果為 hello34
```
:::
## (4)成績計算
概念:條件式、選擇結構
Scratch:

Python:
```python=
score1 = int(input('請輸入作業成績:'))
score2 = int(input('請輸入測驗成績:'))
score3 = int(input('請輸入平時成積:'))
grade = score1*0.4+score2*0.4+score3*0.2
print('學期成績:'+str(grade))
if grade >= 60:
print('及格')
else:
print('不及格')
```
#### 關係運算符號
:::info
運算符號|意義|範例|運算結果|
----|-------|----|----|
==|相等|8\==5<BR>2+6\==3+5|False<BR>True|
!=|不相等|8!=5<BR>2+6!=3+5|True<BR>False|
>|大於|8>5<BR>2>6|True<BR>False|
<|小於|8<5<BR>2<6|False<BR>True|
>=|大於或等於|8>=5<BR>2+3>=5<BR>2>=6|True<BR>True<BR>False|
|<=|小於或等於|8<=5<BR>2+3<=5<BR>2<=5|False<BR>True<BR>True|
:::
#### 單向選擇結構
:::info
在日常生活,我們經常會遇到要作決策的情況,例如:如果下雨了,就帶把傘出門。程式的執行也是類似的情況,根據條件式運算結果,執行不同的程式區塊。最簡單流程控制是單向選擇結構,語法是:
```python
if 條件式:
程式區塊
```
if敘述後面接著條件式,條件式的運算結果是布林值,當條件式為True時,就會執行程式區塊的敘述。當條件式為False時,不會執行程式區塊。在條件式之後必須有冒號`:`,底下的程式區塊必須縮排,在Python中縮排程式碼,可以使用1個Tab鍵或4個空白字元,須注意兩種方式不能混用。
:::
#### 雙向選擇結構
:::info
如果我們希望遇到情況為True和False時,分別做不同的事,就需要使用雙向選擇結構,語法是:
```python
if 條件式:
程式區塊1
else:
程式區塊2
```
當條件式為True時,執行程式區塊1,當條件式為False時,執行程式區塊2。
:::
#### 多向選擇結構
:::info
如果發生的情況不只有兩種,就可以使用elif敘述,來做更進一步的選擇,語法:
```python
if 條件式1:
程式區塊1
elif 條件式2:
程式區塊2
elif 條件式3:
......
else:
程式區塊n
```
當條件式為True時,就執行相對應的程式區塊,當所有條件式皆為False時,執行else裡面的程式區塊。
:::
## (5)累加計算
概念:計次式迴圈
Scratch:

Python:
```python=
n = int(input('請輸入數字n:'))
sum = 0
for i in range(1, n+1):
sum = sum + i
print('1+2+..+'+str(n)+'='+str(sum))
```
#### 串列
:::info
程式中的資料通常使用變數來儲存,對於大量的資料可以用串列簡化變數的需求量。每一個串列擁有一個識別名稱,串列中的每一個資料稱為元素,每一個元素相當於一個變數,要存取串列中特定元素,是以元素在串列中的位置做為索引值,串列的使用方式如下:
```python
串列名稱 = [元素1, 元素2, ......]
```
串列中的元素資料型態可以相同,也可以不相同。串列的索引值從0開始,第一個元素的索引值是0,第二個元素的索引值是1,第三個元素的索引值是2,以此類推,索引值也可以是負數,代表從串列最後算起第幾個元素,例如最後一個元素的索引值是-1。
```python
list1 = [1, 2, 3, 4, 5] # 元素皆為整數
list2 = ['John', 'Marry', 'Tom'] # 元素皆為字串
list3 = ['Hellen', 18, True] # 包含不同資料型態元素
print(list1[0]) # 1
print(list2[1]) # Marry
print(list3[-1]) # True
:::
#### range 函式
:::info
計次式迴圈中經常使用range函式來建立整數循序串列,range函式的語法為:
```python
range([起始值,] 終止值 [,累加值] )
```
產生的串列是由`起始值`,每次會遞增`累加值`,到`終止值-1`的串列。
```python
list1 = range(5) # list1 = [0, 1, 2, 3, 4]
list2 = range(1, 5) # list2 = [1, 2, 3, 4]
list3 = range(1, 5, 2) # list3 = [1, 3]
list4 = range(5, 1, -1) # list4 = [5, 4, 3, 2]
```
:::
#### for 迴圈
:::info
for迴圈是一種處理重覆步驟的語法,它會從一個串列中逐一取出元素,然後指定給迴圈變數,因為串列中的元素個數,即是重複迴圈中程式碼執行的次數,所以稱為計次式迴圈。
```python
for 迴圈變數 in 串列:
程式區塊
```
例如有一個數字串列[1,2,3,4,5],我們把它放在for迴圈的in這個關鍵字後方,在結束的冒號前方,另外,使用i來做為迴圈變數。在程式區塊的部份,為了讓Python了解這個區塊是屬於迴圈的內容,所以要向內縮排。譬如說我們在程式區塊的部份,想讓Python印出每一個迴圈中的迴圈變數值,就可以寫成print(i)。因此,全部的程式碼寫法如下:
```python
for i in [1,2,3,4,5]:
print(i)
```
另外,因為這個串列是有規則的數列,所以我們可以用range函式來簡化。
```python
for i in range(1,6):
print(i)
```
:::
## (6)密碼檢查
概念:條件式迴圈,邏輯運算
Scratch:

Python:
```python=
password = '137'
times = 1
password2 = input('請輸入密碼:')
while password != password2 and times < 3:
print('密碼錯誤!')
times = times + 1
password2 = input('請輸入密碼:')
if password == password2:
print('歡迎使用本系統')
else:
print('輸入密碼超過3次,帳號已被鎖定。')
```
#### while迴圈
:::info
當我們不知道要重複執行幾次,而是知道繼續重複執行的狀況,這時侯就要使用條件式迴圈。Python的條件式迴圈使用while關鍵字,後面接著條件式,若條件式成立,則執行迴圈中的程式區塊,若條件式不成立,則跳出迴圈。它的語法如下:
```python
while 條件式:
程式區塊
```
這個例子中的Scratch條件式迴圈積木是重複執行直到條件成立為止,所以這時侯的條件式是終止狀況,不同的是Scratch積木的是,Python的while迴圈,其條件式並不是終止狀況,而是符合條件式的情況下執行迴圈內的程式區塊。
:::
#### 邏輯運算符號
:::info
運算符號|意義|範例|運算結果|
----|-------|----|----|
not|反相。傳回與運算結果相反的值。|not (2<3)<BR>not (3>5)|False<BR>True|
and|且。左右兩邊同時成立,<BR>運算結果才會成立。|(2<3) and (5<9)<BR>(2<3) and (5>9)<BR>(2>3) and (5<9)<BR>(2>3) and (5>9)|True<BR>False<BR>False<BR>False|
or|或。左右兩邊任一個成立,<BR>運算結果就會成立。|(2<3) or (5<9)<BR>(2<3) or (5>9)<BR>(2>3) or (5<9)<BR>(2>3) or (5>9)|True<BR>True<BR>True<BR>False|
:::
## (7)任意數的所有因數
概念:串列
Scratch:

Python:
```python=
n = int(input('請輸入數字n:'))
factors = []
for i in range(1, n+1):
if n % i == 0:
factors.append(i)
print(factors)
```
#### 串列
:::info
在第五題時我們已經認識了串列的基本概念,現在我們要來認識串列的進階用法。對於一個串列,可以使用索引值去取用串列中的元素,索引值可以是一個數字,一次取用串列中的一個元素。此外,串列的中括號裡面也可以是一個數字範圍,一次取用串列中多個元素,形成另外一個子串列。
```python
list1 = ['a', 'b', 'c', 'd', 'e']
# 從索引值1的位置開始取用,直到不包含索引值3的位置,將之間的元素取用出來。
list2 = list1[1:3] # list2=['b', 'c']
# 從索引值1的位置開始取用,直到最後一個元素位置,將之間的元素取用出來。
list3 = list1[2:] # list3=['c', 'd','e']
# 從第一個元素(索引值0)的位置開始取用,直到不包含索引值3的位置,將之間元素取用出來
list4 = list[:3] # list4=['a','b','c']
```
串列的內容可以新增元素(append)或刪除元素(remove),或是將元素新增在指定的位置上(insert)。
```python
list1 = ['a','b']
list1.append('c') # list1 = ['a','b','c']
list1.remove('b') # list1 = ['a','c']
list1.insert(0,'b') # list1 = ['b','a','c']
list1.insert(2,'d') #list1 = ['b','a', 'd','c']
:::
## (8)抽獎
概念:亂數
Scratch:

Python:
```python=
from random import randint
n = 30
box = []
for i in range(1, n+1):
position = randint(0, i-1)
box.insert(position,i)
print(box)
print('第一特獎:'+str(box[0]))
print('第二特獎:'+str(box[1]))
print('第三特獎:'+str(box[2]))
```
#### 亂數
:::info
Python有各式各樣的函式庫可以使用,亂數是Python內建的函式庫,只要加上import random就可以了。此外,如果我們只是要用函式庫裡面的取整數亂數這一個功能而已,這時侯我們可以用 from random import randint 這種寫法,就不會把整個函式庫都匯進來。
randint(a, b)會隨機挑選一個大於等於a、小於等於b的整數。
```python
from random import randint
number = randint(1, 100)
print(number)
```
:::
## (9)溫度換算(習作)
## (10)書店打折(習作)