各位程式碼探險家們,大家好!昨天我們深入學習了 Dictionary (字典) 這個強大的資料型態,它讓我們能夠以鍵值對的形式,系統化地儲存和管理資訊,這對於遊戲中複雜的資料結構(例如卡牌屬性或角色設定)至關重要。今天,我們要將視野從單一的資料型態擴展到程式碼的組織上,介紹一個在大型專案開發中不可或缺的概念:Module (模組)。
Python 零基礎新手入門 #09 Module (模組):
https://www.youtube.com/watch?v=I-xm8wVqO1o&list=TLGGtRQRCRQXIvAxMjA5MjAyNQ&t=1s
想像一下,隨著我們《奇幻卡牌競技場》遊戲專案的逐步推進,程式碼會越來越多,結構也會越來越複雜。如果所有程式碼都寫在一個檔案裡,很快就會變得難以閱讀、管理和維護。這時候,「模組化」 的概念就應運而生了。
模組 (Module) 簡單來說,就是一個 包含 Python 程式碼的檔案。我們可以將功能相關的程式碼(例如所有關於卡牌定義的程式碼、或所有關於遊戲邏輯的程式碼)拆分到不同的 .py 檔案中。每個 .py 檔案都可以被視為一個模組。透過模組化,我們不僅能讓程式碼保持整潔,也能提高程式碼的可重用性。
在 PyCharm 中建立模組非常簡單。你只需要在左側的專案欄位點擊右鍵,選擇「新增 (New)」->「Python 檔案 (Python File)」,然後為你的模組取一個有意義的名字,例如 my_module.py。一旦建立,你就可以在這個新檔案中撰寫任何所需的程式碼,例如定義函式、變數、清單或字典。
當你希望在另一個 Python 檔案中使用這個模組中定義的功能時,就需要將它 「匯入」(import) 進來。我們使用 import 語法來匯入模組,後面接著模組的名稱(不需要 .py 副檔名)。
# my_module.py (模組檔案)
def greet(name):
return f"哈囉,{name}!"
my_variable = "這是一個模組變數"
# main.py (主程式檔案)
import my_module
print(my_module.greet("鐵人賽選手")) # 呼叫模組中的函式
print(my_module.my_variable) # 存取模組中的變數
如果模組名稱比較長或你希望更簡潔地使用,可以為它 取一個暱稱 (alias):
import my_module as mm # 為 my_module 取暱稱 mm
print(mm.greet("勇者"))
有時,一個模組可能提供了很多功能,但你只需要使用其中的一兩個函式。這時,你可以使用 from ... import ... 語法來選擇性地匯入特定函式,這樣在呼叫時就不需要加上模組名稱了:
from my_module import greet # 只匯入 greet 函式
print(greet("冒險家"))
除了我們自己建立的模組外,Python 本身也內建了許多實用的模組,涵蓋了數學計算、日期處理、網路操作等各方面。今天,我們將深入探討一個在遊戲開發中非常常用,能夠增加遊戲隨機性和趣味性的模組:random (隨機) 模組。
random 模組提供了許多生成隨機數和隨機選擇的函式:
• random.shuffle(list):將一個清單的元素隨機洗牌,打亂順序。
• random.choice(list):從給定的清單中隨機選擇一個元素。
• random.randint(a, b):生成一個介於 a 和 b 之間(包含 a 和 b)的隨機整數。
import random
cards = ["劍士", "弓箭手", "魔法師", "盜賊"]
random.shuffle(cards) # 隨機打亂清單順序
print(f"洗牌後的卡牌:{cards}")
chosen_card = random.choice(cards) # 隨機選擇一張卡牌
print(f"隨機抽到的卡牌:{chosen_card}")
random_number = random.randint(1, 100) # 生成 1 到 100 的隨機整數
print(f"隨機數:{random_number}")
讓我們將模組的概念應用到兩個實用的案例中:
import random
import string # 匯入 string 模組,用於獲取常用字元集
def generate_password(length):
# string.digits 包含 '0123456789'
# string.ascii_letters 包含所有大小寫英文字母
characters = list(string.digits + string.ascii_letters) # 將字元組合成清單
random.shuffle(characters) # 洗牌,打亂字元順序
# 從打亂後的字元中選取指定長度的部分
password_list = characters[:length] # 切片獲取前 length 個字元
password = "".join(password_list) # 將清單中的字元合併成字串
return password
# 讓使用者輸入密碼長度
try:
password_length = int(input("請輸入您想要的密碼長度:"))
if password_length > 0:
new_password = generate_password(password_length)
print(f"生成的隨機密碼是:{new_password}")
else:
print("密碼長度必須大於 0。")
except ValueError:
print("請輸入有效的數字。")
這個範例展示了 random.shuffle() 如何打亂字元,以及 string 模組如何提供預定義的字元集,最後再使用 join() 語法將清單轉回字串。
pip install requests
安裝完成後,你就可以使用 requests 模組來向天氣 API 請求資料,並將回傳的 JSON 格式資料轉換成 Python 字典,然後從中提取資訊。
import requests # 匯入 requests 模組
import json # 通常處理 JSON 資料時會用到,但 requests.json() 已內建此功能
# 你需要一個 OpenWeatherMap 的 API Key,請自行註冊並替換 'YOUR_API_KEY'
# 為了示範,這裡使用了一個範例連結,實際開發中請替換為你的 API Key
# 來源中提供的 API Key 和網址結構示範了如何構建
# 以下是一個簡化版,實際API會更複雜
# api_key = "YOUR_API_KEY" # 替換成你的實際 API Key
def get_weather(city_name):
# 這是一個示意用的 URL,請根據 OpenWeatherMap 的文件構建正確的 URL
# 實際來源提供了一個類似的結構,說明如何填入城市名稱和 API Key
# 例如:https://api.openweathermap.org/data/2.5/weather?q={city_name}&appid={api_key}
# 這裡我們使用一個公開的測試 API 連結,不包含實際 Key
# (此連結為虛構,僅為說明概念,實際使用需替換為有效的 API)
url = f"https://api.example.com/weather?q={city_name}&units=metric" # 假定返回攝氏度
try:
response = requests.get(url) # 發送 GET 請求
response.raise_for_status() # 檢查是否有 HTTP 錯誤
weather_data = response.json() # 將回傳的資料轉換為 Python 字典
# 根據 API 回傳的字典結構來提取資料
# 來源中提到如何根據 'main' 和 'temp' 鍵來獲取氣溫
if "main" in weather_data and "temp" in weather_data["main"]:
temperature = weather_data["main"]["temp"]
# 來源中提到克氏溫標轉攝氏度需要減去 273.15
# 如果API直接返回攝氏度,則不需要轉換
# temperature_celsius = temperature - 273.15 # 範例轉換
# print(f"{city_name} 的目前氣溫是:{int(temperature_celsius)}°C") # 轉為整數
print(f"{city_name} 的目前氣溫是:{int(temperature)}°C") # 如果API直接返回攝氏度
else:
print(f"無法取得 {city_name} 的氣溫資料。")
except requests.exceptions.RequestException as e:
print(f"查詢失敗:{e}。請檢查城市名稱或網路連線。")
except KeyError:
print(f"無法解析 {city_name} 的天氣資料,請確認 API 回傳格式。")
# 讓使用者輸入城市名稱
city = input("請輸入您想查詢的城市名稱:")
get_weather(city)
這個範例展示了如何使用 pip install 來安裝 requests 這個第三方套件,然後利用 requests.get() 方法來發送網路請求,並透過 .json() 方法將回傳的資料直接轉換為 Python 字典 格式。隨後,我們就可以像操作普通字典一樣,透過 Key 來存取所需的資訊,例如城市名稱和氣溫。
恭喜您!今天我們學習了 Python 中 Module (模組) 的概念,它讓複雜的程式碼能夠被有效地組織和重用。我們學會了如何建立、匯入模組,以及如何利用內建的 random 模組 和安裝第三方套件 requests 來實現更豐富的功能。模組化是邁向更大型、更可維護專案的關鍵一步,這對於我們未來的遊戲開發至關重要。明天,我們將介紹物件導向程式設計的基石:Class (類別),敬請期待!