# 期中考前的幾個Python必懂重點 ###### tags: `期中` `Python` `蟒蛇` `可怕的大蟒蛇` `panic` `frustrated` ## 前言 下一篇:<a href="https://hackmd.io/n84QsEMuRuaWDusXw83s8w">期末考前的幾個Python必懂重點</a><br /> <font color="#FF2D2D">紅色</font>是重點 <<font color="#2CBFE0 ">藍色</font>>是讓你變動的東西 歡迎分享,代碼推薦上編譯器實際體驗一次 有問題能在下面提問 這裡只是我考試或寫作業時覺得很常用的重點整理 詳細資料請參閱 <a href="https://letranger.github.io/PythonCourse/PythonBasic.html" target="_blank">Python教材PDF</a><br /> ## 宣告 ### 數字類 #### <font color="#FF2D2D">整數</font> 語法如下: <<font color="#2CBFE0 ">變數名稱</font>> = <<font color="#2CBFE0 ">任意整數</font>> > <font color="#00CC00">即興範例</font> ``` a = 10 #自動識別為整數類型 b = 10.01 #b為小數類型 b = int(b) #轉換數字類型(無條件捨去) ``` #### <font color="#FF2D2D">浮點數(小數)</font> 語法如下: <<font color="#2CBFE0 ">變數名稱</font>> = <<font color="#2CBFE0 ">任意小數</font>> > <font color="#00CC00">即興範例</font> ``` a = 10.4 #自動識別為小數類型 b = 10 #b為整數類型 b = float(b) #轉換成小數類型(雖然是整數,但本質是小數類型) ``` #### 二進位轉十進位 語法如下: <<font color="#2CBFE0 ">十進位變數名稱</font>> =int(<<font color="#2CBFE0 ">二進位值</font>>,2) > <font color="#00CC00">3E.py</font> > 輸入: 一個8個位元的二進位字串 > 輸出: 相對應的10進位值 ``` A =input() B =int(A,2) print('二進位數 {0} 在十進位表達為: {1}.'.format(A,B)) ``` ### <font color ="#FF2D2D">運算</font> 加法 <<font color="#2CBFE0 ">變數1</font>>+<<font color="#2CBFE0 ">變數2</font>> 減法 <<font color="#2CBFE0 ">變數1</font>>-<<font color="#2CBFE0 ">變數2</font>> 乘法 <<font color="#2CBFE0 ">變數1</font>>*<<font color="#2CBFE0 ">變數2</font>> 除法  <font color="#8F8F8F">#除以0會報錯</font> <<font color="#2CBFE0 ">變數1</font>>/<<font color="#2CBFE0 ">變數2</font>> 向下取整除法 <<font color="#2CBFE0 ">變數1</font>>//<<font color="#2CBFE0 ">變數2</font>> 絕對值 abs(<<font color="#2CBFE0 ">變數</font>>) <font color ="#FF2D2D">模(整數運算取餘數)</font> <<font color="#2CBFE0 ">變數1</font>>%<<font color="#2CBFE0 ">變數2</font>> 模運算最重要的就是在奇數、偶數、因數與質數的判斷 請務必了解 > <font color="#00CC00">奇偶判斷</font> ``` number = int(input()) if number % 2 == 0 #除以2餘0(整除於2) print('偶數') elif number % 2 == 1 #除以2於1 print('奇數') ``` <font color="#FF2D2D">指數運算</font> <<font color="#2CBFE0">底數變數</font>>\*\*<<font color="#2CBFE0">指數變數</font>> 這樣你就不用import math用sqrt了 > <font color="#00CC00">開根號</font> ``` number = int(input()) print('sqrt is {0:.2f}'.format(number**0.5)) ``` ### 布林值 #### <font color="#FF2D2D">布林值</font> 語法如下(注意大小寫): <<font color="#2CBFE0 ">布林名稱</font>> = True <<font color="#2CBFE0 ">布林名稱</font>> = False > <font color="#00CC00">"簡易"質數判斷</font> ``` number = int(input()) #輸入一個數number n_prime = False #number預設是質數 for i in range(2,number): #i範圍從2到number-1 if number%i == 0: #如果number有任何因數 n_prime = True break if n_prime == True: #如果布林值結果為正 print('not prime') #輸出"非質數" else: print('prime') ``` ## 輸出print ### print #### <font color="#FF2D2D">就是print</font> 語法如下: print(<<font color="#2CBFE0 ">能print的都行</font>>) 一些特別的語法: 把尾段換行取代以<字串>結尾 print(<<font color="#2CBFE0 ">能print的都行</font>>,end ='<<font color="#2CBFE0 ">字串</font>>') > <font color="#00CC00">即興範例</font> ``` print('Hello world') #字串要用'Hi'或''Hi''框起來 a = 10 print(a) ``` #### <font color="#FF2D2D">格式化print</font> 語法如下: print('{<<font color="#2CBFE0 ">第0項</font>>}裡面的字串{<<font color="#2CBFE0 ">第1項</font>>}'.format(<<font color="#2CBFE0 ">變數1</font>>,<<font color="#2CBFE0 ">變數2</font>>)) 考試的大重點 **目前主要功能是小數點位數輸出** 語法如下: <font size=2>print('{<<font color="#2CBFE0 ">第0項</font>>},{<<font color="#2CBFE0 ">第1項</font>>:.<<font color="#2CBFE0 ">取到小數點第幾位</font>>f}'.format(<<font color="#2CBFE0 ">變數1</font>>,<<font color="#2CBFE0 ">變數2</font>>))</font><br> > <font color="#00CC00">1B.py</font> > 輸入圓柱體的的半徑、高 ,輸出該圓柱體體積。 > 請以小數計算,輸出至第四位,pi的值請計算至3.1416。 ``` r = float(input()) #宣告半徑 h = float(input()) #宣告高 print('{0:.4f}'.format(r**2*3.1416*h)) #注意{}中的格式表達 ``` ## input/特殊測資要求 ### input #### <font color="#FF2D2D">input</font> 語法如下: <<font color="#2CBFE0 ">變數名稱</font>> = input() 考試用不到的用法 <<font color="#2CBFE0 ">變數名稱</font>> = input('請輸入數字')  <font color="#8F8F8F">#在終端機會出現提示字</font> 考試很重要但不是必要的用法 <<font color="#2CBFE0 ">變數名稱</font>> = int(input()) <<font color="#2CBFE0 ">變數名稱</font>> = float(input()) <<font color="#2CBFE0 ">變數名稱1</font>>,<<font color="#2CBFE0 ">變數名稱2</font>> = input().split()  <font color="#8F8F8F">#同行輸入</font> <<font color="#2CBFE0 ">變數名稱1</font>>,<<font color="#2CBFE0 ">變數名稱2</font>> = map(int,input().split())<font color="#8F8F8F">  #同行輸入轉int</font> ### try except #### try except 語法如下: try: <<font color="#2CBFE0 ">function(一個函式)</font>> except:   <font color="#8F8F8F">#如果前項函式無法執行(ERROR)時</font> <<font color="#2CBFE0 ">function</font>> else:     <font color="#8F8F8F">#except無執行時</font> <<font color="#2CBFE0 ">function</font>> > <font color="#00CC00">2B.py</font> >請撰寫一程式讀入某生姓名、各科成績,以特定格式輸出結果。 輸入:姓名、2科成績,所有輸出資料都在同列,以空白相隔。 輸出:姓名及平均(至小數點第4位,:後有一英文空白)。 因為輸入值可能會出現錯誤,例如分數輸入9a, 8b之類的,造成無法計算,若出現此類問題,請輸出Error!! ``` a = input().split() try: for i in range(1,3): a[i] = float(a[i]) #嘗試把後兩位字串轉成浮點數 except: #其中之一轉不了,把它抓出來 print('Score {0} error!!'.format(i)) else: #沒出啥差錯,輸出成績 print('{0}: {1:.4f}'.format(a[0],sum(a[1:3])/2)) ``` ### <font color="#FF2D2D">多測資輸入</font> **這個你不會遇到這種的你就沒了** 所以至少把它背起來,最好的就是理解EOF(End of file)Error還有try except的用法 > <font color="#00CC00">zerojudge_a007(質數判斷).py</font> > 請判斷某數是否為質數 輸入說明 輸入有多組測試資料(以EOF結尾),每組測試資料占一行,只包含一個整數x, 2 ≦ x ≦ 2147483647。 > 測試資料至多有200000筆。 > 輸出說明 > 對於每組測試資料,如果輸入的x為質數,則輸出一行「質數」(不含引號);否則輸出一行「非質數」(不含引號)。詳見範例測試資料。 ``` #這個寫法在zerojudge超時(TLE)了但可以正常使用 P = True try: while True: a = int(input()) if a%2 == 0: print('非質數') P = False else: for i in range(3,int(a**(1/2)),2): if a%i == 0: print('非質數') P = False if P == True: print('質數') except: pass #資料結束,程式以pass結束 ``` ## 判斷結構 ### 條件判斷 #### <font color="#FF2D2D">關係運算子</font> 語法如下: <<font color="#2CBFE0 ">變數1</font>> == <<font color="#2CBFE0 ">變數2</font>> <<font color="#2CBFE0 ">變數1</font>> != <<font color="#2CBFE0 ">變數2</font>> or <<font color="#2CBFE0 ">變數1</font>> not <<font color="#2CBFE0 ">變數2</font>> <<font color="#2CBFE0 ">變數1</font>> > <<font color="#2CBFE0 ">變數2</font>> <<font color="#2CBFE0 ">變數1</font>> < <<font color="#2CBFE0 ">變數2</font>> <<font color="#2CBFE0 ">變數1</font>> >= <<font color="#2CBFE0 ">變數2</font>> <<font color="#2CBFE0 ">變數1</font>> <= <<font color="#2CBFE0 ">變數2</font>> 通常搭配 if 和 while 使用 #### 邏輯運算子 語法如下: <<font color="#2CBFE0 ">關係判斷1</font>> and <<font color="#2CBFE0 ">關係判斷2</font>> <<font color="#2CBFE0 ">關係判斷1</font>> or <<font color="#2CBFE0 ">關係判斷2</font>> not <<font color="#2CBFE0 ">關係判斷</font>> #### <font color="#FF2D2D">if...elif...else</font> 語法如下: if <<font color="#2CBFE0 ">關係判斷1</font>>:   <<font color="#2CBFE0 ">function</font>> elif <<font color="#2CBFE0 ">關係判斷2</font>>:   <<font color="#2CBFE0 ">function</font>> else:   <<font color="#2CBFE0 ">function</font>> > <font color="#00CC00">4A.py</font> ``` num =int(input()) if num < 0: print('M') elif num == 0: print('Z') elif num%2 == 0: print('E') elif num%2 == 1: print('O') ``` ## 迴圈Loop ### for #### <font color="#FF2D2D">for loop</font> 語法如下: for <<font color="#2CBFE0 ">function</font>>:   <<font color="#2CBFE0 ">function</font>> range用法: <font size = 2>for <<font color="#2CBFE0 ">局域變數名稱</font>> in range(<<font color="#2CBFE0 ">整數起始數字(預設0)</font>>,<<font color="#2CBFE0 ">整數終止數字(總共會跑到終止數字-1)</font>>,<<font color="#2CBFE0 ">整數間隔</font>>)</font> > <font color="#00CC00">即興範例</font> ``` for i in range(1,100): print('hello world {0} times'.format(i)) ``` 走訪用法: 當你有一字串或是列表時: for <<font color="#2CBFE0 ">局域變數名稱</font>> in <<font color="#2CBFE0 ">字串或列表</font>>:   <<font color="#2CBFE0 ">function</font>> > <font color="#00CC00">輸出列表或字串元素</font> ``` a_string = 'Koyori my wifu' for i in a_string: print(i,end ='') ``` 迴圈(for版)外的else: 當迴圈正常結束(非break等原因)時才會執行 > <font color="#00CC00">找最小因數</font> ``` number = int(input()) for i in range(2,number): if number%i == 0: print('找到最小因數',i) break #找到最小因數就退出迴圈 else: print('找不到因數') ``` ### while #### while 語法如下: while <<font color="#2CBFE0 ">關係判斷</font>>:  <font color="#8F8F8F">#當判斷成立時</font>     <<font color="#2CBFE0 ">function</font>> > <font color="#00CC00">不帶根號的平方數開根號</font> ``` a_square_number = int(input()) test_number = 0 while test_number**2 != a_square_number: test_number += 1 print('sqrt is',test_number) ``` 迴圈(while版)外的else: 當迴圈正常結束(非break等原因)時才會執行 > <font color="#00CC00">找最小因數</font> ``` number = int(input()) i = 2 while number > i: if number%i == 0: print('找到最小因數',i) break #找到最小因數就退出迴圈 else: i += 1 else: print('找不到因數') ``` ### break #### <font color="#FF2D2D">break 跳出迴圈</font> 語法如下: while 或是 for:   break > <font color="#00CC00">找最小因數</font> ``` number = int(input()) for i in range(2,number): if number%i == 0: print('找到最小因數',i) break #找到最小因數就退出迴圈 else: print('找不到因數') ``` ### 巢狀迴圈 #### <font color="#FF2D2D">迴圈堆疊</font> for <<font color="#2CBFE0 ">局域變數名稱1</font>> in <<font color="#2CBFE0 ">字串或列表或range</font>>:   for <<font color="#2CBFE0 ">局域變數名稱</font>> in <<font color="#2CBFE0 ">字串或列表或range</font>>:     <<font color="#2CBFE0 ">function</font>> 不囉嗦直接上範例 > <font color="#00CC00">168_又見沙漏</font> > 題目敘述 > 就是要沙漏圖形... > 輸入說明 > 一個正整數0<n<20 > 輸出說明 > 請參考輸出範例 > 輸入範例1 > 4 > 輸出範例1 > @@@@@@@ >  @@@@@ >   @@@ >    @ >    @ >   @@@ >  @@@@@ > @@@@@@@ ``` n = int(input()) for i in range(n): for q in range(i): print(' ',end = '') for j in range(2*n-1-i*2): print('@',end = '') print() for i in range(n): for j in range(n-1-i): print(' ',end = '') for q in range(2*i+1): print('@',end= '') print() ``` ## 陣列List ### 一維list #### <font color="#FF2D2D">一維list宣告及基本用法</font> 宣告語法如下: <<font color="#2CBFE0 ">陣列名稱</font>> = [<<font color="#2CBFE0 ">物件1</font>>,<<font color="#2CBFE0 ">物件2</font>>,...] 較酷的宣告法: <<font color="#2CBFE0 ">陣列名稱</font>> = [<<font color="#2CBFE0 ">物件</font>>]*<<font color="#2CBFE0 ">數量</font>> <<font color="#2CBFE0 ">陣列名稱</font>> = [<<font color="#2CBFE0 ">局域變數</font>> for <<font color="#2CBFE0 ">局域變數</font>> in range(<<font color="#2CBFE0 ">整數變數</font>>)] <<font color="#2CBFE0 ">陣列名稱</font>> = [<<font color="#2CBFE0 ">局域變數</font>> for <<font color="#2CBFE0 ">局域變數</font>> in range(<<font color="#2CBFE0 ">整數變數</font>>) if <<font color="#2CBFE0 ">關係判斷</font>>] > <font color="#00CC00">即興範例</font> ``` array1 = [1,2,3,4,5,6] array2 = [a for a in range(1,7)] array3 = [a for a in range(10) if a <=6 and a>0] print('{0} = {1} = {2}'.format(array1,array2,array3)) #三個list的值是一樣的 ``` #### <font color="#FF2D2D">list相關重要函式</font> len(<<font color="#2CBFE0 ">list</font>>)  <font color="#8F8F8F">#返回List長度</font> list(<<font color="#2CBFE0 ">str</font>>)   <font color="#8F8F8F">#將<str>轉成list</font> <<font color="#2CBFE0 ">list</font>>.clear()  <font color="#8F8F8F">#清空list</font> <<font color="#2CBFE0 ">list</font>>.append(<<font color="#2CBFE0 ">物件</font>>)   <font color="#8F8F8F">#將<物件>加入list尾端</font> <<font color="#2CBFE0 ">list1</font>>.extend(<<font color="#2CBFE0 ">list2</font>>)   <font color="#8F8F8F"> #將<list2>合併至<List1>尾端</font> <<font color="#2CBFE0 ">list</font>>.remove(<<font color="#2CBFE0 ">物件</font>>)   <font color="#8F8F8F">#移除<list>中<obj>元素</font> <<font color="#2CBFE0 ">list</font>>.insert(<<font color="#2CBFE0 ">位置</font>>,<<font color="#2CBFE0 ">物件</font>>) <font color="#8F8F8F">#將\<obj\>加到\<List\>的索引值\<i\>位置\<list\>中\<obj\>元素</font> 詳細及更多內容請參閱<a href="https://letranger.github.io/PythonCourse/PythonBasic.html#org1764abb" target="_blank">Python教材PDF</a><br /> ### 二維list 宣告語法如下: <<font color="#2CBFE0 ">陣列名稱</font>> = [[<<font color="#2CBFE0 ">物件</font>>]*<<font color="#2CBFE0 ">行數</font>> for _ in range(<<font color="#2CBFE0 ">列數</font>>)] > <font color="#00CC00">即興範例</font> ``` arr1 = [[0]*5 for _ in range(3)] #3*5二維陣列 5行3列 print(arr1) ``` > <font color="#00CC00">7G_Drunk_cockroach.py</font> > 程式要求說明 > 403教室裡住著一隻蟑螂,某日,403常駐工友將這隻蟑螂灌醉,然後隨意丟到地板讓它亂走 > (敘述省略) > 請列出在蟑螂非志願飛出窗外後,所有地板被踩次數旳總和 ``` m,n = map(int,input().split()) floor = [[0]*n for i in range(m)] #n行m列 y,x = map(int,input().split()) floor[y][x] = 1 command = list(map(int,input().split())) stop = False for i in range(len(command)): <主程式省略> step = 0 for i in range(m): step += sum(floor[i]) print(step) ``` ## 版主典藏好用代碼 ### 資料分析 #### numpy ``` import numpy numpy.std(list) #標準差 numpy.sum(list) #總和 numpy.average(list) #平均 ``` ### 一行解/快速寫法系列 #### 宣告時利用if ``` grade = [10,30,50,40,70,80,60,40,20,10] Pass = [i for i in grade if i >= 60] #只抓條件內的元素作為新陣列 print(Pass) ``` #### <font color="#FF2D2D">map映射</font> map會把後方序列的每一個元素調用function,並映射到指定的列表中 語法如下: <<font color="#2CBFE0 ">a,b,c...</font>> = map(<<font color="#2CBFE0 ">function</font>>,<<font color="#2CBFE0 ">變數1</font>>,<<font color="#2CBFE0 ">變數2</font>>,...) ``` a,b,c = map(int,input().split()) #單行空格輸入的方法 grade = list(map(int,input().split())) #把input個別轉換成int後做成list丟給grade ``` #### 邪門lambda 極簡主義者 有時連自己都讀不懂 沒事不要用 <font size=2><font color="#8F8F8F">#某知名籃球社免修電神對lambda的評價</font></font> ![](https://i.imgur.com/We5j5Dn.png =50%x) > <font color="#00CC00">輸入輸出總和一行解</font> ``` (lambda array:print(sum(array)))(list(map(int,input().split()))) ``` > <font color="#00CC00">輸入輸出平方和一行解</font> ``` print(sum(list(map(lambda num:num**2,list(map(int,(input().split()))))))) ``` > <font color="#00CC00">輸入輸出標準差無numpy一行解</font> > <font color="#8F8F8F">(籃球社電神提供)</font> ``` print((lambda x:'{0:0.3f}'.format((sum(map(lambda y:y**2,x))/len(x)-(sum(x)/len(x))**2)**(1/2)))(list(map(int,input().split())))) ``` ### 方便類 #### sort 同時sort又翻轉 ``` grade = [10,40,50,30,20,60,90] grade.sort() #排列(由小到大) print(grade) grade = [10,40,50,30,20,60,90] grade.sort(reverse = True) #同時排列和反轉(最後為由大到小) print(grade) ``` #### 嗚嗚嗚我要print我的陣列可是我又不想print出中括號但是要用迴圈去走訪好麻煩嗚嗚嗚 list前面加一個\*號就好了 <font size="1"><font color="#FF2D2D">#就個人經驗,某些評分系統裡可能會失效(WA),這時候別be panic然後乖乖做走訪</font></font> ``` array = [1,2,3,4,5,6] print(*array) #print list without [] ```