# python
## 簡介
1. Python 語言特性:
1. Python 是一種簡單易學、功能強大的程式語言,具備高效的資料結構、物件導向設計方式、簡潔的語法和動態型別。
2. 其特性包括易於學習、強大的標準庫、開放原始碼、易安裝且具有良好的相容性。
2. Python 的特色:
1. 自然性:語法接近自然語言,易於理解。
2. 易讀性:使用縮排來區分程式區塊。
3. 完整性:內建強大的標準庫與第三方庫。
4. 開放性:開放原始碼,促進快速發展。
5. 易安裝性:大部分作業系統內建 Python 直譯器,Windows 安裝也非常簡單。
6. 相容與嵌入性:與其他語言(如 C/C++)互通,且可嵌入其他程式。
# 環境建置
1. 安裝Visual Studio Code
https://code.visualstudio.com/
1. 在裡面安裝python

2. 在vscode裡面執行

# 基礎
## 1. 資料型態(Data Types)
1. 數值型別(Numerical Types)
int: 整數型態,例如 123
float: 浮點數型態,例如 123.45
bool: 布林型態,值為 True 或 False
範例:
```
age = 25 # int 整數
score = 92.5 # float 浮點數
is_pass = True # bool 布林值(True / False)
```
2. 字串型別(String Type)
str: 使用單引號 ' ', 雙引號 " ", 或三重引號 ''' ''' 包裹文字。
字串具索引順序(從 0 開始),例如:
```python=
x = "Hello, World"
print(x[7]) # 輸出 'W' 空格也是一個字符
```
3. 容器型別(Container Types)
tuple: 序對,有順序但不可變,使用 ( )。
list: 清單,有順序且可變,使用 [ ]。
set: 集合,無順序且不可重複,使用 { }。
dict: 字典,鍵值對形式,使用 {key: value}。
## 2. 檢查資料型態
使用 type() 函數來檢查變數的型態:
```python=python=
x = 123
print(type(x)) # <class 'int'>
```
## 3. print() 函數
1. 基本格式:
```python=
print(value1, value2, ..., sep=' ', end='\n')
```
2. 參數說明:
sep:指定多個值之間的分隔符,預設為空格。
end:輸出結尾,預設為換行符號 \n。
3. 範例:
```python=
print("Hello", "World", sep="@") # 輸出:Hello@World
print("Python", end="!") # 輸出:Python!
```
## 4. 跳脫字元
1. 常見的跳脫字元:
\n:換行
\t:水平定位
\\:印出反斜線
\' 或 \":印出單引號或雙引號
2. 範例:
```python
print("姓名\t年齡\n王小明\t20") # 格式化輸出
```
3. 結果:

## 5. 使用者輸入
1. input() 函數:
1. 用於接收使用者輸入,預設為字串型別。
2. 可以用 int() 或 float() 將輸入轉為數值型態。
2. 範例:
```python=
num1 = int(input("請輸入數字1: "))
num2 = int(input("請輸入數字2: "))
print("兩數相加結果:", num1 + num2)
```
## 6. eval() 函數
1. 將輸入轉為 Python 表達式進行運算,但要小心安全性問題。
2. 範例:
```python=
expr = eval(input("請輸入一個運算式: ")) # 讓使用者輸入運算式,並使用 eval() 計算結果
print("結果是:", expr) # 顯示計算結果
```
## 7.字元與 Unicode 轉換
1. 字元轉成 Unicode 數值的函數:ord()
如:ord('1')、ord('A')、ord('a')
問題:哪個 Unicode 較大?
2. Unicode 數值轉成字元的函數:chr()
如:chr(57)、chr(90)、chr(122)
## 8. 變數與常數
1. 變數:程式中用於暫存資料如數值、字串等,方便隨 時可讀取與變更資料,命名習慣以小寫字母開頭
2. 常數:程式中用於儲存資料,方便隨時讀取使用,但 不會變更其內容,命名習慣都是大寫字母
### 變數與常數:命名規則
1. 第一個字元可以是英文、底線(__)、或中文,其它字元 可以是英文、底線、數字、或中文,英文字母有大小 寫之分
2. 不可是關鍵字,以及內建常數、函數、類別等名稱
3. 建議使用有意義的英文單字,組合字採用駝峰式命名
### 變數與常數:命名規則範例
不合法變數名稱:
1. class
1. 原因: 不能使用關鍵字,class 是 Python的保留關鍵字,用於定義類別。
3. 推薦的變數名稱寫法:
1. className
2. _class
2. my@ID
1. 原因: 不能使用特殊符號 @,變數名稱只能包含字母、數字和底線 _。
2. 推薦的變數名稱寫法:
1. myID
2. _myID
3. 7eleven
1. 原因: 不能以數字開頭,變數名稱必須以字母或底線 _ 開頭。
2. 推薦的變數名稱寫法:
1. sevenEleven
2. _7eleven
4. !myName
1. 原因: 不能使用特殊符號 !,變數名稱只能由字母、數字和底線 _ 組成。
2. 推薦的變數名稱寫法:
1. myName
2. _myName
5. my name
1. 原因: 不能包含空白,變數名稱中不能有空格。
2. 推薦的變數名稱寫法:
1. myName
2. my_name
推薦變數命名規則:
1. 駝峰式命名法(Camel Case):
1. 例: studentID, myHomeAddress
2. 第一個單字以小寫開始,其後的單字首字母大寫。
2. 底線命名法(Snake Case):
1. 例: student_id, my_home_address
2. 單字之間使用底線 _ 連接,全部小寫。
3. 命名應簡潔明瞭:
保持易讀性,避免使用過於簡單或無意義的名稱,如 a, b, temp 等。
## 9. 指定敘述
1. 等號 (=) 稱為指定運算子將等號右邊運算後的結果,存到等號左邊的變數中
2. 等號右邊可放變數,屬於讀取變數內容
3. 等號左邊不可以是運算式,只能單純變數
4. 可連續賦值,如:x=y=z=3
5. 可多重賦值,如:x, y, z=1, 3.5, "hello"
## 10. 標準輸入與輸出
1. 輸入
1. 標準輸入函數:input(),括弧裡面可放字串,用以提示之用, 如 score = input("請輸入成績: '")
2. 讀取進來的值預設為字串,可透過函數:
1. int()轉為整數、
2. float()轉為浮點數、
3. eval()轉為數值
2. 輸出
標準輸出函數:print(),將結果輸出在螢幕上,語法:
print( value, ..., sep=' ', end='\n', file=sys.stdout)
1. value:要印出的值或變數或運算式,若有多個值,中間用逗號分隔
2. sep:選擇性參數,隔開各值間的字串,預設為一個空格
3. end:選擇性參數,印完後要印出的字串,預設為換行
4. file:選擇性參數,設定輸出的裝置,預設為螢幕
# 變數宣告
變數宣告
1. 在 Python 中,第一次使用變數即為其宣告,並自動分配記憶體。
2. 必須先賦值才能使用變數,否則會導致 NameError。
## 垃圾回收機制
1. Python 自動回收不再被使用的物件,以釋放記憶體空間。
2. 當變數指向新的值時,舊的物件會被回收。
# 運算子
1. 算術運算子
加法 +、減法 -、乘法 *、指數運算 **、整數除法 //、模數運算 %。
例如:7 // 2 結果為 3,120 % 7 結果為 1。
2. 比較運算子
等於 ==、不等於 !=、大於 >、小於 <、大於等於 >=、小於等於 <=。
可以鏈式比較,例如:5 < x <= 10。
3. 指定運算子
賦值用 =,例如 x = 10。
支援複合運算子,如 x += 5(等同於 x = x + 5)。
4. 其他運算子
點號 .:存取模組屬性或方法。
小括弧 ():提升優先權、函式呼叫。
中括弧 []:用於 list 或索引操作。
## 數值交換
Python 支援簡單的變數值交換,例如:
```python=
x, y = 10, 20
x, y = y, x
print(x, y) # 結果為 20, 10
```
## 數學相關模組
### 常見可直接使用的數學函數:
1. abs(x) :回傳x的絕對值
2. divmod(x, y) :回傳x除以y的商與餘
3. max(x1, x2, ...) :回傳 x1, x2, ... 中的最大值
4. min(x1, x2, ...) :回傳 x1, x2, ... 中的最小值
5. pow(x, y): 回傳x的y次方,同 x**y
6. round(x [,n]) :將x四捨五入到小數點第n位,預設n=0
### 匯入 math 模組
import math:
1. ceil(x) :無條件進入
2. floor(x) :無條件捨去
3. log(x [,n]) :以n為基底的x對數
4. log10(x) :以10 為基底的x對數
5. exp(x) :回傳e的x次方
6. fabs(x) :回傳x的絕對值
7. gcd(x, y) :回傳x,y 的最大公因數
8. sqrt(x) :回傳x的平方根
數學常數:
1. math.pi: 3.141592653589793
2. math.e: 2.718281828459045
三角函數:
sin()、cos()、tan()、asin()、acos()、atan()...
# Python 字串格式化教學:f-string vs format()
## 方法一:str.format()(Python 2.6+)
✅ 語法:`"文字{}文字{}".format(變數1, 變數2)`
✅ 範例:
```python=
name = "小明"
place = "台中"
print("{}今天去了{}".format(name, place))
```
🔄 輸出:
`小明今天去了台中`
🔧 特色與功能:
1. 可指定位置:`"{1}在{0}工作".format("台北", "小王") # 小王在台北工作`
2. 可指定變數名稱:`"{name}來自{name_place}".format(name="小艾", name_place="高雄")`
## 方法二:f-string(Python 3.6+ 推出)
✅ 語法:`f"文字{變數}文字{表達式}"`
✅ 範例:
```python=
name = "小明"
place = "台中"
print(f"{name}今天去了{place}")
```
🔄 輸出:
`小明今天去了台中`
💡 f-string 也支援表達式與函式!
```
x = 10
y = 5
print(f"總和是:{x + y}") # 總和是:15
print(f"名稱大寫:{name.upper()}") # 名稱大寫:小明 → 小明
```
## 📊 比較總表

