本教材有錄製教學影片,可從底下網址連結。
> https://w3.uch.edu.tw/vipent/python
# 第1章 Python開發環境
Python官方網站 + IDLE
Anaconda + Spyder
Anaconda + Jupyter Notebook
Google Colab
## 1-1 IDLE
Python官方網站:https://www.python.org/

### 執行安裝程式
python-3.13.1.exe
Python 3.13.1 - Dec. 3, 2024
安裝後
IDLE (Python 3.13 64-bit) 交談式開發環境
Python 3.13(64-bit) 命令視窗
Python 3.13 Manuals(64-bit) 使用手冊
Python 3.13 Module Docs(64-bit) 模組文件
### 使用IDLE
(1)開新檔案並執行
(2)開啟舊檔
備註1:Python的副檔名是 .py
備註2:IDLE Shell 3.13是交談式開發環境,可執行簡單命令,並非撰寫、儲存程式碼的地方。要點選File才是開新檔案或開啟舊檔。

備註3:執行結果會顯示在IDLE Shell 3.13。

### 練習1-1 First.py
``` python=
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
print("Welcome to Python")
print("This is my first program")
print("Python is fun")
```
### 註解
1. 單行註解:\# 後面的文字不會被執行,是作為單行註解。
2. 多行註解:前面、後面各放"""(三個雙引號)或'''(三個單引號)
### 數學計算
在python中,可直接使用四則運算(+ - * /)
print( 2 + 3 * 4 )
另外,試看看
print(" 2 + 3 * 4 ")會顯示什麼呢?
### 作業1-1
請寫一個python,執行後產出
Hello, I love Python.
Python is useful.
## 1-2 Spyder
Anaconda官網:https://www.anaconda.com/
安裝完Anaconda,可使用Spyder或Jupyter Notebook。
### 使用Spyder
(1)開新檔案並執行
(2)開啟舊檔

## 1-3 Jupyter Notebook
### 使用Jupyter Notebook
執行Jupyter Notebook,將會開啟瀏覽器來做後續執行。
(1)開新檔案並執行
(2)開啟舊檔
備註1:Jupyter Notebook所產出的檔案副檔名為 .ipynb。

備註2:每個單元格(cell)有3種選項。
1. Code:編寫程式碼
2. Markdown:文本編輯
3. Raw NBConvert:純文字

## 1-4 Google Colab
Google Colab
https://colab.research.google.com/
Colab (全名為「Colaboratory」) 可讓你在瀏覽器中編寫及執行 python 程式碼,並具有以下優點:
(1)不必進行任何設定
(2)免付費使用 GPU
(3)輕鬆共用
Colab 是由 Google 在雲端運行並託管的 Jupyter Notebooks 環境,不需要設定就可以使用。透過瀏覽器編寫並執行 Python 程式碼,並將檔案直接存在 Google 雲端硬碟。
| 名稱 | Jupyter Notebook | Colab |
| --- | ---- | --- |
| 程式碼 | Code | 程式碼 |
| 文字 | Markdown<br>Raw NBConvert | 文字 |
| 檔案位置 | 本機 | 雲端 |
### 使用Google Colab
(1)開新檔案並執行
(2)開啟舊檔

# 第2章 輸出與輸入
## 2-1 輸出print
### print
print是輸出函數。
用雙引號 "abc" 包起來的稱為字串。(ps.用單引號包起來也是一樣的)
print("abc") 和 print('abc') 都是顯示abc。
錯誤的寫法 print(abc),會出現<font color="#f00">NameError</font>。
abc會被視為變數,但是目前變數並沒有被定義。
### 變數
將字串或數值儲存在變數。
字串
a="uch"
print(a)
執行結果會得到 uch
數值
a=100
print(a)
執行結果會得到 100
a=15
b=10
print(a+b)
執行結果會得到 25,此為數字相加。
a="15"
b="10"
print(a+b)
執行結果會得到 1510,此為字串相加。
注意:字串和數字是不能相加的。
以下是錯誤寫法,會出現<font color="#f00">TypeError</font>。
a=15
b="10"
print(a+b)
可修改成print(str(a)+b) 或是 print(a+int(b))
### 其他賦值方式
多重賦值
a,b=15,10
print(a+b)
增量賦值
a=10
a += 1 相當於 a = a+1
print(a)
### 轉換型態
a=15 為數值型態
str(a) 為字串型態
b="10" 為字串型態
int(b)為整數型態、float(b)為浮點數型態
使用type可以知道目前型態為何
type(a)
type(str(a))
### 練習2-1 字串格式化
``` python=
# 輸出結果 張無忌18歲
# 方法1 (字串)
print("張無忌18歲")
# 以下先設定好兩個變數
name="張無忌"
age=18
# 方法2 (使用3個項目)
print(name, age, "歲")
# 方法3 (使用+將字串結合)
print(name+str(age)+"歲")
# 方法4 (%字串格式化 )
print("%s%d歲" %(name,age))
# 方法5 (format字串格式化)
print("{}{}歲" .format(name,age))
# 方法6 (f-String)
print(f"{name}{age}歲")
```
### 作業2-1
將日期2025-01-01設為變數date,組員姓名設為變數name,健行行銷系設為變數dep
日期:2025-01-01
組員:張無忌、令狐沖
我們讀健行行銷系
我們喜歡Python
### 關鍵字參數
sep=分隔字元:印多個項目,項目之間以分隔字元隔開。
end=結束字元:列印完畢時,加入結尾處。
``` python=
print("健","行","科","技","大","學",sep="&",end=".")
```
### 長字串
``` python=
print("""這是個長字串
前後用三個雙引號(或三個單引號)包住
可以任意換行
""")
# 先設定變數
msg = """這是個長字串
前後用三個雙引號(或三個單引號)包住
可以任意換行
"""
print(msg)
```
### 變數命名原則
1. 變數名稱只能由大小寫英文、數字、_、中文所組成。(建議避免使用中文)
2. 變數名稱的開頭不能是數字。
3. 英文字母大小寫視為不同變數名稱。
4. 變數名稱不能與Python保留字相同。
錯誤的變數命名,會出現<font color="#f00">SyntaxError</font>,例如
1. 7_11,開頭是數字。
2. H&M,不能有特殊符號 &。
3. for,為保留字。
### 資料型態
| 名稱 | type | 範例 |
| --- | ---- | --- |
| 字串 | str | "uch" |
| 整數 | int | 10 |
| 浮點數 | float | 3.14 |
| 布林值 | bool | True, False |
## 2-2 輸入input
### input
input是輸入函數。
### 練習2-2
``` python=
name = input("請輸入姓名:")
age = input("請輸入年齡:")
print(f"{name}{age}歲" )
```
### 練習2-3
``` python=
chinese = int(input("請輸入中文成績:"))
math = int(input("請輸入數學成績:"))
total = chinese + math
print(f"總成績為{total}")
```
### 作業2-2 BMI
設計BMI計算程式,使用者輸入姓名、身高、體重。
BMI = 體重(kg) / 身高(m)^2
請輸入您的姓名:王小明
請輸入您的身高(cm):183
請輸入您的體重(kg) :78
王小明您好
您的身高183公分,體重78公斤,BMI值為23.29
## 2-3 運算子
### 算術運算子
| 運算子 | 作用 | 範例 | 範例結果 |
| --- | ---- | --- | --- |
| + | 加法 | 5+2 | 7|
| - | 減法 | 5-2 | 3|
| * | 乘法 | 5\*2 | 10|
| / | 除法 | 5/2 | 2.5|
| // | 除法取商數 | 5//2 | 2|
| % | 除法取餘數 | 5%2 | 1|
| ** | 次法 | 5\*\*2 | 25|
### 比較運算子
| 運算子 | 作用 | 範例 | 範例結果 |
| --- | ---- | --- | --- |
| == | 是否相等 | 5==2 | False|
| != | 是否不相等 | 5!=2 | True|
| > | 是否大於 | 5>2 | True|
| >= | 是否大於或等於 | 5>=2 | True|
| < | 是否小於 | 5<2 | False|
| <= | 是否小於或等於 | 5<=2 | False|
### 邏輯運算子
| 運算子 | 作用 | 範例 | 範例結果 |
| --- | ---- | --- | --- |
| not | 否定 | not(5==2) | True|
| and | 且 | (5>3) and (7==4+2) | False|
| or | 或 | (5>3) or (7==4+2) | True|
備註
1. not(True)=False, not(False)=True。
2. 當A,B都是True,則(A and B)為True;其他情形為False。
2. 當A,B都是False,則(A or B)為False;其他情形為True。
# 第3章 判斷式
## 3-1 單向判斷式
if 條件式:
    程式區塊
注意:縮排統一空4格。
### 練習3-1
``` python=
pw = input("請輸入密碼(提示:一種動物,3個字母):")
if pw == "pig":
print("歡迎光臨")
```
## 3-2 雙向判斷式
if 條件式:
    程式區塊1
else:
    程式區塊2
### 練習3-2
``` python=
pw = input("請輸入密碼(提示:一種動物,3個字母):")
if pw == "pig":
print("歡迎光臨")
else:
print("密碼錯誤")
```
### 作業3-1
讓使用者依序輸入兩個整數,顯示出最大值。
請輸入第1個整數:50
請輸入第2個整數:90
最大值為:90
## 3-3 多向判斷式
if 條件式:
    程式區塊1
elif 條件式:
    程式區塊2
else:
    程式區塊3
### 練習3-3
``` python=
age = int(input("請輸入您的年齡:"))
if 0 < age < 13:
print("兒童票")
elif 13 <= age < 19:
print("青年票")
elif 19 <= age < 60:
print("全票")
else:
print("敬老票")
```
### 作業3-2
讓使用者輸入分數(0\~100的整數),顯示出等級。
90以上為優等,80\~89為甲等,70\~79為乙等,其他為丙等。
請輸入分數:85
等級:甲等
## 3-4 巢狀判斷式
判斷式裡面又有判斷式,要注意縮排。
### 練習3-4
讓使用者依序輸入三個整數,顯示出最大值。
請輸入第1個整數:50
請輸入第2個整數:90
請輸入第3個整數:70
最大值為:90
``` python=
a = int(input("請輸入第1個整數:"))
b = int(input("請輸入第2個整數:"))
c = int(input("請輸入第3個整數:"))
if a > b:
if a > c:
print(f"最大值為:{a}")
else:
print(f"最大值為:{c}")
else:
if b > c:
print(f"最大值為:{b}")
else:
print(f"最大值為:{c}")
```
# 第4章 迴圈
## 4-1 for迴圈
### range函式
range(整數值)
range(5) 內容為0,1,2,3,4
range(起始值,終止值)
range(1,5) 內容為1,2,3,4
range(起始值,終止值,間隔值)
range(1,5,2) 內容為1,3
### for 迴圈
for 變數 in 可迭帶的物件:
    程式區塊
可迭帶的物件包含:字串、串列、字典等。
``` python=
for n in range(5):
print(n, end=",")
```
``` python=
for n in range(1,10,2):
print(n, end=",")
```
``` python=
for n in "morning":
print(n, end=",")
```
### 練習4-1
輸入一個正整數,會計算出從1到該正整數的總和。
請輸入正整數:5
1到5的整數和為 15
``` python=
n = int(input("請輸入正整數:"))
sum=0
for i in range(1,n+1):
sum += i
print(f"1到{n}的整數和為{sum}")
```
### 練習4-2 九九乘法表
``` python=
for i in range(1,10):
for j in range(1,10):
print(f"{i}*{j}={i*j:2d}", end=" ")
print()
```
### break
break:強制結束迴圈。
``` python=
for word in "management":
if word == "a":
break
print(word)
```
### continue
continue:強制結束本次迴圈,進入下一次迴圈。
``` python=
for word in "management":
if word == "a":
continue
print(word)
```
### 作業4-1
輸入一個正奇數,會列出1到該正奇數的所有奇數,並計算這些奇數的總和。
請輸入正奇數:9
1到9的奇數有 1 3 5 7 9
總和為 25
## 4-2 while迴圈
### while迴圈
while 條件式:
    程式區塊
條件式如果為真True,則執行程式區塊,並進入下一次迴圈;
條件式如果為假False,則結束迴圈。
備註:要注意不要寫出無窮迴圈,若出現疑似無窮迴圈,程式執行不完,可按Ctrl+C來強制結束程式。
### 練習4-3 3n+1猜想
``` python=
n = int(input("請輸入一個大於1的正整數:"))
while n > 1:
if n%2 == 0:
n = int(n/2)
else:
n = 3*n+1
print(n)
```
### 練習4-4
``` python=
while True:
pw = input("請輸入密碼(提示:一種動物,3個字母):")
if pw == "pig":
print("歡迎光臨")
break
else:
print("密碼錯誤")
```
### 作業4-2
將練習題4-4,修改成至多只能輸入密碼3次。
# 第5章 容器
常見的容器有下列4種。
串列list [1,2,3,4] 有索引值,可修改內容。
元組tuple (1,2,3,4) 有索引值,不可修改內容。
集合set {1,2,3,4} 沒有重複的元素,可修改內容。
字典dict {"a":1,"b":2,"c":3,"d":4} 沒有重複的鍵(key),可修改內容。
## 5-1 串列list
### 串列宣告
``` python=
A=[1,2,3]
B=["行銷", "資管", "企管"]
C=["行銷", 20, "企管"]
D=[] # 空串列
E=[["行銷",2],["企管",5],["資管", 10]]
```
第一個位置的索引值為0,之後依序加1。
``` python=
print(E[0])
print(E[1][1])
```
### 串列搜尋
B=["行銷", "資管", "企管"]
串列. index(元素值)
B.index("資管")
使用index會回傳第一次找到該元素的索引。
若是串列沒有該元素,則會出現<font color="#f00">ValueError</font>。
### 串列新增元素
A=[1,2,3]
串列. append(元素值)
A.append(4) 新增元素4在最後面。
串列. insert(索引值,元素值)
A.insert(1,5) 新增元素5在索引值1的位置。
### 串列刪除元素
B=["行銷", "資管", "企管"]
串列. remove(元素值)
B. remove("企管")
串列. pop(索引值)
B.pop(0) 刪除索引值0的元素。
B.pop() 刪除最後一個元素。
del 串列[索引值]
del B[1]
### 練習5-1 成績輸入-for
``` python=
N = int(input("請輸入學生人數:"))
names = []
scores = []
for i in range(N):
name = input("請輸入學生姓名:")
names.append(name)
score = int(input("請輸入數學分數:"))
scores.append(score)
for i in range(len(names)):
print(f"{names[i]}的分數為{scores[i]}")
mean = sum(scores) / len(scores)
print(f"班上平均分數為{mean:.2f}")
```
### 練習5-2 成績輸入-while
``` python=
names = []
scores = []
print("請輸入學生姓名、成績,當輸入 -1 時結束")
while True:
name = input("請輸入學生姓名:")
if name == "-1":
break
names.append(name)
score = int(input("請輸入數學分數:"))
scores.append(score)
for i in range(len(names)):
print(f"{names[i]}的分數為{scores[i]}")
mean = sum(scores) / len(scores)
print(f"班上平均分數為{mean:.2f}")
```
### 作業5-1 銷售明細
請輸入當天的銷售明細,包含產品名稱、單價、數量。
當產品名稱輸入-1時,結束輸入,並印出銷售明細,並顯示當天售出的總金額。
## 5-2 元組tuple
### 串列與元組
A = ["a","b","c"] 為串列,可修改內容。
B = (4,5) 為元組,不可修改內容。
串列與元組的轉換
C=tuple(A) 為元組
D=list(B) 為串列
元組有索引值,可使用index
C.index("c")
## 5-3 集合set
### 集合
集合特性:沒有重複的元素,沒有索引值,可修改內容。
A=set() 空集合;B={} 為空字典。
串列與集合的轉換
A=[1,2,3,2,1]
B=set(A)
C=list(B)
### 集合修改
新增
B.add(4)
B.add("uch")
刪除
B.remove(4)
## 5-4 字典dict
### 字典
A={"apple":20, "banana":15, "lemon":10}
{鍵1:值1,鍵2:值2,鍵3:值3}
每個項目當中,用 : 隔開,前面為鍵(key),後面為值(value)。
字典沒有重複的鍵,沒有索引值,可修改內容。
二維串列轉字典
A=[["apple",20], ["banana", 15], ["lemon", 10]]
B=dict(A)
### 字典修改
fruit={} 空字典
新增:
fruit["apple"]=20
fruit["banana"]=15
修改:
fruit["banana"]=10
刪除:
del fruit["banana"]
### 字典取值
fruit["apple"]
fruit["banana"] 如沒有此鍵,則發生<font color="#f00">KeyError</font>。
fruit.get("banana") 如沒有此鍵,則回傳None。
### 練習5-3 水果價錢
``` python=
dict1={}
while True:
key = input("請輸入水果名稱,當輸入 -1 時結束:")
if key == "-1":
break
value = input("請輸入水果單價(元/斤):")
dict1[key]=value
print(dict1)
print("底下將進行查詢")
while True:
key = input("請輸入水果名稱,當輸入 -1 時結束:")
if key == "-1":
break
value = dict1.get(key)
print(f"{key}一斤{value}元")
```
### 字典進階操作
字典的一些方法,keys()、values()、items()。
### 練習5-4
``` python=
dict1 = {"apple":20, "banana":15, "lemon":10}
print(len(dict1)) #字典元素個數
K = dict1.keys() #取得字典所有的鍵
print(K)
V = dict1.values() #取得字典所有的值
print(V)
T = dict1.items() #取得字典所有的(鍵,值)組合
print(T)
```
### 練習5-5
``` python=
dict1 = {"apple":20, "banana":15, "lemon":10}
print("使用keys()方法")
for k in dict1.keys():
v = dict1.get(k)
print(f"{k}一斤{v}元")
print()
print("使用items()方法")
for k, v in dict1.items():
print(f"{k}一斤{v}元")
```
### 作業5-2 英漢字典
請製作英漢字典,輸入英文當key,輸入中文當value。當英文輸入-1時,結束輸入,並印出字典內容。
# 第6章 函式與模組
## 6-1 函式
### 函式
內建函式:如print()、input()。
自訂函式:使用def
引用函式(已安裝模組):使用import
引用函式(未安裝模組):需先使用pip安裝,才可以import。
### 自訂函式
先定義,再使用。
``` python=
def test():
print("您好")
test()
```
def 函式名稱(參數1,參數2)
    程式區塊
    return 回傳值1, 回傳值2
備註
1. 參數可有可無,可1個,也可以多個。
2. 回傳值可有可無,可1個,也可以多個。如沒有回傳值就不寫return。
### 練習6-1-1
``` python=
print("您好")
print("歡迎湯姆光臨健行樂園")
print("祝您有愉快的一天")
print("您好")
print("歡迎大衛光臨健行樂園")
print("祝您有愉快的一天")
print("您好")
print("歡迎瑪莉光臨健行樂園")
print("祝您有愉快的一天")
print("您好")
print("歡迎凱蒂光臨健行樂園")
print("祝您有愉快的一天")
```
### 練習6-1-2
``` python=
names=["湯姆","大衛","瑪莉","凱蒂"]
for name in names:
print("您好")
print(f"歡迎{name}光臨健行樂園")
print("祝您有愉快的一天")
```
### 練習6-1-3
``` python=
def hello(name):
print("您好")
print(f"歡迎{name}光臨健行樂園")
print("祝您有愉快的一天")
names=["湯姆","大衛","瑪莉","凱蒂"]
for name in names:
hello(name)
```
### 練習6-2-1
``` python=
h = int(input("請輸入您的身高(cm):"))
w = int(input("請輸入您的體重(kg):"))
bmi = w / (h /100)**2
print(f"您的BMI值為{bmi:.2f}" )
```
### 練習6-2-2
``` python=
def BMI(h,w):
bmi = w / (h /100)**2
return bmi
h = int(input("請輸入您的身高(cm):"))
w = int(input("請輸入您的體重(kg):"))
print(f"您的BMI值為{BMI(h,w):.2f}" )
```
### 自建模組
將以下內容存成B.py
``` python=
def hello(name):
print("您好")
print(f"歡迎{name}光臨健行樂園")
print("祝您有愉快的一天")
```
開啟新檔,要和B.py放在同一個工作目錄
``` python=
import B
B.hello("Fred")
B.hello("Mary")
```
### 全域與區域
``` python=
def test():
a = 100
b = 200
global e # 宣告為全域變數
e = 500
print(a) # 100,a為區域變數。
print(c) # "lemon",區域找不到c,往上層尋找。
print(d) # NameError,區域與全域都找不到d。
a = "apple"
c = "lemon"
test()
print(a) # "apple",a為全域變數。
print(b) # NameError,全域找不到b。
print(e) # 500,e為全域變數。
```
當區域找不到該變數,則會往上層尋找。
當全域找不到該變數,不會往下層尋找。
## 6-2 模組
### random模組
方法1 import 模組
import random
random.random()
random.randint(1,10)
方法2 import 模組 as 別名
import random as r
r.random()
r.randint(1,10)
方法3 from 模組 import 函式
from random import randint
randint(1,10)
方法4 from 模組 import *
from random import *
random()
randint(1,10)
### 練習6-3 丟骰子
``` python=
import random as r
def dice():
n1 = r.randint(1,6)
n2 = r.randint(1,6)
n3 = r.randint(1,6)
total = n1+n2+n3
print(f"您丟出{n1},{n2},{n3}")
return total
print("總和是",dice())
```
### 練習6-4 猜數字
``` python=
import random as r
num = r.randint(1,10)
k = 0
while True:
ans = int(input("請從1~10猜一個數字:"))
k += 1
if ans == num:
print("恭喜您猜對了")
print(f"您共猜了{k}次")
break
print("猜錯了")
```
### 作業6-1 猜拳
利用random模組,寫一個與電腦猜拳的遊戲。採先獲3勝者為贏家,結束時列出雙方勝場數,並判定最後輸贏。
### 安裝模組-python官方
打開 cmd
cd C:\Users\user\AppData\Local\Programs\Python\Python313\Scripts
pip install 模組名稱
pip install requests
### 安裝模組-Anaconda
打開 cmd
cd C:\Users\user\anaconda3\Scripts
pip install 模組名稱
pip install requests
### 政府資料開放平臺
政府資料開放平臺
https://data.gov.tw/
職災職能復健專責醫院名單
https://data.gov.tw/dataset/44745
### 練習6-5
``` python=
import requests
import csv
# 將網址存放到變數
url = "https://apiservice.mol.gov.tw/OdService/download/A17000000J-030081-SrV"
# 到網路上去抓資料
response = requests.get(url)
# 將資料切割成獨立的每一筆資料
data = response.text.splitlines()
# 將每一筆資料內的每一個欄位資料拆開
rows = list(csv.reader(data))
# 使用for-in迴圈將每一筆資料取出
for row in rows:
print(row)
```
### 亂碼處理
``` python=
# 若印出內容為亂碼,可檢查編碼方式,並指定編碼
print(response.encoding) #查看網頁返回的字符集類型
print(response.apparent_encoding) #自動判斷字符集類型
response.encoding = response.apparent_encoding #通過res.apparent_encoding屬性指定編碼
```
# 第7章 檔案與例外處理
## 7-1 檔案操作
### os模組
``` python=
import os
print(os.getcwd()) # 列出目前工作目錄
os.mkdir("test") # 建立資料夾test
os.rmdir("test") # 刪除資料夾test
os.rename("t1.txt", "t2.txt") # 將t1.txt更名為t2.txt
os.remove("t2.txt") # 刪除檔案t2.txt
```
### txt檔案
建立uch.txt檔案,內容如下,並將檔案放置工作目錄。
```
健行科技大學
Chien Hsin University of Science and Technology
網址:https://www.uch.edu.tw/
地址:桃園市中壢區健行路229號
電話:03-4581196
```
### 練習7-1-1 txt檔案-用for迴圈讀取
``` python=
fn = "uch.txt"
f = open( fn ,"r", encoding="utf-8")
for data in f:
print(data,end="")
f.close()
```
### 練習7-1-2 txt檔案-用read讀取
``` python=
fn = "uch.txt"
f = open( fn ,"r", encoding="utf-8")
data = f.read()
f.close()
print(data)
```
### 練習7-1-3 txt檔案-使用with open
``` python=
fn = "uch.txt"
with open( fn ,"r", encoding="utf-8") as f:
data = f.read()
print(data)
```
### open 與 with open的差異
使用open開啟檔案,就必須使用close關掉檔案。
使用with open,底下敘述必須縮排,當語法結束會自動關閉該檔案。
### 練習7-1-4 txt檔案-使用 readlines
``` python=
fn = "uch.txt"
with open( fn ,"r", encoding="utf-8") as f:
data = f.readlines()
print(data)
```
備註:使用 readlines,會讀取全部內容,回傳為一個串列,每一行會成為串列的一個元素。
### 練習7-2 txt檔案-使用write寫入檔案
``` python=
fn = "uch-w.txt"
content = "I love uch"
with open( fn ,"w", encoding="utf-8") as f:
f.write(content)
```
備註:若原檔案不存在,則會建立檔案。若原檔案存在,則會先清空內容。
### 練習7-3 CSV檔案-讀取與寫入
``` python=
import requests
import csv
# 將網址存放到變數
url = "https://apiservice.mol.gov.tw/OdService/download/A17000000J-030081-SrV"
response = requests.get(url) # 到網路上去抓資料
# 將資料切割成獨立的每一筆資料
data = response.text.splitlines()
# 將每一筆資料內的每一個欄位資料拆開
rows = list(csv.reader(data))
# 使用for-in迴圈刪除不需要的欄位
for row in rows:
del row[2:5]
del row[0]
fn = "職災職能復健專責醫院名單-csv.csv"
with open ( fn ,"w", newline="", encoding="utf-8") as f:
fWriter = csv.writer(f)
for row in rows:
fWriter.writerow(row)
```
### 練習7-4 CSV檔案-讀取與寫入EXCEL
``` python=
import requests
import csv
import openpyxl
# 將網址存放到變數
url = "https://apiservice.mol.gov.tw/OdService/download/A17000000J-030081-SrV"
response = requests.get(url) # 到網路上去抓資料
# 將資料切割成獨立的每一筆資料
data = response.text.splitlines()
# 將每一筆資料內的每一個欄位資料拆開
rows = list(csv.reader(data))
# 建立Excel資料表
wb = openpyxl.Workbook()
wb.active.title = "職災職能復健專責醫院名單"
ws = wb.active
row_index = 1
for row in rows:
ws.cell(column=1, row=row_index, value=row[1])
ws.cell(column=2, row=row_index, value=row[5])
row_index = row_index + 1
wb.save("職災職能復健專責醫院名單-csv.xlsx")
```
### 練習7-5 EXCEL讀取與寫入
``` python=
import openpyxl
wb = openpyxl.load_workbook("py_excel.xlsx")
ws = wb.active
ws.cell(column=3, row=1, value="乘積")
for i in range(2,ws.max_row+1):
n1 = ws.cell(column=1, row=i).value
n2 = ws.cell(column=2, row=i).value
n3 = n1*n2
ws.cell(column=3, row=i, value=n3)
wb.save("py_excel_new.xlsx")
```
### 作業7-1
使用者輸入同學的姓名、成績,最後將資料儲存成Excel檔案。
## 7-2 例外處理
### 例外處理語法
try:
    執行測試的程式區塊
except:
    處理例外情形的程式區塊
else:
    沒有發生例外情形時執行的程式區塊
finally:
    一定會執行的程式區塊
### 練習7-6
``` python=
try:
a=int(input("請輸入第1個整數:"))
b=int(input("請輸入第2個整數:"))
c=a+b
print(f"整數和為{c}")
except:
print("輸入錯誤")
```
通常針對特定錯誤給予特定的處理方式,以下是常見的錯誤。
| 方法 | 說明 |
| ---- | ---- |
| 語法錯誤 | SyntaxError、IndentationError、TabError |
| 名稱錯誤 | NameError |
| 型態錯誤 | TypeError、AttributeError |
| 值錯誤 | ValueError |
| 列表、字典相關 | IndexError、KeyError、LookupError |
| 計算相關 | ZeroDivisionError |
| 模組相關 | ImportError、ModuleNotFoundError |
| 檔案相關 | FileExistsError、FileNotFoundError |
| 文字相關 | UnicodeEncodeError、UnicodeDecodeError |
### 練習7-7
``` python=
try:
a=int(input("請輸入第1個整數:"))
b=int(input("請輸入第2個整數:"))
c=a/b
print(f"{a}除以{b}為{c:.2f}")
except ValueError:
print("請輸入數字")
except ZeroDivisionError:
print("分母不能為0")
```
----------------
# 第8章 視窗程式設計
## 8-1 tkinter
使用tkinter模組,可以寫出視窗版本的程式。
參考網址
https://steam.oxxostudio.tw/category/python/tkinter/start.html
| 方法 | 說明 | 內部功能 |
| ---- | ---- | ---- |
|TK | 建立視窗 | title(標題)、geometry(視窗大小) |
|Lable | 標籤 | config(更改內容) |
|Entry | 輸入框 | get(取得內容)、delete(刪除內容) |
|Button | 按鈕 |
### 佈局
1. pack() 基本佈局,由上而下
2. grid() 格狀佈局,類似Excel表格
3. place() 位置佈局,由座標決定
### 練習8-1 BMI視窗版
``` python=
import tkinter as tk
def BMI():
name = entry1.get()
height = float(entry2.get())
weight = float(entry3.get())
bmi = weight / (height/100)**2
msg=f"{name}的身高 {height} 公分,體重 {weight} 公斤,BMI值為 {bmi:.2f}"
label4.config(text=msg)
window = tk.Tk()
window.title("計算BMI")
window.geometry("400x300")
label1 = tk.Label(window,text="姓名")
label1.grid(row=0,column=0,padx=10,pady=0)
label2 = tk.Label(window,text="身高(cm)")
label2.grid(row=1,column=0,padx=10,pady=0)
label3 = tk.Label(window,text="體重(kg)")
label3.grid(row=2,column=0,padx=10,pady=0)
label4 = tk.Label(window,text="")
label4.grid(row=4,column=0,columnspan=2,padx=0,pady=20)
entry1 = tk.Entry(window)
entry1.grid(row=0,column=1,padx=20,pady=20)
entry2 = tk.Entry(window)
entry2.grid(row=1,column=1,padx=20,pady=20)
entry3 = tk.Entry(window)
entry3.grid(row=2,column=1,padx=20,pady=20)
button = tk.Button(window,text="計算",command=BMI)
button.grid(row=3,column=1)
window.mainloop()
```
### 作業8-1
製作一個溫度轉換程式視窗版,攝氏與華式可以互相轉換。
(轉換公式:華氏 = 攝氏\*1.8 + 32)