---
# System prepended metadata

title: 簡介＆製作紀錄

---

# 簡介＆製作紀錄

### 簡介
此心得僅為本人高三上課及考試作業等心得，單純為入門者對python的一些想法及撰寫邏輯，若有錯誤或更好之解方純屬正常，欲了解更詳細之python教程，[請點此連結](https://letranger.github.io/PythonCourse/PythonBasic.html)。
註：全部都是統整心得，大概需要有list, for, while, try-except, if-else等基礎

### 製作紀錄
* 2022/11/06 開始製作：各種輸入方式、各種輸出方式、數學運算前半
* 2022/11/16 更換成書本模式，<font color="#f00">差點把舊版本弄不見＝＝</font>

### 參考資料
* [臺南一中高三程式設計課程講義](https://letranger.github.io/PythonCourse/PythonBasic.html)
* [Blog：字串格式化](https://medium.com/tsungs-blog/python-%E5%AD%97%E4%B8%B2%E6%A0%BC%E5%BC%8F%E5%8C%96-fdfe4ac41a2d)

### 慘考資料

* 高三上期中考：總得分92 / 滿分118

    ```
    5題基本題各100分，3題加分題各30分
    每題各5筆測資，通過一筆即拿到該題1/5分數
    最終總分除以5即為期中考成績
    備註：超過100分者加到平時成績（應該啦）
    
    題型：入門 ~ 單層迴圈、一維list
    （全班除前兩題外均從題庫抽題，題目不同）
    考試時間：8:10~9:50
    
    最終卡題內容：
    * 基本題 string的輔助函數使用（帳號密碼）
    * 加分題 閏年計算
    ```


---

    
# 各種輸入方式
### 單一變數輸入

```python=
a = input()
print(a)
```

### 兩個變數分兩行輸入

就是把上面的做兩次

```python=
a = input()
b = input()
```

### 兩個變數<font color="#f00">同一行</font>輸入

輸入兩個內容中間不會按enter分隔，此時兩個變數需用split( )分割輸入內容
.split( )函數內可放切割基準，例：input( ).split(' : ') 代表以冒號為標準去切割

```python=
a,b = input().split(':')
print(a,b)
```
```
input : 15:32
output: 15 32
```

### 多個變數同行輸入：存進list

當數個變數於同行輸入時，總不可能一直宣告 a,b,c,d,.... = input().split()
所以此時會利用list陣列來存進這些輸入值：

```python=
a = list(input().split())
print(a)
```
```
input
3 20 145 wer rt5 @@@ 4

output
[‘3’,‘20’,‘145’,‘wer’,‘rt5’,‘@@@’,‘4’]
```
要注意，就算輸入到list中也還是字串（文字）形式，可以看到輸出格式為'內容'。
若要轉換為數字需走訪list或使用map函數，之後會學到。
### 先給予一個值告訴你等等要輸入幾次，接著做多次的輸入

這裡會裡用到for迴圈做n次輸入，要特別注意每次的輸入是否只有一個變數（是的話就寫 a = input( ) 就好），如果是多個變數而且數量不固定建議依然使用 list 存變數

```python=
n = input()                      #告訴電腦接下來會做幾次輸入
for i in range(a):
   lst = list(input().split())   #輸入一行東東，這裡假設輸入的都是數字
   lst.sort(reverse=True)        #將數字從大到小排序
   print(a[0])                   #輸出第一個值（即排序完後的最大值）
```
```
input:
3
34 56 78
2 3 4
4 560 87 90

output：
78
4
560
```
### 同行輸入不定個數的整數

```python=
a = [int(x) for x in input().split()]
```

### 最難的：不知道要做多少次輸入（沒告訴你）

這種情況一般稱為多測資，如果考試遇到你不會就直接完蛋了，所以建議直接背起來，原理是利用EOF Checking：

#### 第一種：檢測何時輸入結束

```python=
try:
    while True:
        a = input()
        a = int(a)
        print(a+1)
       
except EOFError:
    pass             #當讀到結尾時就不做事
```
```
輸入：
345
6
78
90
123
0

輸出：
346
7
79
91
124
1
```

#### 第二種：輸入可能有非數字，想要轉int會發生錯誤

此種用在第一種情況也可以用（EOF本身就不是數字），所以推薦要背的話就背這一組

```python=
while True:
    try:
        a = int(input())    #註：同行輸入再轉int，跟寫兩行是一樣意思
        print(a+1)
    except ValueError:
        break
```
```
輸入：
3
14
58
123
4r
ty
78

輸出：
4
15
59
124
```
### 同行輸入轉int
若要同行輸入並轉int，可利用map函數，使用方法如下
```python=
a,b,c = map(int,input().split())     #變數數量少
d = list(map(int,input().split()))   #變數數量多或未知
```
這樣就不用額外多寫一行 a = int(a) 或for迴圈將變數從str轉int了

---
# 各種輸出方式

輸出相較之下就簡單很多，print誰不會
要注意的只有<font color="#f00">print輸出會自動換行</font>，跟C++不一樣，不需額外寫 '\n'，考試時注意不要自己搞自己

### 多內容輸出的分隔與結尾

print可以同時輸出多個內容，每個內容之間用逗號分隔，系統預設輸出出來的結果會是<font color="#f00">以空白分隔每個內容，以換行結尾</font>，如果想要改的話可以用 sep= 跟 end= 改變分隔跟結尾的方式

```python=
a,b = input().split()
print(a,b)
print(a,"is not equal to",b)
print(a,b,sep="hahaha",end="cool")
```
```
輸入：
3 5

輸出：
3 5
3 is not equal to 5
3hahaha5cool
```
## 格式化輸出：format
### 利用format控制輸出變數

python中的format函數非常好用，對於輸出多個資料且外加輔助文字時不用一直逗點分隔，可以全部寫在一個分號裡面
:::success
format函數用法：
print("{0} say {1} to {2}".format(a,b,c))
其中{0}, {1}, {2} 代表出現變數的位置（從第零個開始數）
整句話寫完之後用.format(a,b,c)代表第幾個位置要放哪個變數
:::

範例程式碼如下：
```python=
a,b,c = input().split()
print("{0} say {1} to {2}".format(a,b,c))
```
```
輸入：
Sun hi star

輸出：
Sun say hi to star
```

> print("{0} say {1} to {2}".format(a,b,c)) 
等效於
print(a,"say",b,"to",c)
但很明顯下面這個複雜許多


### 利用format控制小數點後幾位

原理大致相同，但在描述位置時{0}改成{0:.4f}代表輸出第一個變數時取檔小數點後第四位，要注意必須是數字不是文字

```py=
a = float(input())
b = float(input())
print("半徑為 {0:.1f} 且高為 {1:.2f} 的圓柱體積為 {2:.4f}".format(a,b,a*a*3.14*b))
```
```
輸入：
3
4

輸出：
半徑為 3.0 且高為 4.00 的圓柱體積為 113.0400
```

註：format不只有控制小數點位數的功能，但這是新手期最常用的
:::info
其他格式化方法用法[請見此連結](https://medium.com/tsungs-blog/python-%E5%AD%97%E4%B8%B2%E6%A0%BC%E5%BC%8F%E5%8C%96-fdfe4ac41a2d)
:::


---


# 數學運算

## 算數運算

* 加 "a+b"
* 減 "a-b"
* 乘 "a*b"
* 除 "a/b"，會除成小數
* 整除 "a//b"
* 取餘數（模運算）"a%b" #用於奇偶判斷
* 指數 "a**b"

```python=
a,b = input().split()
a = int(a)
b = int(b)
print(a+b)
print(a-b)
print(a*b)
print("{0:.4f}".format(a/b))
print(a//b)
print(a%b)
print(a**b)
```

:::info
註：字串的運算

程式碼：
1: a = input()
2: print(a+'3')    #注意相加的要同樣是字串
3: print(a*3)

範例輸入與輸出
輸入：
Today is a sunny day
輸出：
Today is a sunny day 3
Today is a sunny day Today is a sunny day Today is a sunny day
:::
## 關係運算與邏輯運算

* 大於 "a>b"
* 小於 "a<b"
* 等於 "a==b"，要注意是兩個等於，一個等於是賦值的意思
* 大於等於 "a>=b"
* 小於等於 "a<=b"
* 不等於 "a!=b"
* 交集 "(a>=b) and (c==d)"
* 聯集 "(a>=b) or (c==d)"


## 內建函數

* 傳回指定字元的 ASCII碼 或 Unicode："ord( )"
* 傳回指定 ASCII碼 或 Unicode 代表的字元："chr( )"
* 傳回字串長度："len( )"
* 絕對值："abs( )"
* 最大值："max( )"
* 最小值："min( )"
* 指數："power(a,b)"
* 商餘："divmod(a,b)"

```python=
print(ord("A"))
print(chr("97"))
print(len('python'))
print(abs(-3))
print(max(12,325,20))
print(min(12,325,20))
print(pow(2,10))
print(divmod(10,3))
```
```
輸出：
65
a
6
3
325
12
1024
(3,1)
```

## 新手常遇見題型（未完成）

### 二進位轉十進位

```python=
a = input()
b = int(a,2)
```
### 奇偶數判斷
```python=
a = int(input())
if a%2 ==0:
    print("even")
else:
    print("odd")
```
### 開根號
```python=
#寫法一：import math函式庫
import math
a = int(input())
print("{0} 開根號的值是 {1:.2f}".format(a,math.sqrt(a)))

#寫法二：0.5次方
a = int(input())
print("{0} 開根號的值是 {1:.2f}".format(a,a**0.5))
```

```
輸入：2
輸出：1.41
```
### 質數判斷

```python=
a = int(input())
k=0
for i in range(2,a):      ＃從a除以2開始一直到a除以a-1，檢驗有無整除
    if a%i ==0: 
        k=1
        break
if k==1:
    print("不是質數")
else:
    print("質數")
```
### 總和平均標準差

```
有空再寫
```

---

# 資料型別
## 字串 String
最常見的資料型別，輸入(input) 時資料即為字串形式
### 字串的指定、取值與加乘
```python=
str1 = 'Today is a sunny day.' #用單引號' '指定字串內容
str2 = 'Oh really?'

print(str[2])                  #輸出字串的第二個字元

print(str1+str2)               #字串相加
print(str1+"Perhaps.")         #字串相加

print(str2*3)                  #字串相乘
```

範例輸出
```
d 
Today is a sunny day.Oh really?   #註：中間沒有空白
Today is a sunny day.Perhaps.
Oh really?Oh really?Oh really?
```
:::warning
字串相加時一定要以字串形式相加（看不懂就看下面例子）
```python=
str1 = 'Hi hi I'm Josh.'
print(str1+'3') #正確
print(str1+3)   #錯誤
```
範例輸出
```
Hi hi I'm Josh3
  File "main.py", line 1
    str1 = 'Hi hi I'm Josh.'
                    ^
SyntaxError: invalid syntax
```
會這樣是因為3屬於整數int，非字串str，不同型別不能亂相加
:::
### 字串的切片 (slicing)
* 切片用法：[起始值 : 終止值 : 間隔]
```python=
str1 = 'Today is a sunny day.'
print(str1[2:11:2])    #從第2個字元開始到第10個字元，每兩個字元取一次
print(str1[ :5])       #從一開始（第０個字元）取值到第五個字元
print(str1[5: ])       #從第五個字元取值到最後
print(str1[::-1])      #從一開始取值到最後，倒數過來取
```
```
output:
dyi  snydy
Today 
 is a sunny day.
.yad unnus a si yadoT
```
### 字串的好用函數
設有一字串a
* len(a): 計算字串長度
* a.lower( ): 字串轉小寫
* a.upper(  ): 字串轉大寫
* a.islower(): 字串中英文全大寫
* a.isupper( ): 字串中英文全小寫
* a.find(b): 在 b 尋找 b，回傳索引值；若未找到，回傳-1
* a.replace(b, c): 將 a 中的 b 以 c 取代
* a.split([sep]): 字串以 sep 分割, sep 預設值為空白
```python=
input(a)
b = hi
c = bye
print(len(a))
print(a.lower())
print(a.find(m))
print(a.replace(b,c))
print(a.split())
```
```
輸入：
hi hi I am Josh

輸出：
15
hi hi i am josh
10
bye bye I am Josh
['hi','hi','I','am','Josh']
```
## 串列 List
* 資料格式：用 [ ] 把資料匡起來，裡面用 , 分隔
即 [元素1,元素2,...]，<font color="#f00">但默認元素一為第零個元素</font>
* list裡面可以放字串、數字、甚至是另一個串列（二維list）
### list的指標（assign)
幫list做指標時需注意兩個list是聯通的
因此若更改一個串列內容，另外一個也會跟著改
```python=
a = [1,2,3]
b = a
a[1] = 4
print(a)
print(b)
```
範例輸出
```
[1,4,3]
[1,4,3]
```
可以看出若要複製出獨立的串列直接assign是行不通的
若真的要複製出獨立串列，需用到copy函數或切片 (slicing)
```python=
a = [1,2,3]
b = a.copy()
c = a[:]
a[1] = 4
print(a)
print(b)
print(c)
```
範例輸出
```
[1,4,3]
[1,2,3]
[1,2,3]
```
### list的切片
大致上跟string的切片沒什麼兩樣
只是多了同時切片又賦值的功能
```python=
a = [1,2,3,4,5,6,7,8,9]
print(a[1:4])
print(a[2:7:2])
a[:3] = [7,7,7]       #將前三個元素用7取代
print(a)
```

範例輸出
```
[2,3,4]
[3,5,7]
[7,7,7,4,5,6,7,8,9]
```
### 建立與輸入list
* 建立一個空的list: a = [ ]
* 為list加入元素： a.append(要加入的元素)
* 以input形式加入元素： a.append(input())
* 連續輸入
    * 分行輸入：for迴圈
    * 同行輸入：a = list(input().split())
:::info
複習：[各種輸入方式](https://hackmd.io/@Neptune-mathteach/S1tccphSs/https%3A%2F%2Fhackmd.io%2FVa5UlpkRT2qUAqWgWlmn5Q%3Fview%23%25E5%2590%2584%25E7%25A8%25AE%25E8%25BC%25B8%25E5%2585%25A5%25E6%2596%25B9%25E5%25BC%258F)
:::
### 串列的好用函數
設 a 為一串列list、b 為一字串string
* len(a): 計算表列元素個數
* list(b): 將 b 轉成表列
* a.clear(): 清除 a 中所有元素
* a.append(元素): 將元素加到 a 尾端
* a.extend(串列): 將串列合併至 a 尾端
* a.remove(元素): 移除 a 中元素
* a.insert(索引值k,元素): 將元素加到 a 的索引值k 位置(第k-1個）
* a.pop(索引值): 從 a 取出指定元素。若索引值未指定，則取出尾端元素
* a.reverse(): 反轉 a 元素
* sum(a): 將 a 中所有元素加總 (註：僅限表列元素皆為數字)
* a.sort(): 將表列中所有元素排序
    * a.sort (key=None, reverse=False)
        * key: 排序規則（預設為數字由小到、英文字母由小到大）
        * reverse: 排序規則，reverse = True 降序， reverse = False 升序（默認）
* a.count(): 回傳元素出現次數
* a.index(): 回傳元素第一次出現的索引值

```python=
a = list(input().split())
for i in range(len(a)):
    a[i] = int(a[i])
b = input()

print(len(a))
print(list(b))

a.remove(5)
print(a)

a.insert(6,500)
print(a)

a.pop(80)
print(a)

a.sort(reverse=True)
print(a)

print(a.count(100))
print(a.index(100))
```
範例輸入與輸出
```
輸入：
1 2 100 9 0 7 5 100 90 80 100
string

輸出：
11
['s','t','r','i','n','g']
[1,2,100,9,0,7,100,90,80,100]
[1,2,100,9,0,7,500,100,90,80,100]
[1,2,100,9,0,7,500,100,90,100]
[500,100,100,100,90,9,7,2,1,0]
3
2
```


## 元組 Tuple
常數

## 字典 Dict
現實可用

## 集合 Set
整理

