Python 腳本編寫入門
Python 是一種廣受歡迎且對初學者友善的程式語言。它的語法簡潔易懂,非常適合用來編寫各種小工具和自動化腳本。本文將引導你逐步學習如何編寫你的第一個 Python 腳本,從最基本的概念開始,一直到一個可以實際運行的例子。
📖 Python 程式的基本結構
一個 Python 腳本通常是一個包含 Python 程式碼的 .py
檔案。一個典型的 Python 腳本結構包含以下幾個部分:
註解 Comments
在編寫任何程式碼之前,了解如何使用註解非常重要,因為它們能幫助解釋程式碼。註解不會被 Python 直譯器執行。
單行註解: 以 #
符號開頭,從 #
到該行結尾的內容都會被視為註解。
# 這是一條單行註解,用來解釋下面的程式碼
x = 5 # 這也是一條註解,在程式碼的同一行
多行註解: Python 並沒有專門的多行註解符號。但你可以使用多個 #
,或者使用未賦值給變數的多行字串 (以 '''
或 """
包圍) 來達到多行註解的效果。後者也常用於函數或類別的說明文件 (docstrings)。
# 這是第一行註解
# 這是第二行註解
"""
這是一個使用多行字串實現的註解區塊。
它常被用作 docstring。
"""
'''
這也是一個多行字串註解。
'''
1. Import 區段
如果你的腳本需要使用 Python 標準庫或其他第三方庫的功能,通常會在檔案的開頭(註解之後)使用 import
關鍵字來匯入這些模組。
import sys # 匯入 sys 模組
import os # 匯入 os 模組
2. 程式主體
在 Import 區段之後,是腳本的主要邏輯所在。這裡可以包含:
- 變數宣告 (Variable declarations):定義腳本中使用的數據。
- 函數定義 (Function definitions):使用
def
關鍵字定義可重複使用的程式碼塊。 - 類別定義 (Class definitions):使用
class
關鍵字定義物件的藍圖 (本文不詳細介紹類別)。 - 流程控制語句 (Flow control statements):如
if-else
判斷、迴圈等。
這些元素構成了腳本的核心功能。例如:
# 變數宣告
PI_APPROXIMATION = 3.14159
# 函數定義
def calculate_area(radius):
return PI_APPROXIMATION * radius * radius
# 簡單的流程控制
some_condition = True
if some_condition:
print("條件為真")
我們會在後續章節詳細講解這些元素。
3. if __name__ == '__main__':
(可選)
你可能會經常看到這段程式碼,通常放在腳本的末尾:
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 會自動根據你賦予的值來推斷。
message = "Hello, Python!" # 字串 (string)
count = 10 # 整數 (integer)
pi_value = 3.14159 # 浮點數 (float)
is_active = True # 布林值 (boolean)
類型提示 (Type Hints)
雖然 Python 是動態類型語言,但從 Python 3.5 開始,引入了類型提示 (Type Hints) 功能。類型提示可以增加程式碼的可讀性和可維護性,並且可以被一些靜態分析工具用來檢查錯誤。
name: str = "Alice"
age: int = 30
height: float = 1.75
is_student: bool = False
類型提示並不會在執行時期強制類型檢查,它們更像是一種對開發者和工具的提示。
函數定義 (Function Declaration)
函數是一段可以重複使用的程式碼塊,用來執行特定的任務。使用 def
關鍵字來定義函數。
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 個空格作為一級縮排。保持縮排的一致性非常重要,否則程式會出錯。
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 允許你將一行程式碼分成多行:
- 使用反斜線
\
(explicit line joining):pythontotal_sum = 1 + 2 + 3 + \ 4 + 5 + 6 # 反斜線後不能有任何字元,包括註解 print(total_sum) # 輸出: 21
- 在括號
()
、中括號[]
或大括號{}
內 (implicit line joining): Python 會自動將括號內的內容視為同一行,這是比較推薦的方式,因為更易讀,且可以在換行後加上註解。pythonmy_list = [ 1, 2, 3, # 可以在這裡加註解 4, 5, 6 # 也可以在這裡加註解 ] long_string = ("這是一個非常長非常長的字串," "長到需要分成多行來顯示," # 註解1 "這樣程式碼會比較容易閱讀。") # 註解2 print(long_string)
🔀 基本流程控制 Flow Control
流程控制語句讓你能夠根據不同的條件執行不同的程式碼路徑。
1. if-elif-else
語句
這是最基本的條件判斷語句。
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}")
程式會依序檢查 if
和 elif
的條件,一旦有一個條件成立,就會執行對應的程式碼塊,然後跳過其餘的 elif
和 else
。如果所有 if
和 elif
的條件都不成立,則會執行 else
塊中的程式碼(如果有的話)。
2. 迴圈 (Loops)
迴圈允許你重複執行一段程式碼多次。Python 主要有兩種迴圈類型:for
迴圈和 while
迴圈。
for
loop
for
迴圈用於迭代一個序列(例如列表、元組、字典、集合或字串)或其他可迭代的物件。
迭代列表 (Iterating over a list):
fruits: list[str] = ["蘋果", "香蕉", "橙"]
for fruit in fruits: # fruit 變數在每次迭代時會取列表中的一個元素
print(f"我喜歡吃 {fruit}")
# 輸出:
# 我喜歡吃 蘋果
# 我喜歡吃 香蕉
# 我喜歡吃 橙
使用 range()
函數迭代一定次數:range()
函數可以產生一個數字序列,常用於控制 for
迴圈的執行次數。 range(stop)
: 產生從 0 到 stop-1
的數字。 range(start, stop)
: 產生從 start
到 stop-1
的數字。 range(start, stop, step)
: 產生從 start
到 stop-1
的數字,每次增加 step
。
# 迭代 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) 時,持續執行其內部的程式碼塊。
count: int = 0
while count < 3: # 只要 count 小於 3,就繼續迴圈
print(f"While 迴圈計數: {count}")
count += 1 # 非常重要:更新條件變數,否則可能造成無限迴圈!
# 輸出:
# While 迴圈計數: 0
# While 迴圈計數: 1
# While 迴圈計數: 2
print("迴圈結束")
重要提示:使用 while
迴圈時,必須確保迴圈內部有邏輯能夠最終使迴圈條件變為假 (False),否則會導致無限迴圈,程式將會卡住。
迴圈是程式設計中非常強大的工具,用於處理重複性任務和遍歷數據集合。
🚀 執行 Python 腳本
- 儲存檔案:將你的 Python 程式碼儲存到一個副檔名為
.py
的檔案,例如my_first_script.py
。 - 開啟終端機或命令提示字元。
- 導航到檔案目錄:使用
cd
(change directory) 指令切換到你儲存腳本的資料夾。 - 執行腳本:輸入以下指令:bash或者,如果你的系統將
python3 my_first_script.py
python
命令連結到 Python 3,也可以使用:bashpython my_first_script.py
🗣️ 處理程式參數 (Program Arguments)
有時候,你會希望你的腳本在執行時可以接收外部傳入的參數。Python 的 sys
模組可以幫助你做到這點。sys.argv
是一個列表 (list),包含了所有命令列參數。
sys.argv[0]
:腳本本身的名稱。sys.argv[1]
:第一個參數。sys.argv[2]
:第二個參數,以此類推。
# 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),然後產生一個包含大小寫字母、數字和標點符號的隨機密碼。
# 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()
如何執行這個腳本:
將上面的程式碼儲存為
password_generator_arg_v2.py
。打開終端機或命令提示字元,導航到儲存檔案的目錄。
成功執行範例 (密碼長度為 12):
bashpython3 password_generator_arg_v2.py 12
預期輸出(密碼會隨機產生):
--- 🔐 強密碼產生器 🔐 --- ✨ 你產生的強密碼 (12 位) 是: k!S9p@GqL2&X 請妥善保管你的密碼!
失敗執行範例 (輸入非整數長度):
bashpython3 password_generator_arg_v2.py abc
預期輸出:
--- 🔐 強密碼產生器 🔐 --- 錯誤:無效的長度 'abc'。請提供一個有效的數字作為長度。
🎉 總結
恭喜你!你已經學習了編寫 Python 腳本的基礎知識,包括程式結構、如何使用註解、變數宣告與類型提示、函數定義、縮排規則、程式碼換行技巧、基本的流程控制語句、腳本的執行方法,以及如何處理命令列參數。
Python 的世界非常廣闊,這篇文章只是你旅程的開始。不斷練習,嘗試編寫更多不同功能的腳本,並積極查閱官方文件和社群資源,你會發現 Python 是一個強大且充滿樂趣的工具。祝你編程愉快!
📚 參考資料
- Python Official Documentation (英文)
- The Python Tutorial (官方教學 - 英文)
- PEP 8 -- Style Guide for Python Code (Python 程式碼風格指南 - 英文) (關於註解和程式碼風格的建議)
- Python
sys
module documentation (英文)