--- title: 期末Python秘訣 tags: Code description: Abs --- ![](https://hackmd.io/_uploads/rJEbQy3Dn.png) 第一題 --- 題目:1 請使用遞迴解法來計算階乘的值(n!=1 x 2 x 3 x... x (n-1) x n)。 同時將 1 ~ 25 的階乘結果寫入檔案中: fac.txt。 ```python= def fac(n): if n ==1 or n==0: return n else: return(n*fac(n-1)) file = open("fac.txt","w") for i in range(1,26): content =("%2d" % i + f"! = {fac(i)}\n") file.write(content) ``` <br> 第二題 --- 請查詢111年度的"國民中學校別資料"。 1) 先下載 111學年國民中學校別資料(csv file)。 2) 接著讀取在1)中下載的檔案,最後統計並列出"台北市各區"各有多少個國民中學? 先觀察列印出來的資料 ```python import csv csvFile = open('111_basej.csv') reader = csvFile.readlines() for i in reader: print(i) ###output 21,臺南市,安南區,213520,市立海佃國中,7,8,11,102,87,114,110,163,149,146,174,16,44,2,7 21,臺南市,安南區,213521,市立九份子國中(小),3,4,0,39,38,45,58,0,0,0,0,5,13,2,5 30,臺北市,松山區,311401,私立育達高中附設國中部,1,1,0,5,0,2,1,0,0,0,0,0,0,0,0 30,臺北市,松山區,313301,市立西松高中附設國中部,2,2,2,33,28,34,23,32,27,29,31,0,0,0,0 30,臺北市,松山區,313302,市立中崙高中附設國中部,7,7,7,81,71,81,87,92,88,84,100,0,0,0,0 30,臺北市,松山區,313501,市立介壽國中,21,21,21,313,297,311,300,327,315,326,275,42,124,2,21 ``` 用for圈去跑每一遍csv可以發現只要第一個號碼是30就是台北市 所以用split(',')拆解只要第一個數字是30 我們計數就+1 ```python= import csv csvFile = open('111_basej.csv') reader = csvFile.readlines() count =0 for i in reader: arr = i.split(",") if(arr[0]=="30"): count+=1 print(count) ###output 90 ``` 第三題 --- 請建立全國各大學的網頁連結,除連結外並請列出每個學校的地址與電話。 以關鍵字"111學年各級學校名錄及異動一覽表",中的 "大專校院"(csv)資料來進行查詢。 例如, 國立臺北科技大學 臺北市大安區忠孝東路三段1號-(02)2771-2171。 其中,上面是連結顯示的文字,代表著真實的首頁網址連結,下面則是該學校的地址與電話。 (* 網頁連結的寫法參考: ###<a href="http://www.ntut.edu.tw" target=_blank>國立臺北科技大學</a> 臺北市大安區忠孝東路三段1號-(02)2771-2171。) 先觀察列印出來的資料 ```python= import csv csvFile = open('u1_new.csv') reader = csvFile.readlines() for i in reader: print(i) -------------------------------------------- 1292,新生醫護管理專科學校,私立,[03]桃園市,[325]桃園市龍潭區中豐路高平段418號,(03)4117578,http://www.web.hsc.edu.tw/bin/home.php,[2]技職 1293,崇仁醫護管理專科學校,私立,[10]嘉義縣,[622]嘉義縣大林鎮湖北里大湖1之10號,(05)2658880,http://www.cjc.edu.tw,[2]技職 3002,臺北市立大學,公立,[35]臺北市,[100]臺北市中正區愛國西路1號,(02)23113040,http://www.uTaipei.edu.tw,[1]一般 ``` 用split(',')拆解然後拼成他要的格式 ```python= import csv csvFile = open('u1_new.csv') reader = csvFile.readlines() for i in reader: arr = i.split(',') print(f"<a href=\"{arr[6]}\" target=_blank>{arr[1]}</a>{arr[4][5:]}-{arr[5]}") ###output <a href="http://www.nccu.edu.tw" target=_blank>國立政治大學</a>臺北市文山區指南路二段64號-(02)29393091 <a href="http://www.nthu.edu.tw" target=_blank>國立清華大學</a>新竹市東區光復路二段101號-(03)5715131 <a href="http://www.ntu.edu.tw" target=_blank>國立臺灣大學</a>臺北市大安區羅斯福路四段1號-(02)33663366 <a href="http://www.ntnu.edu.tw" target=_blank>國立臺灣師範大學</a>臺北市大安區和平東路一段162號-(02)77491111 <a href="http://www.ncku.edu.tw" target=_blank>國立成功大學</a>臺南市東區大學路1號-(06)2757575 <a href="http://www.nchu.edu.tw" target=_blank>國立中興大學</a>臺中市南區興大路145號-(04)22873181 <a href="http://www.nycu.edu.tw" target=_blank>國立陽明交通大學</a>新竹市東區大學路1001號-(03)5712121 ``` 第四題 --- 請對上述手機號碼資訊進行拆解,最後再以 0930 654-321 的格式,將所有手機電話號碼列印出來。 phones = "0930654321, 0924-135-246, 0922 132456, 0938 258-369, 0933 " ```python= import re msg = "0930654321, 0924-135-246 , 0922 132456, 0938 258-369, 0933 " items = re.findall("(\d{4}).?.?(\d{3}).?(\d{3})", msg) ### group()的括號內填入組別,來取得指定的比對資料。 下方例子,我們把規則分成三組 \d代表整數 我們將電話號碼分組,區碼4碼數字- 3碼數字 – 3碼數字 分出了三組。 "(\d{4})(\d{3})(\d{3})" 但是電話號碼中間可能會有其他符號 .? 代表可以有其他符號出現 例如 0938 258"-"369 "(\d{4}).?(\d{3}).?(\d{3})" 這樣輸出會少了 0922" "132456 因為他是兩個空格 "(\d{4}).?.?(\d{3}).?(\d{3})" 改成這樣再用for迴圈即可輸出 0930-654-321 0924-135-246 0922-132-456 0938-258-369 ## 0933不是電話號碼可不用輸出 ### for phones in items: print(f"{phones[0]}-{phones[1]}-{phones[2]}") ``` 第五題 --- 請下載 names-10000.txt,接著請對這1萬個名字進行拆解,最後請顯示姓"張"的成員共有多少人? (*建議使用 dict 來存各個姓氏的人數。) ```python= file = open('names-10000.txt',"r") reader =file.readlines() arr = reader[0].split(', ') #高宛玲, 吳佳修, 陳家瑋, 許美君, 用split(', ')做隔開 dict={} for i in (arr): name =i[:1] #只取姓氏 if dict.get(name,"none")=="none": # 有dict[name]會回傳 vaule值 否則回傳"none" dict[name] =1 #建立字典 數量為1 else: dict[name] +=1 # 如果已經有了 count+1 print(dict['張']) #印出dict['張'] 的vaule值(幾個姓張的) ##output 620 ``` <br> --- ### 裝飾器 https://ithelp.ithome.com.tw/articles/10200763 ### lambda sort排序 https://ithelp.ithome.com.tw/articles/10218710 ### yield return 差別 https://ithelp.ithome.com.tw/articles/10258195