# 簡介&製作紀錄 ### 簡介 此心得僅為本人高三上課及考試作業等心得,單純為入門者對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 整理