# 格式化字符
## 數字對齊與寬度控制
語法: {格式}

範例:
```python=
num = 123
print("{:10d}".format(num)) # 預設右對齊
print("{:>10d}".format(num)) # 強制右對齊
print("{:<10d}".format(num)) # 強制左對齊
print("{:^10d}".format(num)) # 強制置中對齊
```
輸出:
```
123
123
123
123
```
## 小數精度與符號控制
語法: {格式}

```python=
num = 3.14159
print("{:.3f}".format(num)) # 保留 3 位小數
print("{:+.3f}".format(num)) # 保留 3 位小數,帶符號
print("{:.0f}".format(num)) # 不帶小數,四捨五入
```
輸出:
```
3.142
+3.142
3
```
## 補充:更多數值格式選項
1. 格式化的常用符號

2. 對齊方式

```python=
num = 123
print("{:0>10d}".format(num)) # 使用 0 填充,右對齊
print("{:*<10d}".format(num)) # 使用 * 填充,左對齊
print("{:~^10d}".format(num)) # 使用 ~ 填充,置中對齊
```
輸出:
```
0000000123
123*******
~~~123~~~~
```
2. 千分位分隔符
1. 語法:{:,.格式}
2. 在數字中插入千分位逗號。
```python=
num = 1234567.89
print("{:,.2f}".format(num)) # 保留兩位小數,千分位逗號分隔
```
輸出:1,234,567.89
# 判斷式
## if
1. 單向判斷 (if...)
適用於條件成立時執行某段程式碼。
```python=
if a > b:
print("a比較大")
```
2. 雙向判斷 (if...else)
條件成立執行第一段程式碼,否則執行第二段。
```python=
if a > b:
print("a比較大")
else:
print("b等於a或比較大")
```
3. 多向判斷 (if...elif...else)
適用於多條件分支情境。
```python=
if a > b and a > c:
print("a最大")
elif b > a and b > c:
print("b最大")
else:
print("c最大")
```
4. 巢狀判斷
判斷式內部包含另一個判斷式,用於處理複雜條件。
```python=
if a > 0:
if a % 2 == 0:
print("a是正偶數")
else:
print("a是正奇數")
else:
print("a不是正數")
```
### if練習題
1:算術運算
題目:
請撰寫一程式,讓使用者輸入兩個整數 a 和 b,然後輸入一個運算子 (+, -, *, /, //, %, **),最後輸出兩個整數運算的結果。
延伸題:
針對使用者輸入 /, //, % 三個運算子時,若 b 值為 0,則顯示「除數不可為 0」,其他情況正常顯示運算結果。
範例程式碼:
```python=
while True:
# 輸入兩個整數和運算符
a = int(input("輸入第一個整數 a:"))
b = int(input("輸入第二個整數 b:"))
operator = input("輸入運算子(+、-、*、/、//、% 或 **):")
# 判斷運算子並進行運算
if operator == '+':
result = a + b
elif operator == '-':
result = a - b
elif operator == '*':
result = a * b
elif operator == '/':
if b == 0:
result = "除數不可為 0"
else:
result = a / b
elif operator == '//':
if b == 0:
result = "除數不可為 0"
else:
result = a // b
elif operator == '%':
if b == 0:
result = "除數不可為 0"
else:
result = a % b
elif operator == '**':
result = a ** b
else:
result = "無效的運算子"
# 輸出結果
if isinstance(result, str): # 如果結果是錯誤訊息
print(result)
else:
print(f"{a} {operator} {b} = {result}")
# 提示使用者是否要繼續計算
choice = input("是否要繼續計算?(按任意鍵繼續,輸入 'q' 離開):")
if choice.lower() == 'q':
print("程式結束,感謝使用!")
break # 跳出迴圈,結束程式
```
範例輸入與輸出:
輸入範例 1:
```
輸入第一個整數a:3
輸入第二個整數b:8
輸入運算子:*
```
輸出範例 1
```
3 * 8 = 24
```
輸入範例 2:
```
輸入第一個整數a:4
輸入第二個整數b:0
輸入運算子:/
```
輸出範例 2:
```
除數不可為0
```
2. 閏年判斷
題目:請撰寫一程式,讓使用者輸入一個西元年份,然後程式輸出顯示該年份是否為閏年。
閏年的規則:
每4年一閏年
每100年不是閏年
每400年又是閏年
範例程式碼:
```python=
# 輸入年份
year = int(input("請輸入一個西元年年份:"))
# 判斷是否為閏年
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
print(f"{year} 年是閏年")
else:
print(f"{year} 年不是閏年")
```
範例輸入與輸出:
輸入範例 1:
```
請輸入一個西元年年份:2000
```
輸出範例 1:
```
2000 年是閏年
```
輸入範例 2:
```
請輸入一個西元年年份:2100
```
輸出範例 2:
```
2100 年不是閏年
```
## 迴圈 (Loop)
1. for...in 迴圈
適用於遍歷序列(如清單、字串)。
```python=
for i in range(5):
print(i)
```
2. while 迴圈
當條件成立時重複執行。
```python=
count = 0
while count < 5:
print(count)
count += 1
```
3. 巢狀迴圈
迴圈內部包含另一個迴圈。
```python=
for i in range(3):
for j in range(2):
print(f"i={i}, j={j}")
```
4. 控制迴圈流程
1. break:強制結束迴圈。
2. continue:跳過本次迴圈,進入下一次迴圈。
```python=
for i in range(5):
if i == 3:
break
elif i == 2:
continue
print(i)
```
## range() 函式的使用
在 Python 中,range() 函式可以用來生成一個範圍內的數字序列,常用於迴圈結構中(如 for 迴圈)。range() 函式可以接受 1 到 3 個參數,具體取決於使用者的需求。
範例與說明:
range(次數): 當只傳入一個參數時,range() 會從 0 開始,並生成從 0 到該參數減 1 的數字序列。
範例:
```python=
for i in range(5):
print(i)
```
輸出::
```
0
1
2
3
4
```
這代表 range(5) 會生成從 0 到 4 的數字序列。
2. range(起始值, 結束值): 當傳入兩個參數時,range() 會從起始值開始,並生成到結束值減 1 的數字序列。這樣可以指定一個範圍。
範例:
```python=
for i in range(5, 10):
print(i)
```
輸出:
```
5
6
7
8
9
```
這代表 range(5, 10) 會生成從 5 到 9 的數字序列。
3.range(起始值, 結束值, 步長): 當有三個參數時,range() 會按照指定的步長生成數字序列。
範例:
```python=
for i in range(0, 10, 2):
print(i)
```
輸出:
```
0
2
4
6
8
```
在這個例子中,range(0, 10, 2) 會從 0 開始,到 10 減 1,並以 2 為步長生成數字。
### for練習題
1:列印直角三角形
設計說明: 讓使用者輸入一個數字 n,然後列印出 n 層的直角三角形,使用 @ 字元。
範例程式碼:
```python=
# 讓使用者輸入數字 n
n = int(input("請輸入數字:"))
# 列印直角三角形
for i in range(1, n + 1):
print('@' * i)
```
範例輸入:`7`
範例輸出:
```
@
@@
@@@
@@@@
@@@@@
@@@@@@
@@@@@@@
```
2. 列印反直角三角形
設計說明: 讓使用者輸入一個數字 n,然後列印出 n 層的反直角三角形,使用 @ 字元。
範例程式碼:
```python=
# 讓使用者輸入數字 n
n = int(input("請輸入數字:"))
# 列印反直角三角形
for i in range(n, 0, -1):
print('@' * i)
```
範例輸入:`請輸入數字:7`
範例輸出:
```
@@@@@@@
@@@@@@
@@@@@
@@@@
@@@
@@
@
```
列印等腰三角形
設計說明: 讓使用者輸入一個數字 n,然後列印出 n 層的等腰三角形,使用 @ 字元。
範例程式碼:
```python=
# 讓使用者輸入數字 n
n = int(input("請輸入數字:"))
# 列印等腰三角形
for i in range(1, n + 1):
print(' ' * (n - i) + '@' * (2 * i - 1))
```
範例輸入:`請輸入數字:6`
範例輸出:
```
@
@@@
@@@@@
@@@@@@@
@@@@@@@@@
@@@@@@@@@@@
```
4. 列印九九乘法表
設計說明: 讓使用者輸入一個數字 n,然後印出該數字的九九乘法表。
範例程式碼:
```python=
# 讓使用者輸入數字 n
n = int(input("請輸入數字:"))
# 列印九九乘法表
for i in range(1, 10):
print(f"{n} * {i} = {n * i}")
```
範例輸入:`請輸入數字:6`
範例輸出:
```
6 * 1 = 6
6 * 2 = 12
6 * 3 = 18
6 * 4 = 24
6 * 5 = 30
6 * 6 = 36
6 * 7 = 42
6 * 8 = 48
6 * 9 = 54
```
5. 列印兩位數的八進位數字
設計說明: 列印兩位數的八進位數字,每行列印八組數字,中間一個空白。
範例程式碼:
```python=
# 列印兩位數的八進位數字
for i in range(0, 8): # 外層迴圈
for j in range(0, 8): # 內層迴圈
print(f"{i * 8 + j:02d}", end=" ") # 輸出格式化的八進位數字
print() # 換行
```
範例輸出:
```
00 01 02 03 04 05 06 07
10 11 12 13 14 15 16 17
20 21 22 23 24 25 26 27
30 31 32 33 34 35 36 37
40 41 42 43 44 45 46 47
50 51 52 53 54 55 56 57
60 61 62 63 64 65 66 67
70 71 72 73 74 75 76 77
```
6. 列印數字三角形(1~9,間隔一空白)
設計說明: 列印數字三角形,從 1 到 9 開始,並逐行減少一個數字。
範例程式碼:
```python=
# 列印數字三角形
for i in range(1, 10): # 外層迴圈
for j in range(1, 10 - i): # 內層迴圈
print(j, end=" ")
print() # 換行
```
範例輸出:
```
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7
1 2 3 4 5 6
1 2 3 4 5
1 2 3 4
1 2 3
1 2
1
```
7. 列印數字三角形(每行從 1 開始)
設計說明: 每行印出從 1 到數字 n(逐行增加),並且每行減少一個數字。
範例程式碼:
```python=
# 列印數字三角形
for i in range(1, 10): # 外層迴圈
for j in range(1, i + 1): # 內層迴圈
print(j, end=" ")
print() # 換行
```
範例輸出:
```
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8 9
```
8. 列印數字三角形(每行從數字開始)
設計說明: 每行從數字 n 開始,並且逐行減少一個數字,直到 1。
範例程式碼:
```python=
# 列印數字三角形
for i in range(1, 10): # 外層迴圈
for j in range(i, 10): # 內層迴圈
print(j, end=" ")
print() # 換行
```
範例輸出:
```
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9
3 4 5 6 7 8 9
4 5 6 7 8 9
5 6 7 8 9
6 7 8 9
7 8 9
8 9
9
```
9. 列印九九乘法表(整齊排列)
設計說明: 列印九九乘法表,並保持排列整齊,輸出每一個乘法式。
範例程式碼:
```python=
# 列印九九乘法表
for i in range(2, 10): # 外層迴圈
for j in range(1, 10): # 內層迴圈
print(f"{i}*{j}={i*j:2}", end=" ") # 格式化輸出
print() # 換行
```
範例輸出:
```
2*1= 2 3*1= 3 4*1= 4 5*1= 5 6*1= 6 7*1= 7 8*1= 8 9*1= 9
2*2= 4 3*2= 6 4*2= 8 5*2=10 6*2=12 7*2=14 8*2=16 9*2=18
2*3= 6 3*3= 9 4*3=12 5*3=15 6*3=18 7*3=21 8*3=24 9*3=27
2*4= 8 3*4=12 4*4=16 5*4=20 6*4=24 7*4=28 8*4=32 9*4=36
2*5=10 3*5=15 4*5=20 5*5=25 6*5=30 7*5=35 8*5=40 9*5=45
2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 7*6=42 8*6=48 9*6=54
2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 8*7=56 9*7=63
2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 9*8=72
2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
```
10. 盲猜密碼
1. 設計說明:
請撰寫一程式,讓程式產生0~9之間的一個密碼,然後讓使用者不斷猜測,直到猜對為止
2. 範例輸入/輸出:
(左側綠色粗體字代表使用者輸入)
請猜測數字(0~9):7
猜錯,再猜(0~9):5
猜錯,再猜(0~9):2
猜錯,再猜(0~9):8
猜對了,密碼就是8
```python=
import random
# 產生一個隨機密碼(0~9)
password = random.randint(0, 9)
# 開始猜測
while True:
# 提示使用者輸入猜測數字
guess = int(input("請猜測數字(0~9):"))
# 判斷猜測是否正確
if guess == password:
print(f"猜對了,密碼就是{password}")
break # 結束迴圈
else:
print("猜錯,再猜(0~9):")
```
解釋:程式說明
1. 密碼產生:使用 random.randint(0, 9) 隨機生成 0 到 9 的整數作為密碼。
2. 猜測迴圈:
1. 使用 while True 讓程式不斷進行猜測。
2. 每次猜測後,程式會檢查猜測數字是否等於密碼。
3. 若猜對,輸出提示並結束程式;若猜錯,提示重新猜測。
3. 輸入驗證:
1. 使用 int(input(...)) 確保輸入為整數。
2. 沒有特別處理非整數的輸入,如果需要增加容錯,可以加入例外處理。
11. 找出輸入值中的最小值
```python=
print("請輸入數字,直到9999結束")
min_value = float('inf') # 初始設定為無窮大
i = 1
while True:
num = int(input(f"請輸入第{i}個數字:"))
if num == 9999:
break
if num < min_value:
min_value = num
i += 1
print(f"輸入的最小值為{min_value}")
```
12. 找出輸入值中的最大值
```python=
print("請輸入數字,直到9999結束")
max_value = float('-inf') # 初始設定為無窮小
i = 1
while True:
num = int(input(f"請輸入第{i}個數字:"))
if num == 9999:
break
if num > max_value:
max_value = num
i += 1
print(f"輸入的最大值為{max_value}")
```
13. 數字反轉
```python=
print("請輸入數字,直到9999結束")
i = 1
while True:
num = input(f"請輸入第{i}個數字:")
if num == "9999":
break
reversed_num = num[::-1]
print(f"反轉的數字為:{reversed_num}")
i += 1
```
14. 數字加總
```python=
print("請輸入數字,直到9999結束")
i = 1
while True:
num = input(f"請輸入第{i}個數字:")
if num == "9999":
break
total = sum(int(digit) for digit in num)
print(f"數字加總為:{total}")
i += 1
```
15. 倍數的個數與總和
```python=
# 輸入起始與結束值
start = int(input("請輸入起始值:"))
end = int(input("請輸入結束值:"))
multiples = [] # 儲存 7 或 11 的倍數
total_sum = 0 # 儲存總和
# 搜尋範圍內的所有數字
for num in range(start, end + 1):
if num % 7 == 0 or num % 11 == 0:
multiples.append(num)
total_sum += num
# 輸出倍數清單
for i in range(len(multiples)):
print(f"{multiples[i]:<4}", end="")
if (i + 1) % 10 == 0: # 每列印 10 個數字
print()
if len(multiples) % 10 != 0:
print()
# 輸出結果
print(f"總數共有 {len(multiples)} 個")
print(f"數字總和為 {total_sum}")
```
### Python執行邏輯
程式碼會按順序執行,除非遇到以下特殊情況:
1. 判斷式
2. 迴圈
3. 函數
4. 例外處理
## 範例應用
1. 成績判斷
```python=
score = int(input("請輸入分數: "))
if score >= 95:
print("獎金2000元")
elif 90 <= score < 95:
print("獎金1000元")
elif 80 <= score < 90:
print("獎金500元")
else:
print("無獎金")
```
2. BMI計算
```python=
height = float(input("請輸入身高(公分): ")) / 100
weight = float(input("請輸入體重(公斤): "))
bmi = weight / (height ** 2)
print(f"BMI: {bmi:.2f}")
if bmi < 18.5:
print("過輕")
elif 18.5 <= bmi < 24:
print("正常")
elif 24 <= bmi < 27:
print("過重")
elif 27 <= bmi < 30:
print("輕度肥胖")
elif 30 <= bmi < 35:
print("中度肥胖")
else:
print("重度肥胖")
```
3. 簡單計算機
```python=
num1 = float(input("請輸入第一個數字: "))
num2 = float(input("請輸入第二個數字: "))
operation = input("請選擇運算 (+, -, *, /): ")
if operation == '+':
print(f"結果: {num1 + num2}")
elif operation == '-':
print(f"結果: {num1 - num2}")
elif operation == '*':
print(f"結果: {num1 * num2}")
elif operation == '/':
if num2 != 0:
print(f"結果: {num1 / num2}")
else:
print("無法除以零")
else:
print("無效的運算符")
```
# 數字與型態
## 整數類型
1. 基本類型:
1. int: 整數類型,例如:1, -2, 100。
2. bool: 布林值,僅有 True 和 False。
注意:True 和 1 等價,False 和 0 等價。
範例:
```python=
a = 0
print(a + True) # 結果:1
print(a + False) # 結果:0
```
2. 浮點數類型
1. 常見類型:
1. float: 浮點數類型,例如:3.14, -0.01。
2. decimal.Decimal: 高精度浮點運算,用於金融等精度敏感場合。
3. complex: 複數類型,例如:1 + 2j。
2. 精度問題:
由於計算機使用二進位存儲,某些數值(如 0.1)存在存儲誤差。
3. 範例:
```python=
print(0.1 + 0.2) # 結果:0.30000000000000004
```
# 格式化輸出
## 使用 % 運算符
1. 格式符:
1. %d: 以十進位整數輸出。
2. %f: 以浮點數輸出。
3. %s: 將變數轉換為字串輸出。
4. %x: 十六進位輸出。
5. 修飾符:
1. %-: 靠左對齊。
2. %0: 補零。
3. %n.mf: 控制總寬度和小數位數。
2. 範例:
```python=
import math
print("PI = %f" % math.pi) # 結果:PI = 3.141593
print("PI = %8.4f" % math.pi) # 結果:PI = 3.1416
print("PI = %-8.4f" % math.pi) # 結果:PI = 3.1416
```
## 使用 str.format()
1. 格式化方式:
1. {} 占位符,format() 方法填充。
2. {位置} 或 {名稱} 指定填充順序。
3. :.nf 控制小數位數。
2. 範例:
```python=
name = "帳單之門"
age = 99
gender = "male"
print("姓名: {0}".format(name))
print("年齡: {0}".format(age))
print("性別: {0}".format(gender))
```
## 練習題
1:格式化浮點數
題目:
請撰寫一程式,讓使用者輸入一個浮點數,並將其輸出到小數點後 2 位與 4 位。
提示:
使用 f-string 或 str.format() 來格式化浮點數。
範例程式碼:
```python=
# 輸入浮點數
num = float(input("請輸入一個浮點數:"))
# 輸出小數點後 2 位與 4 位
print(f"小數點後 2 位:{num:.2f}")
print(f"小數點後 4 位:{num:.4f}")
```
輸入範例:
請輸入一個浮點數:12.345678
輸出範例:
小數點後 2 位:12.35
小數點後 4 位:12.3457
2. 日期格式化
題目:
請撰寫一程式,讓使用者輸入一個日期,然後輸出該日期的不同格式顯示(如:年-月-日 和 日/月/年)。
提示:
使用 datetime 模組來解析並格式化日期。
範例程式碼:
```python=
from datetime import datetime
# 輸入日期
date_str = input("請輸入日期 (格式:yyyy-mm-dd):")
# 解析日期
date_obj = datetime.strptime(date_str, "%Y-%m-%d")
# 格式化日期
print(f"年-月-日 格式:{date_obj.strftime('%Y-%m-%d')}")
print(f"日/月/年 格式:{date_obj.strftime('%d/%m/%Y')}")
```
輸入範例:
請輸入日期 (格式:yyyy-mm-dd):2024-11-29
輸出範例:
年-月-日 格式:2024-11-29
日/月/年 格式:29/11/2024
3. 列印表格
題目:
請撰寫一程式,列印一個數學表格,顯示從 1 到 5 的數字及其平方和立方。
提示:
使用格式化字串來對齊表格中的數據。
使用 f-string 或 str.format() 可以讓數字對齊。
範例程式碼:
```python=
print(f"{'數字':<6}{'平方':<6}{'立方':<6}")
for i in range(1, 6):
print(f"{i:<6}{i**2:<6}{i**3:<6}")
```
輸出範例:
```
數字 平方 立方
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
```
練習題 4:格式化對齊
題目:
請撰寫一程式,讓使用者輸入姓名與年齡,並輸出一個表格,將姓名右對齊,年齡左對齊。
提示:
使用 f-string 來對齊輸出的文本。
可以使用 <(左對齊)和 >(右對齊)來控制對齊方式。
範例程式碼:
```python=
# 輸入姓名和年齡
name = input("請輸入姓名:")
age = int(input("請輸入年齡:"))
# 格式化輸出
print(f"{'姓名':<10}{'年齡':<10}")
print(f"{name:>10}{age:<10}")
```
輸入範例:
```
請輸入姓名:Alice
請輸入年齡:30
```
輸出範例:
```
姓名 年齡
Alice30
```
5. 百分比格式化
題目:
請撰寫一程式,計算一個數字的百分比,並將其格式化輸出到小數點後 1 位。
提示:
使用 f-string 並將數字乘以 100。
使用 .1f 來輸出到小數點後 1 位。
範例程式碼:
```python=
# 輸入數字
num = float(input("請輸入一個數字:"))
# 計算百分比並格式化輸出
percentage = num * 100
print(f"百分比為:{percentage:.1f}%")
```
輸入範例:
請輸入一個數字:0.763
輸出範例:
百分比為:76.3%
6. 計算平面上兩點的距離
設計說明:
請撰寫一程式,讓使用者輸入平面座標上,A點(x1,y1) 與 B點(x2,y2) 的座標值,並輸出正確的座標顯示與兩點的距離。
提示1:座標距離=√(x1 − x2)² + (y1 – y2)2
提示2:座標距離輸出到小數點後4位
範例程式碼:
```python=
import math
# 輸入 A 點與 B 點的座標
x1, y1 = map(float, input("請輸入 A 點的座標 (x1 y1): ").split())
x2, y2 = map(float, input("請輸入 B 點的座標 (x2 y2): ").split())
# 計算兩點的距離
distance = math.sqrt((x1 - x2)**2 + (y1 - y2)**2)
# 輸出座標與距離
print(f"A點: ({x1:.1f}, {y1:.1f})")
print(f"B點: ({x2:.1f}, {y2:.1f})")
print(f"兩點距離: {distance:.4f}")
```
輸入與輸出範例
輸入:
```
請輸入 A 點的座標 (x1 y1): 3.5 5.5
請輸入 B 點的座標 (x2 y2): 6.5 1.5
```
輸出:
```
A點: (3.5, 5.5)
B點: (6.5, 1.5)
兩點距離: 5.0000
```
解釋:

# 字串操作
## 基本操作
1. 定義字串:
1. 單引號:'string'。
2. 雙引號:"string"。
3. 三引號(多行):'''string'''。
2. 索引與切片:
1. 使用索引訪問字串的特定位置。
2. 切片語法:str[start:end:step]。
3. 範例:
```python=
s = "Hello, World"
print(s[0]) # 結果:H
print(s[-1]) # 結果:d
print(s[0:5]) # 結果:Hello
```
## 字串方法
1. 常用方法:
1. .lower() / .upper():轉換大小寫。
2. .strip():去除首尾空格。
3. .replace(old, new):替換子字串。
4. .split(delimiter):分割字串。
5. .join(iterable):合併序列。
2. 範例:
```python=
s = " Hello, World! "
print(s.strip()) # 結果:Hello, World!
print(s.lower()) # 結果: hello, world!
print(s.replace("World", "Python")) # 結果: Hello, Python!
```
# 型態轉換
## 常用函數
1. 數值轉換:
1. int(x):轉為整數。
2. float(x):轉為浮點數。
2. 容器轉換:
1. list(s):轉為列表。
2. tuple(s):轉為元組。
3. str(x):轉為字串。
3. 範例:
```python=
x = "123"
print(int(x)) # 結果:123
print(float(x)) # 結果:123.0
print(str(123)) # 結果:"123"
```
### 練習題
1. 兩數相加:
```python=
a, b = 5.10, 2.30
print(f"{a:.2f} + {b:.2f} = {a + b:.2f}") # 結果:5.10 + 2.30 = 7.40
```
2. 九九乘法表:
```python=
for i in range(1, 6):
for j in range(1, 9):
print(f"{i}*{j}={i*j:2}", end=" ")
print()
```
# 函式基礎
Python 中的函式(function)是一段可以重複使用的程式碼,用於執行某個特定任務。以下詳細解釋各種函式特性與範例。
1. 定義函式與不傳參數:
1. 函式可以定義一些執行的邏輯,並透過名稱來呼叫它。當不需要傳遞參數時,可以直接定義一個簡單的函式。
2. 語法:
```python=
def 函式名稱():
執行敘述
```
範例:
```python=
def say_hello():
print("Hello, Python!")
# 呼叫函式
say_hello()
```
輸出:Hello, Python!
2. 傳遞參數
1. 函式可以接受參數(parameters)來改變其行為。
2. 語法:
```python=
def 函式名稱(參數1, 參數2):
執行敘述
```
範例:
```python=
def greet(name, age):
print(f"你好, {name}! 你今年 {age} 歲。")
# 呼叫函式
greet("小明", 18)
```
輸出:你好, 小明! 你今年 18 歲。
3. 預設參數值
1. 函式中的參數可以有預設值。如果呼叫函式時未提供對應引數,會自動使用預設值。
2. 語法:
```python=
def 函式名稱(參數1, 參數2=預設值):
執行敘述
```
範例:
```python=
def greet(name, age=20):
print(f"你好, {name}! 你今年 {age} 歲。")
# 呼叫函式(使用預設值)
greet("小明")
# 呼叫函式(覆寫預設值)
greet("小華", 25)
```
輸出:
```
你好, 小明! 你今年 20 歲。
你好, 小華! 你今年 25 歲。
```
4. 回傳值
1. 函式可以使用 return 關鍵字將結果傳回呼叫者。
2. 語法:
```python=
def 函式名稱(參數):
執行敘述
return 回傳值
```
範例:次方函式
```python=
def power(x, y):
return x ** y
# 主程式
base = int(input("請輸入底數數字:"))
exponent = int(input("請輸入次方數字:"))
result = power(base, exponent)
print(f"{base} 的 {exponent} 次方為 {result}")
```
範例輸入:
```
請輸入底數數字:3
請輸入次方數字:4
```
範例輸出:3 的 4 次方為 81
5. 進階範例:開次方根
1. 設計一個函式計算開𝑛次方根的結果。
2. 範例:
```python=
def nroot(x, y):
return x ** (1 / y)
# 主程式
radicand = float(input("請輸入被開方數字:"))
root = float(input("請輸入開方數字:"))
result = nroot(radicand, root)
print(f"{radicand} 的 {root} 次方根為 {result:.3f}")
```
範例輸入:
```
請輸入被開方數字:64
請輸入開方數字:6
```
範例輸出:64 的 6 次方根為 2.000
詳細解釋:
1. 函式結構
1. def 關鍵字定義函式。
2. 函式名稱應該具有描述性。
3. 函式內的程式碼需有一致的縮排。
2. 傳遞參數
1. 位置參數:按順序傳遞給函式。
2. 預設參數值:若不提供引數,使用定義時的預設值。
3. 關鍵字參數:明確指定參數名稱,提高可讀性。
3. 回傳值:函式可以回傳一個值,也可以回傳多個值(以元組形式)。
4. 應用場合:次方運算與開次方根是常見的數學運算,可用於科學計算與資料分析。
# 容器
## Tuple(序對)
在 Python 中,元組 (tuple) 是一種資料結構,類似於列表 (list),但有幾個關鍵的不同點:
1. 不可變性 (Immutability):
元組一旦創建,就無法再改變其內容。與列表不同,元組的元素無法被新增、修改或刪除,只能覆蓋。這使得元組適用於需要保證資料不被修改的場合。
2. 語法與列表區別:元組使用小括弧 () 表示,而列表則使用中括弧 []。
3. 可包含多種資料類型:元組中的元素可以是不同資料型態的,如整數、浮點數、字串等。
### 元組的基本操作
1. 建立元組:
1. 空元組:tuple1 = tuple() 或 tuple1 = ()
2. 有初始值的元組:tuple1 = (1, 2, 3, 4, 5)
3. 可以包含不同型別的資料:tuple1 = (1, "項目1", 5.2, True)
2. 內建函式:
1. len(tuple1):計算元組的長度(項目數)。
2. max(tuple1):返回元組中最大值。
3. min(tuple1):返回元組中最小值。
4. sum(tuple1):返回元組中所有元素的總和。
3. 其他方法:
1. tuple1.count(x):返回元素 x 在元組中出現的次數。
2. tuple1.index(x):返回元素 x 在元組中第一次出現的索引值。
4. 基本操作:
1. 建立:t = ('a', 'b', 'c')
2. 取值:t[0] 或 t[-1] (正序與倒序)
3. 方法:
count(value):計算特定值出現的次數。
index(value[, start[, stop]]):回傳指定值的索引。
5. 元組的修改操作
雖然元組本身不可變,但可以通過建立新的元組來進行“修改”操作。可以將兩個元組進行連接,得到一個新的元組:
```python=
tuple1 = (1, 2, 3)
tuple2 = (4, 5)
tuple1 = tuple1 + tuple2 # 這會創建一個新的元組
```
注意:
1. 元組的元素是不可變的,但元組本身的參考(變數)是可以重新指派的。
2. 元組的元素如果是單一的數字(例如 (6)),則這樣其實不是元組,而是一個數字。如果要讓它成為元組,需要在數字後加上逗號(例如 (6,))。
6. 限制:
1. tuple.count() 無法指定範圍。
2. 不支援如 append、remove 等修改方法。
### 範例:
1.
```python=
t = ('a', 'b', 'mary', 'john', 'a', 'mary', 'a')
print(t.index('a', 1, 5)) # Output: 4
print(t.count('mary')) # Output: 2
```
2. 串列數組轉換
根據你的需求,這是一個將串列轉換為元組的範例,並顯示元組的長度、最大值、最小值和總和。
程式設計說明:
1. 使用者輸入若干個整數,直到輸入 -9999 停止。
2. 不將 -9999 加入串列,並將串列轉換為元組。
3. 輸出該元組的長度、最大值、最小值及總和。
程式碼實現:
```python=
# 建立空的串列
numbers_list = []
# 不斷請使用者輸入數字,直到輸入 -9999
print("請輸入整數(輸入 -9999 結束):")
while True:
try:
num = int(input(f"請輸入第{len(numbers_list) + 1}個數字:"))
if num == -9999: # 停止條件
break
numbers_list.append(num) # 將輸入的數字加入串列
except ValueError:
print("請輸入有效的整數!")
# 將串列轉換為數組 (tuple)
numbers_tuple = tuple(numbers_list)
# 顯示數組及相關資訊
print(f"\n數組內容:{numbers_tuple}")
print(f"長度:{len(numbers_tuple)}")
print(f"最大值:{max(numbers_tuple)}")
print(f"最小值:{min(numbers_tuple)}")
print(f"總和:{sum(numbers_tuple)}")
```
範例輸入:
```
請輸入整數(輸入 -9999 結束):
請輸入第1個數字:6
請輸入第2個數字:-29
請輸入第3個數字:51
請輸入第4個數字:32
請輸入第5個數字:18
請輸入第6個數字:-73
請輸入第7個數字:30
請輸入第8個數字:-9999
```
範例輸出:
```
數組內容:(6, -29, 51, 32, 18, -73, 30)
長度:7
最大值:51
最小值:-73
總和:35
```
程式邏輯詳解:
使用 while True 不斷讓使用者輸入數字,直到輸入 -9999 為止。
輸入的數字會加入到 numbers_list 這個串列中。
使用 tuple() 將串列轉換為元組。
輸出元組的長度、最大值、最小值和總和,分別使用 len()、max()、min() 和 sum() 來取得。
## List(串列)
### 串列基本定義與操作
1. 建立串列
1. 空串列:list1 = list() 或 list1 = []
2. 初始值:list1 = [1, 2, 3, 4, 5]
3. 支援多型態:list1 = [1, "文字", 3.5, True]
2. 取值與索引
1. list1[index]:取單一項目。
2. 負索引:list1[-1] 表示最後一項。
3. 切片操作:list1[start:end],不含 end,可省略 start 或 end。
3.嵌套列表:支援多層結構:如 list1 = [1, [10, 20], 3],使用 list1[1][0] 取得子串列值。
4. 修改內容:直接賦值:list1[2] = "新值"
### 運算與操作
1. 串列運算
1. 合併:list1 + list2
2. 重複:list1 * 3
3. 刪除:del list1[index]
2. 成員測試
1. 是否存在:'a' in list1
2. 比較串列:list1 == list2
3. 內建函式
1. 長度:len(list1)
2. 最大/最小值:max(list1), min(list1)
3. 總和:sum(list1)
常用方法:
1. 新增資料:
1. append(x):在尾端新增一個元素。
2. extend(iterable):將另一可迭代物件展開後加入。
3. insert(index, x):插入元素至指定索引。
2. 刪除資料:
1. remove(value):刪除第一個匹配的值。
2. pop([index]):移除並回傳指定索引的值(預設最後一項)。
3. clear():清空所有元素。
3. 查詢與計數:
1. index(value[, start[, stop]]):查找索引。
2. count(value):計算值的出現次數。
4. 排序與反轉:
1. sort():排序(預設升序,可傳入 reverse=True)。
2. reverse():反轉順序。
5. 複製:copy():回傳一份淺拷貝。
```python=
# 建立與基本操作
lst = [1, 2, 3]
lst.append(4) # [1, 2, 3, 4]
lst.extend([5, 6]) # [1, 2, 3, 4, 5, 6]
lst.insert(2, 10) # [1, 2, 10, 3, 4, 5, 6]
lst.pop() # 移除並回傳最後一項 [1, 2, 10, 3, 4, 5]
# 排序
lst = [3, 1, 2]
lst.sort() # [1, 2, 3]
lst.sort(reverse=True) # [3, 2, 1]
```
3. 應用:倒序與回復 問題:使用 append 和 pop 實現倒序與回復。
```python=
folder = []
for i in range(5, 0, -1):
folder.append(i)
for _ in range(len(folder)):
print(folder.pop())
```
結果:
```python=
5
4
3
2
1
```
## Tuple 與 List 的比較
1. 基本特性
| 特性 | Tuple(元組) | List(列表) |
| -------- | ------------------------------ | ---------------------------------------------- |
| **定義方式** | 使用小括號 `()` | 使用方括號 `[]` |
| **可變性** | 不可變 (**Immutable**) | 可變 (**Mutable**) |
| **元素類型** | 可以包含不同類型的元素 | 可以包含不同類型的元素 |
| **長度** | 長度固定,不能動態增減元素 | 長度可變,可以動態增減元素 |
| **方法** | 僅支援少量方法(如 `count()`、`index()`) | 提供多種操作方法(如 `append()`、`remove()`、`extend()` 等) |
1. Tuple 的性能優勢:
1. Tuple 是不可變的,因此它的實現比 List 更高效,尤其是在需要存儲不變數據的情況下。
2. Tuple 在內存使用上通常比 List 更小,因為它不需要額外的內存用於動態調整大小。
2. List 的靈活性:List 的可變性使其適合需要頻繁修改(增刪改)數據的情境,但這也帶來了稍高的內存和性能成本。
3. 使用場景
| 使用場景 | Tuple(元組) ✅ | List(列表) ✅ |
| ------------ | ---------------- | --------------------------------- |
| **數據不變性要求** | 適合(如座標、日期等不可變資料) | 不適合(因為可修改) |
| **需要頻繁修改數據** | 不適合(無法增刪改) | 適合(支援增刪改,如 `append()`、`remove()`) |
| **作為字典的鍵** | 可以(因為不可變) | 不可以(因為可變) |
| **函數返回多個值** | 常用(例如 `(x, y)`) | 不常用(但可以回傳 List) |
4. 常見操作與差異
Tuple 操作範例
```
# 定義一個 Tuple
t = (1, 2, 3, 4, 5)
# 訪問元素
print(t[0]) # 輸出:1
# 元組長度
print(len(t)) # 輸出:5
# 不可修改
# t[1] = 10 # 會引發錯誤,因為 Tuple 不可變
# 支援解包
a, b, c, d, e = t
print(a, b, c) # 輸出:1 2 3
```
List 操作範例
```
# 定義一個 List
l = [1, 2, 3, 4, 5]
# 訪問與修改元素
print(l[0]) # 輸出:1
l[1] = 10
print(l) # 輸出:[1, 10, 3, 4, 5]
# 添加與刪除元素
l.append(6)
print(l) # 輸出:[1, 10, 3, 4, 5, 6]
l.remove(10)
print(l) # 輸出:[1, 3, 4, 5, 6]
```
5. 總結比較
| 特性 | Tuple(元組) | List(列表) |
| -------- | ---------------- | -------------- |
| **不可變性** | 不可變,適合保存固定數據 | 可變,適合頻繁操作的數據集合 |
| **效能** | 內存使用較少,存取速度較快 | 佔用內存較多,靈活但速度稍慢 |
| **靈活性** | 靈活性較低 | 靈活性較高 |
| **用途建議** | 用於數據不可變的情境或作為字典鍵 | 用於需要頻繁改變數據的場景 |
### 串列練習題
1. 撲克牌總和
```python=
# 建立牌面與點數對應表
card_values = {'A': 1, 'J': 11, 'Q': 12, 'K': 13}
card_values.update({str(i): i for i in range(2, 11)})
# 輸入五張牌面
cards = [input(f"請輸入第{i+1}個牌面:") for i in range(5)]
# 計算總和
total = sum(card_values[card] for card in cards)
print(f"總點數為 {total}")
```
2. 奇數索引數值加總
```python=
# 輸入10個整數
numbers = [int(input(f"請輸入第{i+1}個數字:")) for i in range(10)]
# 計算奇數索引數值加總
odd_index_sum = sum(numbers[i] for i in range(1, len(numbers), 2))
print(f"奇數索引數值總和為:{odd_index_sum}")
```
3. 成績列印
```python=
# 輸入10個成績
scores = [int(input(f"請輸入第{i+1}個成績:")) for i in range(10)]
# 計算最高分、最低分、總和、平均
max_score = max(scores)
min_score = min(scores)
total_score = sum(scores)
average_score = total_score / len(scores)
print(f"最高分為:{max_score}")
print(f"最低分為:{min_score}")
print(f"總和成績為:{total_score}")
print(f"平均成績為:{average_score:.1f}")
```
4. 出現最多次的數字
```python=
# 輸入10個整數
numbers = [int(input(f"請輸入第{i+1}個數字:")) for i in range(10)]
# 計算出現次數最多的數字
most_common = max(numbers, key=numbers.count)
count = numbers.count(most_common)
print(f"{most_common} 出現最多次,共出現 {count} 次")
```
5. 數字排序
```python=
# 輸入10個整數
numbers = [int(input(f"請輸入第{i+1}個數字:")) for i in range(10)]
# 排序
sorted_numbers = sorted(numbers, reverse=True)
# 取出最大與最小的三個數字
largest_three = sorted_numbers[:3]
smallest_three = sorted_numbers[-3:]
print(f"最大三個數:{largest_three}")
print(f"最小三個數:{smallest_three}")
```
6. 大樂透隨機號碼產生程式
```python=
import random
# 隨機選取6個中獎號碼,從1到49中選出,並排序
winning_numbers = sorted(random.sample(range(1, 50), 6))
# 隨機選取特別號,且與中獎號碼不重複
special_number = random.choice([num for num in range(1, 50) if num not in winning_numbers])
# 輸出結果
print(f"樂透中獎號碼:{winning_numbers}")
print(f"特別號:{special_number}")
```
解說
1. 隨機選號:
使用 random.sample 從範圍 1~49 中隨機選出 6 個不重複數字。
排序後使用 sorted 顯示中獎號碼。
2. 特別號:
使用 random.choice 從剩下的未選中的號碼中隨機選取一個特別號,確保不與中獎號碼重複。
3. 執行範例輸出:
```
樂透中獎號碼:[2, 5, 25, 26, 37, 42]
特別號:8
```
4. 補充:快速產生規律串列的技巧
以下為常用的方法補充:
利用 range
```
list1 = list(range(1, 50)) # 產生 1~49 的串列
```
利用 map
```
str_numbers = ["1", "2", "3"]
int_numbers = list(map(int, str_numbers)) # 轉為整數:[1, 2, 3]
```
隨機工具
random.shuffle:
```
numbers = [1, 2, 3, 4, 5]
random.shuffle(numbers) # 將順序打亂
```
random.sample:
```
subset = random.sample(range(1, 50), 6) # 從 1~49 中取 6 個不重複數字
```
7. 猜數字遊戲
```python=
import random
# 生成4位不重複的隨機密碼
def generate_secret_code():
return random.sample(range(0, 10), 4)
# 計算幾A幾B
def calculate_ab(secret, guess):
A = sum(s == g for s, g in zip(secret, guess)) # 位置正確的數字個數
B = sum(g in secret for g in guess) - A # 數字正確但位置錯誤的數字個數
return A, B
# 確保輸入為合法的4位不重複數字
def get_valid_guess():
while True:
guess = input("請輸入4個不重複的數字:")
if len(guess) == 4 and guess.isdigit() and len(set(guess)) == 4:
return [int(x) for x in guess]
print("輸入錯誤!請輸入4個不重複的數字。")
# 主遊戲邏輯
def main():
print("歡迎來到猜數字遊戲!")
secret_code = generate_secret_code()
attempts = 0
while True:
attempts += 1
guess = get_valid_guess()
A, B = calculate_ab(secret_code, guess)
print(f"{A}A{B}B")
if A == 4: # 猜中4A0B,遊戲結束
print(f"恭喜你猜對了!總共嘗試了 {attempts} 次。")
break
# 運行遊戲
if __name__ == "__main__":
main()
```
程式說明
1. 生成密碼:使用 random.sample 隨機生成 4 個不重複的 0~9 數字作為密碼。
2. 輸入檢查:使用 get_valid_guess 確保玩家輸入的數字為 4位且無重複。
若輸入非法,會提示玩家重新輸入。
3. 計算幾A幾B:
1. A (位置與數字正確):比較密碼和猜測數字的對應位置,計算相等數字的個數。
2. B (數字正確但位置錯誤):計算猜測中出現在密碼中的數字,減去 A 的個數。
4. 遊戲迴圈:
1. 玩家輸入後計算 幾A幾B 並顯示結果。
2. 當結果為 4A0B 時,顯示總共嘗試的次數並結束遊戲。
執行範例
範例輸入與輸出:
```
歡迎來到猜數字遊戲!
請輸入4個不重複的數字:1234
0A2B
請輸入4個不重複的數字:5678
1A1B
請輸入4個不重複的數字:5693
4A0B
恭喜你猜對了!總共嘗試了 3 次。
```
8. BlackJack (21點)
```python=
import random
# 建立撲克牌並洗牌
def create_deck():
suits = ['♠', '♥', '♦', '♣'] # 花色
ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] # 點數
deck = [(rank, suit) for suit in suits for rank in ranks]
random.shuffle(deck)
return deck
# 計算手牌總點數
def calculate_points(hand):
points = 0
aces = 0
for card in hand:
rank = card[0]
if rank in ['J', 'Q', 'K']:
points += 10
elif rank == 'A':
points += 11
aces += 1
else:
points += int(rank)
# 調整A的點數 (如總點數超過21則將A計為1)
while points > 21 and aces:
points -= 10
aces -= 1
return points
# 顯示手牌
def display_hand(hand, is_dealer=False):
if is_dealer:
print(f"莊家的牌:[{hand[0][0]}{hand[0][1]}] + ?")
else:
hand_str = " ".join([f"{card[0]}{card[1]}" for card in hand])
print(f"玩家的牌:{hand_str}")
# 主遊戲邏輯
def blackjack():
print("歡迎來到 21 點遊戲!")
deck = create_deck()
player_hand = [deck.pop(), deck.pop()]
dealer_hand = [deck.pop()]
# 初始顯示
display_hand(player_hand)
display_hand(dealer_hand, is_dealer=True)
# 玩家操作
while True:
player_points = calculate_points(player_hand)
print(f"玩家目前點數:{player_points}")
if player_points > 21:
print("爆牌!莊家勝利!")
return
action = input("是否要牌?(y/n): ").strip().lower()
if action == 'y':
player_hand.append(deck.pop())
display_hand(player_hand)
elif action == 'n':
break
else:
print("請輸入 'y' 或 'n'!")
# 莊家操作
while True:
dealer_points = calculate_points(dealer_hand)
if dealer_points >= 17:
break
dealer_hand.append(deck.pop())
# 最終結果
player_points = calculate_points(player_hand)
dealer_points = calculate_points(dealer_hand)
dealer_hand_str = " ".join([f"{card[0]}{card[1]}" for card in dealer_hand])
print(f"\n莊家的牌:{dealer_hand_str},總點數:{dealer_points}")
print(f"玩家的牌:{' '.join([f'{card[0]}{card[1]}' for card in player_hand])},總點數:{player_points}")
if dealer_points > 21 or player_points > dealer_points:
print("恭喜玩家獲勝!")
elif player_points < dealer_points:
print("莊家獲勝!")
else:
print("平局!")
# 運行遊戲
if __name__ == "__main__":
blackjack()
```
程式說明:
1. 撲克牌生成與洗牌:使用 create_deck 函數創建 52 張牌,並隨機打亂順序。
2. 點數計算:calculate_points 函數將 J, Q, K 視為 10 點,A 可靈活計算為 1 或 11。
3. 玩家回合:玩家可選擇是否要牌,直到停止要牌或爆牌為止。
4. 莊家回合:莊家點數不足 17 時自動抽牌,直到大於等於 17 點為止。
5. 勝負判定:
1. 玩家爆牌,莊家直接勝出。
2. 莊家爆牌或玩家點數更接近 21,則玩家勝出。
3. 若雙方點數相同則平局。
執行範例:
```
歡迎來到 21 點遊戲!
玩家的牌:5♠ K♣
莊家的牌:[9♥] + ?
玩家目前點數:15
是否要牌?(y/n): y
玩家的牌:5♠ K♣ 2♦
玩家目前點數:17
是否要牌?(y/n): n
莊家的牌:9♥ 6♦,總點數:15
莊家的牌:9♥ 6♦ 4♣,總點數:19
玩家的牌:5♠ K♣ 2♦,總點數:17
莊家獲勝!
```
# 集合操作 (Set Operations)
1. 集合的基本概念
1. 集合是一種無序、不重複的數據結構。
2. 可以使用大括號 {} 或 set() 創建集合。
3. 集合操作包括交集 (intersection)、聯集 (union)、差集 (difference)、對稱差集 (symmetric_difference)、新增、刪除元素等。
## 集合建立set
1.建立一個空的set(也相當於宣告):
set1 = set( ) 但不可以是set1 = { },這樣型態為dict
2. 建立時給予初始值:
set1 = { 1, 2, 3, 4, 5 }
3. set 內的元素可以是不同型態
set1 = { 1, "項目1", 5.2, True }
## 內建函式
set1 = { 1, 3, 5, 7, 9, 1, 3, 5, 1}
1. len( set1 ) 5:計算集合長度(項目數),項目不重複
2. max( set1 ) 9 :取項目中最大值
3. min( set1 ) 1 :取項目中最小值
4. sum( set1 ) 25 :項目總和
## set 支援的運算子
1. in 或not in 運算子,檢查元素是否存在集合
2. ==、!=、<=、<、>=、>比較運算子,檢查項目是否相等、或是否完全包含或被包含等,不是比集合長度
3. set 無順序之分,不支援連接運算子(+)、重複運算子( * )、索引運算子([] )、片段運算子( [start: end] )
## set 運算與方法
| 方法 | 說明 | |
| ---------------------------------------- | ------------------------ | ----- |
| **add(x)** | 將元素 `x` 添加到集合中。 | |
| **remove(x)** | 從集合中移除元素 `x`,若不存在則拋出錯誤。 | |
| **discard(x)** | 從集合中移除元素 `x`,若不存在則不拋出錯誤。 | |
| **pop()** | 隨機移除集合中的一個元素,並返回該元素。 | |
| **clear()** | 清空集合中的所有元素。 | |
| \**union(*others)** | 返回集合的聯集(等價於 \` | \`)。 |
| \**intersection(*others)** | 返回集合的交集(等價於 `&`)。 | |
| \**difference(*others)** | 返回集合的差集(等價於 `-`)。 | |
| **symmetric\_difference(other)** | 返回集合的對稱差集(等價於 `^`)。 | |
| \**update(*others)** | 更新集合為聯集(等價於 \` | =\`)。 |
| \**intersection\_update(*others)** | 更新集合為交集(等價於 `&=`)。 | |
| \**difference\_update(*others)** | 更新集合為差集(等價於 `-=`)。 | |
| **symmetric\_difference\_update(other)** | 更新集合為對稱差集(等價於 `^=`)。 | |
說明:
1. x in s 和 x not in s 用來判斷元素 x 是否在集合 s 中,或是是否不在集合 s 中。
2. 交集 (&):返回兩個集合共同擁有的元素。
3. 聯集 (|):返回兩個集合的所有元素,去掉重複的部分。
4. 對稱差集 (^):返回兩個集合中,只屬於其中一個集合的元素,不包括交集的部分。
5. 差集 (-):返回一個集合中有,但另一集合中沒有的元素。
6. 子集合 (<=) 和 真子集合 (<):檢查集合 s1 是否為集合 s2 的子集合或真子集合。
7. 超集合 (>=) 和 真超集合 (>):檢查集合 s1 是否為集合 s2 的超集合或真超集合。
| 方法 | 功能 | 範例 | 結果 |
| ------------------ | --------------------------------------- | ----------------------------------------------- | ---------------------------- |
| **isdisjoint(s2)** | 檢查集合與 `s2` 是否沒有共同元素。返回 `True` 或 `False` | `s1 = {1,2,3}; s2 = {4,5,6}; s1.isdisjoint(s2)` | `True` |
| **copy()** | 返回集合的淺拷貝(不同物件,內容相同) | `s1 = {1,2,3}; s2 = s1.copy()` | `s2 = {1,2,3}`,但與 `s1` 不共用內存 |
| **add(x)** | 添加元素 `x` 到集合中(若已存在則無效) | `s1 = {1,2}; s1.add(3)` | `s1 = {1,2,3}` |
| **remove(x)** | 移除元素 `x`,若不存在則拋出 `KeyError` | `s1 = {1,2,3}; s1.remove(2)` | `s1 = {1,3}` |
| **discard(x)** | 移除元素 `x`,若不存在則什麼也不做 | `s1 = {1,2,3}; s1.discard(4)` | `s1 = {1,2,3}` |
| **pop()** | 隨機移除並返回一個元素;若集合為空,拋出 `KeyError` | `s1 = {1,2,3}; x = s1.pop()` | 可能返回 `1`,並更新為 `s1 = {2,3}` |
| **clear()** | 清空集合 | `s1 = {1,2,3}; s1.clear()` | `s1 = set()` |
說明:
1. s1.isdisjoint(s2):檢查兩個集合 s1 和 s2 是否沒有共同元素。如果兩個集合沒有交集,返回 True,否則返回 False。
2. s1.copy():返回集合 s1 的一個新拷貝。這不會影響原來的集合。
3. s1.add(x):將元素 x 添加到集合 s1 中。如果元素已經存在,則不會添加重複的元素。
4. s1.remove(x):從集合 s1 中移除元素 x。如果元素 x 不在集合中,會拋出 KeyError。
5. s1.pop():隨機從集合 s1 中移除並返回一個元素。由於集合是無序的,因此移除的元素是隨機的。
6. s1.clear():移除集合 s1 中的所有元素,使集合變成空集。
## 基本運算與範例
1. 交集 (AND):找出兩集合中共有的元素。
1. 方法: A & B 或 A.intersection(B)
2. 範例:
```python=
A = {"California", "New York"}
B = {"New York", "Phoenix", "Chicago"}
print(A & B) # {'New York'}
```
2. 聯集 (OR):找出兩集合中所有元素(不重複)。
1. 方法: A | B 或 A.union(B)
2. 範例
```python=
print(A | B) # {'California', 'New York', 'Phoenix', 'Chicago'}
```
3. 差集 (Differenˊce):找出在集合 A 中但不在集合 B 中的元素。
1. 方法: A - B 或 A.difference(B)
2. 範例:
```python=
print(A - B) # {'California'}
```
3. 對稱差集 (XOR):找出兩集合中不重複的元素(僅屬於其中一個集合)。
1. 方法: A ^ B 或 A.symmetric_difference(B)
2. 範例:
```python=
print(A ^ B) # {'California', 'Phoenix', 'Chicago'}
```
## 實作範例
1:水果集合操作
題目需求:
itemsA 加入任意兩樣水果,刪除一樣與「蘋果」。
itemsB 加入任意兩樣水果,刪除一樣與「蓮霧」。
計算以下集合操作:
所有的水果且不重複
兩者皆有的水果
itemsA 獨有的水果
itemsB 獨有的水果
兩者不重複的水果
```python=
# 初始集合
itemsA = {"蘋果", "香蕉", "鳳梨", "芭樂"}
itemsB = {"鳳梨", "蘋果", "水梨", "蓮霧"}
# 修改集合
itemsA.add("橘子")
itemsA.add("葡萄")
itemsA.remove("蘋果")
itemsB.add("草莓")
itemsB.add("芒果")
itemsB.remove("蓮霧")
# 計算
all_fruits = itemsA | itemsB # 聯集
common_fruits = itemsA & itemsB # 交集
unique_to_A = itemsA - itemsB # A 獨有
unique_to_B = itemsB - itemsA # B 獨有
symmetric_diff = itemsA ^ itemsB # 對稱差集
# 結果輸出
print("所有的水果且不重覆:", sorted(all_fruits))
print("兩者皆有的水果:", sorted(common_fruits))
print("itemsA 獨有的水果:", sorted(unique_to_A))
print("itemsB 獨有的水果:", sorted(unique_to_B))
print("兩者不重覆的水果:", sorted(symmetric_diff))
```
2:學生名單操作
題目需求:
數學及格但英文不及格的同學。
數學不及格但英文及格的同學。
兩者皆及格的同學。
```python=
# 初始集合
math_pass = {"柯南", "灰原", "步美", "美環", "光彦"}
english_pass = {"柯南", "灰原", "丸尾", "野口", "步美"}
# 計算
math_only = math_pass - english_pass # 數學及格但英文不及格
english_only = english_pass - math_pass # 英文及格但數學不及格
both_pass = math_pass & english_pass # 兩者皆及格
# 結果輸出
print("數學及格但英文不及格的同學:", sorted(math_only))
print("數學不及格但英文及格的同學:", sorted(english_only))
print("兩者皆及格的同學:", sorted(both_pass))
```