Try   HackMD

第一週:課程介紹與回顧

課程目標及學習方法介紹

回顧基礎程式設計概念(變數、資料型態、控制結構等)

  • 教學目標
    • 回顧與強化變數、資料型態及控制結構的基本概念
    • 透過範例程式與練習,加深學生對這些基礎概念的理解

第一部分:變數與資料型態(45分鐘)

變數的基本概念

  • 定義與宣告
  • 變數命名規則與最佳實踐

資料型態介紹

  • 整數型態(int)
  • 浮點數型態(float/double)
  • 字串型態(String)
  • 布林型態(boolean)

範例程式:變數與資料型態的使用

# 範例1:簡單的變數宣告與賦值
name = "Alice"
age = 17
height = 165.5
is_student = True

print("Name:", name)
print("Age:", age)
print("Height:", height, "cm")
print("Is student:", is_student)

課堂練習:變數與資料型態

  • 練習1:定義自己的變數,並輸出基本個人資料(如姓名、年齡、學校名稱等)。
# 定義變數並賦值
name = "jason"
age = 18
school_name = "Zhensheng High School"
major = "Electronic Equipment Maintenance"

# 輸出個人資料
print("姓名:", name)
print("年齡:", age)
print("學校名稱:", school_name)
print("專業:", major)
  • 練習2:計算兩個數字的和、差、積、商,並輸出結果。
# 輸入兩個數字
num1 = float(input("請輸入第一個數字: "))
num2 = float(input("請輸入第二個數字: "))

# 計算和、差、積、商
sum_result = num1 + num2
difference_result = num1 - num2
product_result = num1 * num2
quotient_result = num1 / num2

# 輸出計算結果
print("兩個數字的和是:", sum_result)
print("兩個數字的差是:", difference_result)
print("兩個數字的積是:", product_result)
print("兩個數字的商是:", quotient_result)

Python 基本運算介紹

  • Python 提供了多種基本運算符,這些運算符可以用來執行數學計算和邏輯運算。以下是 Python 中常用的基本運算符及其功能介紹。

數學運算符

運算符 描述 例子 結果
+ 加法 3 + 5 8
- 減法 10 - 4 6
* 乘法 7 * 6 42
/ 除法 8 / 2 4.0
// 整數除法 9 // 4 2
% 取餘數 10 % 3 1
** 指數運算 2 ** 3 8
# 數學運算示例
a = 10
b = 3

加法 = a + b          # 10 + 3
減法 = a - b          # 10 - 3
乘法 = a * b          # 10 * 3
除法 = a / b          # 10 / 3
整數除法 = a // b     # 10 // 3
取餘數 = a % b        # 10 % 3
指數運算 = a ** b     # 10 ** 3

print("加法:", 加法)
print("減法:", 減法)
print("乘法:", 乘法)
print("除法:", 除法)
print("整數除法:", 整數除法)
print("取餘數:", 取餘數)
print("指數運算:", 指數運算)

邏輯運算符

運算符 描述 例子 結果
and 邏輯與 True and False False
or 邏輯或 True or False True
not 邏輯非 not True False
# 邏輯運算示例
x = True
y = False

邏輯與 = x and y          # True and False
邏輯或 = x or y           # True or False
邏輯非 = not x            # not True

print("邏輯與:", 邏輯與)
print("邏輯或:", 邏輯或)
print("邏輯非:", 邏輯非)

比較運算符

運算符 描述 例子 結果
== 相等 5 == 5 True
!= 不相等 5 != 3 True
> 大於 5 > 3 True
< 小於 5 < 3 False
>= 大於或等於 5 >= 5 True
<= 小於或等於 3 <= 5 True
# 比較運算示例
x = 5
y = 3

相等 = (x == y)         # 5 == 3
不相等 = (x != y)       # 5 != 3
大於 = (x > y)          # 5 > 3
小於 = (x < y)          # 5 < 3
大於等於 = (x >= 5)     # 5 >= 5
小於等於 = (y <= 5)     # 3 <= 5

print("相等:", 相等)
print("不相等:", 不相等)
print("大於:", 大於)
print("小於:", 小於)
print("大於等於:", 大於等於)
print("小於等於:", 小於等於)

