# 簡介&製作紀錄
### 簡介
此心得僅為本人高三上課及考試作業等心得,單純為入門者對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]) #從一開始(第0個字元)取值到第五個字元
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
整理