Skip to content

Python 腳本編寫入門

Python 是一種廣受歡迎且對初學者友善的程式語言。它的語法簡潔易懂,非常適合用來編寫各種小工具和自動化腳本。本文將引導你逐步學習如何編寫你的第一個 Python 腳本,從最基本的概念開始,一直到一個可以實際運行的例子。

📖 Python 程式的基本結構

一個 Python 腳本通常是一個包含 Python 程式碼的 .py 檔案。一個典型的 Python 腳本結構包含以下幾個部分:

註解 Comments

在編寫任何程式碼之前,了解如何使用註解非常重要,因為它們能幫助解釋程式碼。註解不會被 Python 直譯器執行。

單行註解:# 符號開頭,從 # 到該行結尾的內容都會被視為註解。

python
# 這是一條單行註解,用來解釋下面的程式碼
x = 5  # 這也是一條註解,在程式碼的同一行

多行註解: Python 並沒有專門的多行註解符號。但你可以使用多個 #,或者使用未賦值給變數的多行字串 (以 '''""" 包圍) 來達到多行註解的效果。後者也常用於函數或類別的說明文件 (docstrings)。

python
# 這是第一行註解
# 這是第二行註解

"""
這是一個使用多行字串實現的註解區塊。
它常被用作 docstring。
"""

'''
這也是一個多行字串註解。
'''

1. Import 區段

如果你的腳本需要使用 Python 標準庫或其他第三方庫的功能,通常會在檔案的開頭(註解之後)使用 import 關鍵字來匯入這些模組。

python
import sys  # 匯入 sys 模組
import os   # 匯入 os 模組

2. 程式主體

在 Import 區段之後,是腳本的主要邏輯所在。這裡可以包含:

  • 變數宣告 (Variable declarations):定義腳本中使用的數據。
  • 函數定義 (Function definitions):使用 def 關鍵字定義可重複使用的程式碼塊。
  • 類別定義 (Class definitions):使用 class 關鍵字定義物件的藍圖 (本文不詳細介紹類別)。
  • 流程控制語句 (Flow control statements):如 if-else 判斷、迴圈等。

這些元素構成了腳本的核心功能。例如:

python
# 變數宣告
PI_APPROXIMATION = 3.14159

# 函數定義
def calculate_area(radius):
    return PI_APPROXIMATION * radius * radius

# 簡單的流程控制
some_condition = True
if some_condition:
    print("條件為真")

我們會在後續章節詳細講解這些元素。

3. if __name__ == '__main__': (可選)

你可能會經常看到這段程式碼,通常放在腳本的末尾:

python
if __name__ == '__main__':
    # 主要程式碼邏輯放在這裡,例如函數呼叫
    print("腳本作為主程式執行!")
    # result = calculate_area(10) # 假設 calculate_area 已定義
    # print(f"面積為: {result}")

這是一個 Python 的慣用寫法。當 Python 直譯器執行一個腳本檔案時,它會設定一些特殊的內建變數,其中一個就是 __name__

  • 如果腳本是直接被執行的(即你從命令列運行這個 .py 檔案),那麼 __name__ 的值會被設為字串 '__main__'
  • 如果腳本是被其他 Python 腳本 import 為一個模組,那麼 __name__ 的值會是該模組的名稱(通常是檔案名,不含 .py 副檔名)。

因此,if __name__ == '__main__': 條件塊中的程式碼,只有在該腳本作為主程式執行時才會運行。這使得你可以編寫既能獨立執行,又能安全地被其他模組匯入而不會自動執行主要邏輯的腳本。

📝 編寫你的第一個 Python 腳本

現在,讓我們更詳細地看看構成一個 Python 腳本的各個要素。

變數宣告 (Variable Declaration)

在 Python 中,宣告變數非常直接。你不需要事先聲明變數的類型,Python 會自動根據你賦予的值來推斷。

python
message = "Hello, Python!"  # 字串 (string)
count = 10                  # 整數 (integer)
pi_value = 3.14159          # 浮點數 (float)
is_active = True            # 布林值 (boolean)

類型提示 (Type Hints)

雖然 Python 是動態類型語言,但從 Python 3.5 開始,引入了類型提示 (Type Hints) 功能。類型提示可以增加程式碼的可讀性和可維護性,並且可以被一些靜態分析工具用來檢查錯誤。