Python 中的 += 運算符

  • += 是 Python 中的一種增量賦值運算符,它的主要作用是將變量的當前值與右側的值相加,然後將結果賦值給左側的變量。這是一個簡潔的方式來執行加法並更新變量的值。
x += y
  • 這相當於:
x = x + y
  • 使用範例
# 初始化變量
x = 10
y = 5

# 使用 += 運算符
x += y  # 等同於 x = x + y

print("x 的新值:", x)  # 輸出: x 的新值: 15
  • 特點
    • += 運算符可以用於數字類型,也可以用於其他可加的數據類型,如字串和列表。
    • 當用於字串時,+= 將兩個字串連接起來。
    • 當用於列表時,+= 將右側列表的元素添加到左側列表中。
# 字串範例
name = "Alice"
name += " Smith"  # 等同於 name = name + " Smith"

print("完整名稱:", name)  # 輸出: 完整名稱: Alice Smith
  • 列表範例
# 列表範例
numbers = [1, 2, 3]
numbers += [4, 5]  # 等同於 numbers = numbers + [4, 5]

print("更新後的列表:", numbers)  # 輸出: 更新後的列表: [1, 2, 3, 4, 5]

第二部分:控制結構(75分鐘)

條件判斷結構

  • if、else if、else結構
  • 巢狀條件判斷
    是指在一個條件判斷語句內部再包含其他條件判斷語句。這樣的結構使得程式能夠處理更複雜的邏輯判斷。
# 輸入年齡和身高
age = int(input("請輸入年齡: "))
height = float(input("請輸入身高(以公尺為單位): "))

# 根據年齡判斷
if age >= 18:
    # 如果年齡大於等於18,進行身高判斷
    if height >= 1.7:
        print("您符合參加成人體育活動的條件。")
    else:
        print("您的身高不符合參加成人體育活動的條件。")
else:
    print("您不符合參加成人體育活動的年齡條件。")

範例程式:條件判斷

# 範例2:判斷年齡並給予不同回應
age = int(input("輸入您的年齡: "))
if age < 18:
    print("你是未成年人。")
elif age >= 18 and age < 65:
    print("你是一個成年人了。")
else:
    print("你是一位老年人。")

迴圈結構

  • for迴圈
  • while迴圈
  • 迴圈控制:break與continue

範例程式:迴圈的應用

# 範例3:計算1到10的總和
total = 0
for i in range(1, 11):
    total += i
print("1 到 10 的數字總和為:", total)
# 範例4:使用while迴圈進行猜數字遊戲
secret_number = 7
guess = 0
while guess != secret_number:
    guess = int(input("猜數字(1-10): "))
    if guess < secret_number:
        print("太低!")
    elif guess > secret_number:
        print("太高了!")
    else:
        print("恭喜!你猜對了!")

課堂練習:控制結構

  • 練習3:根據輸入的分數,判斷學生的成績等級(A、B、C、D、F)。
# 輸入學生分數
score = int(input("請輸入學生的分數(0-100之間): "))

# 判斷成績等級
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
elif score >= 60:
    grade = "D"
else:
    grade = "F"

# 輸出成績等級
print("學生的成績等級是:", grade)
  • 練習4:使用for或while迴圈,設計一個程序,輸出1到100之間所有的偶數。
    • 使用 for 迴圈
# 使用for迴圈輸出1到100之間所有的偶數
print("1到100之間的偶數有:")
for i in range(2, 101, 2):
    print(i)
  • 使用 while 迴圈
# 使用while迴圈輸出1到100之間所有的偶數
print("1到100之間的偶數有:")
num = 2
while num <= 100:
    print(num)
    num += 2

第二週:進階函數設計

在這一週的課程中,我們將深入探討 Python 中的進階函數設計,包括以下主題:

  1. 函數定義與參數傳遞
  • 函數定義
    • 使用 def 關鍵字來定義函數。
    • 函數可以接受參數,並返回值。
  • 範例
def greet(name):
    return f"Hello, {name}!"

