---
# System prepended metadata

title: 期末Python秘訣
tags: [Code]

---

---
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