python
name: str = "Alice"
age: int = 30
height: float = 1.75
is_student: bool = False

類型提示並不會在執行時期強制類型檢查,它們更像是一種對開發者和工具的提示。

函數定義 (Function Declaration)

函數是一段可以重複使用的程式碼塊,用來執行特定的任務。使用 def 關鍵字來定義函數。

python
def greet(person_name: str) -> str:
    """一個簡單的打招呼函數。包含類型提示和回傳類型提示。""" # 這是函數的 docstring
    return f"你好, {person_name}! 歡迎學習 Python。"

# 呼叫函數
user_name: str = "Chris"
greeting_message: str = greet(user_name)
print(greeting_message)  # 輸出: 你好, Chris! 歡迎學習 Python。

在這個例子中:

  • person_name: str 表示參數 person_name 預期是個字串。
  • -> str 表示這個函數預期會回傳一個字串。
  • """一個簡單的打招呼函數...""" 是函數的說明文件 (docstring),描述函數的功能、參數和回傳值。它也是一種多行字串註解。

縮排的重要性 Indentation

Python 與其他許多程式語言不同,它使用縮排 (indentation) 而不是大括號 {} 來定義程式碼區塊(例如函數體、if 語句塊、迴圈塊等)。通常建議使用 4 個空格作為一級縮排。保持縮排的一致性非常重要,否則程式會出錯。

python
def check_number(num: int) -> None:
    # 函數體的開始,需要縮排
    if num > 0:
        # if 條件塊的開始,需要進一步縮排
        print(f"{num} 是正數。")
        if num % 2 == 0:
            # 嵌套 if 條件塊,再次縮排
            print(f"{num} 也是偶數。")
    elif num == 0:
        # elif 條件塊,與 if 同級縮排
        print(f"{num} 是零。")
    else:
        # else 條件塊,與 if 同級縮排
        print(f"{num} 是負數。")
    # 函數體結束

check_number(10)
check_number(-5)

程式碼換行

有時候一行程式碼可能會太長,影響可讀性。Python 允許你將一行程式碼分成多行:

  1. 使用反斜線 \ (explicit line joining):
    python
    total_sum = 1 + 2 + 3 + \
                4 + 5 + 6 # 反斜線後不能有任何字元,包括註解
    print(total_sum) # 輸出: 21
  2. 在括號 ()、中括號 [] 或大括號 {} 內 (implicit line joining): Python 會自動將括號內的內容視為同一行,這是比較推薦的方式,因為更易讀,且可以在換行後加上註解。
    python
    my_list = [
        1, 2, 3,  # 可以在這裡加註解
        4, 5, 6   # 也可以在這裡加註解
    ]
    long_string = ("這是一個非常長非常長的字串,"
                   "長到需要分成多行來顯示,"  # 註解1
                   "這樣程式碼會比較容易閱讀。") # 註解2
    print(long_string)

🔀 基本流程控制 Flow Control

流程控制語句讓你能夠根據不同的條件執行不同的程式碼路徑。

1. if-elif-else 語句

這是最基本的條件判斷語句。

python
score: int = 85

if score >= 90:
    grade: str = "A"
    print("表現優異!")
elif score >= 80: # "elif" 是 "else if" 的縮寫
    grade: str = "B"
    print("表現良好。")
elif score >= 70:
    grade: str = "C"
    print("仍需努力。")
else:
    grade: str = "D"
    print("需要加強輔導。")

print(f"你的成績是: {grade}")

程式會依序檢查 ifelif 的條件,一旦有一個條件成立,就會執行對應的程式碼塊,然後跳過其餘的 elifelse。如果所有 ifelif 的條件都不成立,則會執行 else 塊中的程式碼(如果有的話)。

2. 迴圈 (Loops)

迴圈允許你重複執行一段程式碼多次。Python 主要有兩種迴圈類型:for 迴圈和 while 迴圈。

for loop

for 迴圈用於迭代一個序列(例如列表、元組、字典、集合或字串)或其他可迭代的物件。

迭代列表 (Iterating over a list):

python
fruits: list[str] = ["蘋果", "香蕉", "橙"]
for fruit in fruits: # fruit 變數在每次迭代時會取列表中的一個元素
    print(f"我喜歡吃 {fruit}")

# 輸出:
# 我喜歡吃 蘋果
# 我喜歡吃 香蕉
# 我喜歡吃 橙