print(greet("Alice"))  # 輸出: Hello, Alice!
  • 參數傳遞
    • 位置參數:根據位置傳遞的參數。
    • 關鍵字參數:通過指定參數名稱來傳遞的參數。
    • 默認參數:可以為參數設置默認值。
    • 可變參數:使用 *args 和 **kwargs 來接收可變數量的參數。
      • *args 用於接收 任意數量的 位置參數。
      • 當函數被調用時,所有的位置參數都會被收集到一個元組中。
      • **kwargs 用於接收 任意數量的 關鍵字參數。
      • 當函數被調用時,所有的關鍵字參數會被收集到一個字典中。
  • 範例
def add(a, b=0):
    return a + b

print(add(5, 3))  # 輸出: 8
print(add(5))     # 輸出: 5

def print_info(*args, **kwargs):
    print("位置參數:", args)
    print("關鍵字參數:", kwargs)

print_info(1, 2, 3, name="Alice", age=25)

image

  • 在上述 print_info 函數的呼叫中:

  • 位置參數 1, 2, 3 被收集到元組 args 中,輸出為 (1, 2, 3)。

  • 關鍵字參數 name="Alice" 和 age=25 被收集到字典 kwargs 中,輸出為 {'name': 'Alice', 'age': 25}。

  • 函數列表操作練習
    以列表作為參數,輸出指定值。

def find_max(numbers):
    return max(numbers)

print(find_max([1, 5, 3, 8, 2]))
  • 函數數學運算練習
    以列表作為參數,計算後輸出指定值。
def calculate_average(numbers):
    return sum(numbers) / len(numbers)

print(calculate_average([1, 2, 3, 4, 5])) 
  1. 遞迴(Recursion)的概念與應用
  • 遞迴概念
    • 遞迴是函數調用自身的過程。
      通常用於解決可以分解為相同子問題的問題。
    • 遞迴範例:計算階乘
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)

print(factorial(5))  # 輸出: 120

執行流程

呼叫 factorial(5): 程式碼先呼叫 factorial 函數,並將 5 作為參數傳遞。
執行 if n == 0:: 由於 n 不等於 0,因此執行 else 程式碼區塊。
遞迴呼叫: 程式碼執行 return n * factorial(n - 1),即 5 * factorial(4)。
遞歸呼叫 factorial(4): 程式碼再次呼叫 factorial 函數,並將 4 作為參數傳遞。
遞歸呼叫 factorial(3): 由於 n 不等於 0,程式碼再次遞迴呼叫 factorial(3)。
遞歸呼叫 factorial(2): 同樣,程式碼遞歸呼叫 factorial(2)。
遞歸呼叫 factorial(1): 程式碼遞歸呼叫 factorial(1)。
遞歸呼叫 factorial(0): 最後,程式碼遞歸呼叫 factorial(0)。
傳回基線值: 由於 n 等於 0,factorial(0) 傳回 1。
回溯計算: 程式碼逐層回溯,計算 1 * 1 = 1、2 * 1 = 2、3 * 2 = 6、4 * 6 = 24、5 * 24 = 120。
最終結果: 最終,factorial(5) 返回 120,並列印輸出結果。

  • 遞迴應用
    • 遞迴常用於數據結構(如樹和圖)的遍歷。
    • 確保每次遞迴都有明確的終止條件,以避免無窮遞迴。
  1. 函數重載與匿名函數
  • 函數重載
    Python 不支持傳統的函數重載,但可以通過可變參數來模擬。
  • 範例
def multiply(a, b=1):
    return a * b

print(multiply(2, 3))  # 輸出: 6
print(multiply(5))     # 輸出: 5

執行流程

定義函數: 程式碼首先定義了 multiply 函數,它接受兩個參數,並傳回它們的乘積。
第一次呼叫: 程式碼呼叫 multiply 函數,傳遞參數 2 和 3,函數傳回 6,並列印列印輸出結果。
第二次呼叫: 程式碼呼叫 multiply 函數,只傳遞參數 5,由於 b 是可選參數,使用預設值 1,函數傳回 5,並列印輸出結果。

  • 匿名函數(Lambda 函數)
    使用 lambda 關鍵字定義的匿名函數,通常用於簡單的函數。
  • 範例
# 定義一個匿名函數
add = lambda x, y: x + y

print(add(3, 5))  # 輸出: 8

