2025年10月13日 星期一

[水井USR創新教材]Python一下用水井三寶來看字串正規表示式的用法



以下是用Grok AI生成。 

以「水井三寶」(烏龜、白馬、姻緣花)為主題,設計一個 Python 小範例,展示如何使用隨機密碼生成器來產生與水井三寶相關的密碼。這個範例會結合物件導向程式設計(OOP)和 Python 的 random 模組,生成帶有三寶特色的密碼(例如包含「烏龜」、「白馬」、「姻緣花」的主題詞,並混雜隨機字元)。我們會使用封裝來管理密碼生成邏輯,並透過繼承讓每個寶物有獨特的密碼風格。

情境設定

假設我們要為水井三寶的每種寶物生成專屬密碼:

  • 烏龜:密碼強調「長壽」,包含數字(年份)並較長。
  • 白馬:密碼強調「迅捷」,包含特殊字元(象徵速度)並中等長度。
  • 姻緣花:密碼強調「浪漫」,包含字母和愛心符號,較短但優雅。

每個密碼會結合寶物名稱、隨機字元(字母、數字、特殊符號),並確保安全性和隨機性。

範例程式碼

以下是一個完整的 Python 程式,展示如何用 OOP 和隨機模組生成水井三寶主題的密碼。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import random
import string

class Treasure:
    """基類:定義水井三寶密碼生成器的共同行為"""
    def __init__(self, name):
        self.name = name
        self._charset = string.ascii_letters + string.digits + string.punctuation  # 基本字元集

    def generate_password(self, length=8):
        """生成隨機密碼,包含寶物名稱"""
        random_part = ''.join(random.choice(self._charset) for _ in range(length - len(self.name)))
        password = self.name + random_part
        # 打亂密碼字元
        password = ''.join(random.sample(password, len(password)))
        return password

class Turtle(Treasure):
    """烏龜:生成長壽主題的長密碼,強調數字"""
    def __init__(self):
        super().__init__("烏龜")
        self._charset = string.digits  # 烏龜密碼以數字為主

    def generate_password(self, length=12):
        """覆寫:生成12位密碼,包含至少4個數字"""
        random_part = ''.join(random.choice(self._charset) for _ in range(4))  # 4個數字
        extra_part = ''.join(random.choice(string.ascii_letters) for _ in range(length - 4 - len(self.name)))
        password = self.name + random_part + extra_part
        return ''.join(random.sample(password, len(password)))

class WhiteHorse(Treasure):
    """白馬:生成迅捷主題的密碼,包含特殊字元"""
    def __init__(self):
        super().__init__("白馬")
        self._charset = string.punctuation  # 白馬密碼以特殊字元為主

    def generate_password(self, length=10):
        """覆寫:生成10位密碼,包含至少3個特殊字元"""
        random_part = ''.join(random.choice(self._charset) for _ in range(3))  # 3個特殊字元
        extra_part = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length - 3 - len(self.name)))
        password = self.name + random_part + extra_part
        return ''.join(random.sample(password, len(password)))

class MarriageFlower(Treasure):
    """姻緣花:生成浪漫主題的短密碼,包含愛心符號"""
    def __init__(self):
        super().__init__("姻緣花")
        self._charset = string.ascii_letters + "♥"  # 包含愛心符號

    def generate_password(self, length=8):
        """覆寫:生成8位密碼,包含至少1個愛心符號"""
        random_part = random.choice("♥")  # 至少1個愛心
        extra_part = ''.join(random.choice(string.ascii_letters) for _ in range(length - 1 - len(self.name)))
        password = self.name + random_part + extra_part
        return ''.join(random.sample(password, len(password)))

# 測試範例
if __name__ == "__main__":
    # 創建水井三寶實例
    turtle = Turtle()
    horse = WhiteHorse()
    flower = MarriageFlower()

    # 生成並展示密碼
    treasures = [turtle, horse, flower]
    for treasure in treasures:
        print(f"{treasure.name} 的密碼:{treasure.generate_password()}")

執行結果:
烏龜 的密碼:uY4龜8烏VcwU48
白馬 的密碼:v馬Gn白[X+'T
姻緣花 的密碼:a姻♥花Gqt緣

程式碼解析

  1. 正規表示式相關性
    • 雖然本題聚焦密碼生成,但可以延伸到正規表示式。例如,生成的密碼可透過 regex 驗證是否包含特定字元(例如 \d+ 檢查數字、[!@#$%^&*] 檢查特殊字元)。
    • 範例中未直接使用 regex,但可添加驗證(見下方擴展建議)。
  2. OOP 技術應用
    • 繼承:Turtle、WhiteHorse 和 MarriageFlower 繼承 Treasure,共享基本密碼生成邏輯。
    • 多型:每個子類別覆寫 generate_password,生成符合自身主題的密碼。
    • 封裝:_charset 是保護屬性,控制可用的字元集。
    • 類與實例屬性:name 是實例屬性,確保每個寶物有獨特名稱;_charset 在子類別中自訂。
  3. 隨機密碼生成
    • 使用 random.choice 從字元集中選取字元。
    • 使用 random.sample 打亂密碼字元,增加隨機性。
    • 每個寶物有不同長度和字元偏好:
      • 烏龜:12位,強調數字。
      • 白馬:10位,包含特殊字元。
      • 姻緣花:8位,包含愛心符號 ♥。
  4. 安全考量
    • 密碼包含寶物名稱和隨機字元,並透過 random.sample 打亂,避免可預測性。
    • 真實應用中應使用 secrets 模組(更安全),但為簡單起見這裡用 random。

沒有留言:

張貼留言