使用 range() 函數迭代一定次數:range() 函數可以產生一個數字序列,常用於控制 for 迴圈的執行次數。 range(stop): 產生從 0 到 stop-1 的數字。 range(start, stop): 產生從 startstop-1 的數字。 range(start, stop, step): 產生從 startstop-1 的數字,每次增加 step

python
# 迭代 5 次 (從 0 到 4)
for i in range(5):
    print(f"迭代次數: {i}")

# 輸出:
# 迭代次數: 0
# 迭代次數: 1
# 迭代次數: 2
# 迭代次數: 3
# 迭代次數: 4

# 從 2 迭代到 5 (不包含 6)
for num in range(2, 6):
    print(f"數字: {num}")

# 輸出:
# 數字: 2
# 數字: 3
# 數字: 4
# 數字: 5

在前面的密碼產生器範例中,for _ in range(remaining_length): 就是使用 range() 來重複執行特定次數的 append 操作。下劃線 _ 作為變數名通常表示我們不關心迴圈計數器的具體值,只關心迴圈的次數。

while loop

while 迴圈會在給定的條件為真 (True) 時,持續執行其內部的程式碼塊。

python
count: int = 0
while count < 3: # 只要 count 小於 3,就繼續迴圈
    print(f"While 迴圈計數: {count}")
    count += 1 # 非常重要:更新條件變數,否則可能造成無限迴圈!

# 輸出:
# While 迴圈計數: 0
# While 迴圈計數: 1
# While 迴圈計數: 2

print("迴圈結束")

重要提示:使用 while 迴圈時,必須確保迴圈內部有邏輯能夠最終使迴圈條件變為假 (False),否則會導致無限迴圈,程式將會卡住。

迴圈是程式設計中非常強大的工具,用於處理重複性任務和遍歷數據集合。

🚀 執行 Python 腳本

  1. 儲存檔案:將你的 Python 程式碼儲存到一個副檔名為 .py 的檔案,例如 my_first_script.py
  2. 開啟終端機或命令提示字元
  3. 導航到檔案目錄:使用 cd (change directory) 指令切換到你儲存腳本的資料夾。
  4. 執行腳本:輸入以下指令:
    bash
    python3 my_first_script.py
    或者,如果你的系統將 python 命令連結到 Python 3,也可以使用:
    bash
    python my_first_script.py

🗣️ 處理程式參數 (Program Arguments)

有時候,你會希望你的腳本在執行時可以接收外部傳入的參數。Python 的 sys 模組可以幫助你做到這點。sys.argv 是一個列表 (list),包含了所有命令列參數。

  • sys.argv[0]:腳本本身的名稱。
  • sys.argv[1]:第一個參數。
  • sys.argv[2]:第二個參數,以此類推。
python
# save_as_arg_script.py
import sys

# 檢查是否有足夠的參數傳入
if len(sys.argv) > 1:
    # sys.argv[0] 是腳本名稱, sys.argv[1] 是第一個實際參數
    first_argument = sys.argv[1]
    print(f"你提供的第一個參數是: {first_argument}")

    if len(sys.argv) > 2:
        second_argument = sys.argv[2]
        print(f"你提供的第二個參數是: {second_argument}")
else:
    # 如果沒有提供參數 (除了腳本名稱本身)
    print("請至少提供一個參數。")
    print(f"用法: python3 {sys.argv[0]} <參數1> [參數2]") # sys.argv[0] 顯示腳本名稱

# 如何執行:
# python3 arg_script.py Hello
# 輸出: 你提供的第一個參數是: Hello
#
# python3 arg_script.py "Hello World" 123
# 輸出: 你提供的第一個參數是: Hello World
#       你提供的第二個參數是: 123

注意:所有 sys.argv 列表中的元素都是字串類型。如果參數代表數字,你需要手動將其轉換為數字類型 (例如 int()float())。

🧩 整合範例:完整的 Python 腳本 - 強密碼產生器

現在將前面的概念整合起來,編寫一個簡單但實用的強密碼產生器。這個腳本將從命令列接收期望的密碼長度(必須至少為 8),然後產生一個包含大小寫字母、數字和標點符號的隨機密碼。

python
# Filename: password_generator_arg_v2.py
# 這是一個強密碼產生器腳本,密碼長度必須至少為 8。