# 使用匿名函數進行排序
pairs = [(1, 2), (3, 1), (5, 0)]
sorted_pairs = sorted(pairs, key=lambda pair: pair[1])

print(sorted_pairs)  # 輸出: [(5, 0), (3, 1), (1, 2)]

執行流程

初始狀態: pairs 清單包含三個元組:(1, 2)、(3, 1) 和 (5, 0)。

排序依據: sorted() 函數使用匿名函數 lambda pair: pair[1] 作為排序依據,它會取得每個元組的第二個元素。

排序過程:

首先,sorted() 函數會比較 (1, 2) 和 (3, 1) 的第二個元素,即 2 和 1。由於 1 小於 2,因此 (3, 1) 會排在 (1, 2) 之前。
接著,sorted() 函數會比較 (3, 1) 和 (5, 0) 的第二個元素,即 1 和 0。由於 0 小於 1,因此 (5, 0) 會排在 (3, 1) 之前。
最後,sorted() 函數會比較 (1, 2) 和 (5, 0) 的第二個元素,即 2 和 0。由於 0 小於 2,因此 (5, 0) 會排在 (1, 2) 之前。
排序結果: 最終,sorted_pa​​irs 清單包含三個元組,依照第二個元素從小到大排序:[(5, 0), (3, 1), (1, 2)]。

  • 總結
    本週我們學習了如何定義函數、傳遞參數、遞迴的概念及其應用,以及函數重載和匿名函數的使用。

第三週:資料結構介紹

陣列(Array)與串列(List)的進階操作
鏈結串列(Linked List)的基本概念與實作
目標:

  • 理解陣列和串列的進階操作,並能應用於程式設計中。
  • 掌握鏈結串列的基本概念,並能實作簡單的鏈結串列。

課程大綱:

1. 陣列與串列的進階操作

1.1 陣列

  • 二維陣列

    • 概念: 二維陣列可以想像成表格,由多個一維陣列組成,每個一維陣列代表表格的一行。
    • 建立: 在程式中,可以使用巢狀迴圈建立二維陣列,例如:
      ​​​​​​​​# 建立一個 3x4 的二維陣列
      ​​​​​​​​array = [[0 for _ in range(4)] for _ in range(3)]
      
    • 存取: 使用兩個索引值存取二維陣列中的元素,例如:
      ​​​​​​​​# 存取二維陣列中的元素
      ​​​​​​​​element = array[1][2]
      
    • 操作: 可以在二維陣列中進行各種操作,例如:
      • 遍歷所有元素:使用巢狀迴圈遍歷所有元素。
      • 計算元素總和:使用巢狀迴圈計算所有元素的總和。
      • 搜尋特定元素:使用巢狀迴圈搜尋特定元素。
  • 陣列排序

    • 概念: 陣列排序是指將陣列中的元素按照特定順序排列。
    • 常見排序演算法:
      • 冒泡排序: 逐一比較相鄰元素,交換位置,直到所有元素都排序完成。
      • 插入排序: 將未排序的元素逐一插入已排序的元素中,直到所有元素都排序完成。
      • 選擇排序: 找出未排序元素中最小的元素,並與第一個未排序元素交換位置,直到所有元素都排序完成。
    • 實作: 使用程式碼實作上述排序演算法,並比較不同演算法的效率。
  • 陣列搜尋

    • 概念: 陣列搜尋是指在陣列中查找特定元素。
    • 常見搜尋演算法:
      • 線性搜尋: 逐一比較陣列中的元素,直到找到目標元素或遍歷完所有元素。
      • 二元搜尋: 適用於已排序的陣列,每次將搜尋範圍縮減一半,直到找到目標元素或搜尋範圍為空。
    • 實作: 使用程式碼實作上述搜尋演算法,並比較不同演算法的效率。