import random  # 用於從序列中隨機選取元素
import string  # 包含常用的字串常數,如字母、數字、標點符號
import sys     # 用於處理命令列參數

def generate_strong_password(length: int) -> str:
    """
    根據指定的長度產生一個強密碼。
    假設傳入的 length 已經過驗證,符合最小長度要求 (>=8)。
    密碼將包含小寫字母、大寫字母、數字和標點符號。

    參數:
        length (int): 期望的密碼長度。

    回傳:
        str: 產生的隨機密碼。
    """
    # 定義密碼中可能包含的字元類型
    lowercase_letters = string.ascii_lowercase
    uppercase_letters = string.ascii_uppercase
    digits = string.digits
    punctuation = string.punctuation

    # 將所有字元類型合併成一個大的字元池
    all_characters = lowercase_letters + uppercase_letters + digits + punctuation

    password_chars = []
    # 由於 length >= 8,我們確保每種類型的字元至少出現一次
    password_chars.append(random.choice(lowercase_letters))
    password_chars.append(random.choice(uppercase_letters))
    password_chars.append(random.choice(digits))
    password_chars.append(random.choice(punctuation))
    
    # 填滿剩餘的長度
    remaining_length = length - 4 # 已經用了4個字元
    for _ in range(remaining_length):
        password_chars.append(random.choice(all_characters))
    
    # 將列表中的字元隨機打亂順序,避免固定模式
    random.shuffle(password_chars)
            
    # 將字元列表轉換為字串
    password = "".join(password_chars)
    return password

def main():
    """
    腳本的主要執行邏輯。
    從命令列參數獲取期望的密碼長度,驗證後產生並顯示密碼。
    """
    print("--- 🔐 強密碼產生器 🔐 ---")

    if len(sys.argv) != 2: # 檢查是否提供了剛好一個參數 (腳本名之後的長度)
        print("用法: python3 password_generator_arg_v2.py <密碼長度>")
        print("注意: 密碼長度必須至少為 8。")
        print("範例: python3 password_generator_arg_v2.py 12")
        sys.exit(1) # 退出程式,表示有錯誤

    try:
        password_length_str = sys.argv[1]
        password_length = int(password_length_str) # 嘗試將參數轉換為整數

        if password_length < 8:
            print(f"錯誤:密碼長度必須至少為 8 個字元。你輸入的是: {password_length}")
            sys.exit(1)
        elif password_length > 128: # 設定一個合理的上限
            print(f"錯誤:密碼長度過長 (建議上限 128)。你輸入的是: {password_length}")
            sys.exit(1)

    except ValueError:
        print(f"錯誤:無效的長度 '{password_length_str}'。請提供一個有效的數字作為長度。")
        sys.exit(1)

    # 產生密碼
    new_password: str = generate_strong_password(password_length)

    print(f"\n✨ 你產生的強密碼 ({password_length} 位) 是: {new_password}")
    print("\n請妥善保管你的密碼!")

# --- 主程式邏輯 ---
if __name__ == '__main__':
    main()

如何執行這個腳本:

  1. 將上面的程式碼儲存為 password_generator_arg_v2.py

  2. 打開終端機或命令提示字元,導航到儲存檔案的目錄。

  3. 成功執行範例 (密碼長度為 12):

    bash
    python3 password_generator_arg_v2.py 12

    預期輸出(密碼會隨機產生):

    --- 🔐 強密碼產生器 🔐 ---
    
    ✨ 你產生的強密碼 (12 位) 是: k!S9p@GqL2&X
    
    請妥善保管你的密碼!
  4. 失敗執行範例 (輸入非整數長度):

    bash
    python3 password_generator_arg_v2.py abc

    預期輸出:

    --- 🔐 強密碼產生器 🔐 ---
    錯誤:無效的長度 'abc'。請提供一個有效的數字作為長度。

🎉 總結

恭喜你!你已經學習了編寫 Python 腳本的基礎知識,包括程式結構、如何使用註解、變數宣告與類型提示、函數定義、縮排規則、程式碼換行技巧、基本的流程控制語句、腳本的執行方法,以及如何處理命令列參數。

Python 的世界非常廣闊,這篇文章只是你旅程的開始。不斷練習,嘗試編寫更多不同功能的腳本,並積極查閱官方文件和社群資源,你會發現 Python 是一個強大且充滿樂趣的工具。祝你編程愉快!

📚 參考資料

KF Software House