1.2 串列

  • 串列的增刪改查操作

    • 增: 在串列中新增元素,例如:
      ​​​​​​​​# 在串列的末尾新增元素
      ​​​​​​​​list.append(element)
      ​​​​​​​​# 在串列的特定位置新增元素
      ​​​​​​​​list.insert(index, element)
      
    • 刪: 從串列中刪除元素,例如:
      ​​​​​​​​# 刪除串列中的特定元素
      ​​​​​​​​list.remove(element)
      ​​​​​​​​# 刪除串列中特定位置的元素
      ​​​​​​​​del list[index]
      
    • 改: 修改串列中元素的值,例如:
      ​​​​​​​​# 修改串列中特定位置的元素值
      ​​​​​​​​list[index] = new_value
      
    • 查: 查詢串列中元素的值,例如:
      ​​​​​​​​# 查詢串列中特定位置的元素值
      ​​​​​​​​value = list[index]
      
  • 串列的應用

    • 佇列: 遵循先進先出 (FIFO) 的原則,例如:
      • 顧客排隊等待服務。
      • 處理任務的順序。
    • 堆疊: 遵循後進先出 (LIFO) 的原則,例如:
      • 函式呼叫的堆疊。
      • 瀏覽器歷史記錄。

2. 鏈結串列

2.1 鏈結串列的概念

  • 定義: 鏈結串列是一種線性資料結構,由一系列節點組成,每個節點包含資料域和指標域。指標域指向下一個節點,形成一個鏈結。
  • 節點: 鏈結串列的節點通常包含兩個部分:
    • 資料域: 儲存實際的資料。
    • 指標域: 指向下一個節點的指標。

2.2 鏈結串列的實作

  • 建立鏈結串列:

    • 首先,定義一個節點類別,包含資料域和指標域。
    • 然後,建立一個頭節點,作為鏈結串列的起始點。
    • 隨後,根據需要,建立新的節點,並將其插入到鏈結串列中。
  • 插入節點:

    • 找到要插入節點的位置。
    • 建立一個新的節點,並將其資料域設定為要插入的資料。
    • 將新節點的指標域指向要插入位置的下一個節點。
    • 將要插入位置的前一個節點的指標域指向新節點。
  • 刪除節點:

    • 找到要刪除的節點。
    • 將要刪除節點的前一個節點的指標域指向要刪除節點的下一個節點。
    • 將要刪除的節點從記憶體中釋放。

3. 課堂練習

  • 設計一個程式,利用陣列儲存學生的成績,並計算平均成績。
  • 設計一個程式,利用串列儲存待辦事項,並提供新增、刪除、修改和查詢功能。
  • 實作一個簡單的鏈結串列,並進行插入和刪除節點的操作。

4. 課後作業

  • 實作一個程式,利用二維陣列儲存棋盤,並設計一個簡單的棋盤遊戲。
  • 實作一個程式,利用串列儲存一個購物清單,並提供新增、刪除、修改和查詢功能。
  • 實作一個鏈結串列,並設計一個函式,用於判斷鏈結串列中是否存在重複的節點。

第四週:物件導向設計(OOP)基礎

類別與物件
封裝(Encapsulation)、繼承(Inheritance)、多型(Polymorphism)

第五週:物件導向設計(OOP)進階

抽象類別與介面(Interface)
多重繼承與組合

第六週:檔案處理

檔案讀寫的基本操作
二進位檔案與文字檔案處理

第七週:例外處理與除錯

例外處理機制(try, catch, finally)
常見錯誤除錯技巧

第八週:期中考試準備與複習

回顧與練習,準備期中考試

第九週:期中考試

第十週:演算法入門

常見演算法介紹(排序、搜尋)
時間複雜度與空間複雜度的概念

第十一週:排序演算法

泡沫排序(Bubble Sort)、選擇排序(Selection Sort)、插入排序(Insertion Sort)
演算法的實作與比較

第十二週:搜尋演算法

線性搜尋(Linear Search)與二元搜尋(Binary Search)
搜尋演算法的實作與應用

第十三週:資料結構進階

堆疊(Stack)與佇列(Queue)
樹狀結構(Tree)與二元樹(Binary Tree)

第十四週:圖形使用者介面(GUI)程式設計入門

GUI 基本概念
事件驅動程式設計

第十五週:進階GUI設計

視窗小工具(如按鈕、文字框、選單等)的使用
GUI專案的實作與展示

第十六週:專案開發與團隊合作

小組專案設計與開發
版本控制系統(如Git)的基本使用

第十七週:期末專案展示

小組專案展示與同儕互評
專案優化與報告準備

第十八週:期末考試與總結

期末考試
課程總結與未來學習建議