# SO代碼我們的感情好像跳樓機
# 元組創建時,可以省略括號:my_tuple4 = 10, 20, 'thirty'
# 字符串要加“ ”
元組
一、創建
my_tuple1 = (1, 2, 3)
my_tuple2 = ('a', 'b', 'c')
my_tuple3 = (1, 'hello', 3.14, [4, 5]) # 可以包含不同類型的元素
print(my_tuple1)
print(my_tuple2)
print(my_tuple3)查看類型
print(type(my_tuple2)) # 創建空元組
empty_tuple = ()
# 或者使用 tuple() 函數
empty_tuple2 = tuple()
print(empty_tuple)
print(empty_tuple2)
二、常見用法
(一)索引
my_tuple = ('P', 'y', 't', 'h', 'o', 'n')
print(my_tuple[0]) # 第一個元素
print(my_tuple[2]) # 第三個元素
print(my_tuple[-1]) # 最后一個元素
(二)切片(取值)
my_tuple = (0, 1, 2, 3, 4, 5)
print(my_tuple[1:4]) # 從索引 1 到 3 (不包括 4)
print(my_tuple[:3]) # 從開頭到索引 2
print(my_tuple[3:]) # 從索引 3 到結尾
print(my_tuple[::2]) # 每隔一個元素取一個
(三)長度獲取
my_tuple = (1, 2, 3)
print(len(my_tuple))
三、管道與元組
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score# 1. 加載數據
iris = load_iris()
X = iris.data
y = iris.target# 2. 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 3. 構建管道
# 管道按順序執行以下步驟:
# - StandardScaler(): 標準化數據(移除均值并縮放到單位方差)
# - LogisticRegression(): 邏輯回歸分類器
pipeline = Pipeline([('scaler', StandardScaler()),('logreg', LogisticRegression())
])# 4. 訓練模型
pipeline.fit(X_train, y_train)# 5. 預測
y_pred = pipeline.predict(X_test)# 6. 評估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"模型在測試集上的準確率: {accuracy:.2f}")
可迭代對象
一個可迭代對象:能夠一次返回其成員(元素)的對象,可在一個循環(如 for 循環)中遍歷
序列類型:list、tuple`(元組)、str?(字符串)、range(范圍)
集合類型:set?(集合)
字典類型:字典、文件對象 、生成器、迭代器
# 列表 (list)
print("迭代列表:")
my_list = [1, 2, 3, 4, 5]
for item in my_list:print(item)# 元組 (tuple)
print("迭代元組:")
my_tuple = ('a', 'b', 'c')
for item in my_tuple:print(item)# 字符串 (str)
print("迭代字符串:")
my_string = "hello"
for char in my_string:print(char)# range (范圍)
print("迭代 range:")
for number in range(5): # 生成 0, 1, 2, 3, 4print(number)# 集合類型 (Set Types)# 集合 (set) - 注意集合是無序的,所以每次迭代的順序可能不同
print("迭代集合:")
my_set = {3, 1, 4, 1, 5, 9}
for item in my_set:print(item)# 迭代字典的值 (values)
print("迭代字典的值:")
for value in my_dict.values():print(value)# 迭代字典的鍵值對 (items)
print("迭代字典的鍵值對:")
for key, value in my_dict.items(): # items方法很好用print(f"Key: {key}, Value: {value}")
OS模塊
處理圖像數據集、自定義數據加載流程、保存和加載復雜的模型結構時,os 模塊非常有用
(一)讀取路徑
import os
os.getcwd()
為什么不直接復制路徑?
假設你直接右鍵復制了絕對路徑?/Users/you/projects/data.csv
,可能會遇到以下問題:
-
換臺電腦就失效:在另一臺電腦上,路徑可能變成?
/Users/another/data.csv
。 -
協作時出錯:團隊成員的文件結構可能不同,硬編碼路徑會導致代碼無法共享。
-
目錄變化時維護成本高:如果文件移動到其他位置,需要修改所有相關代碼。
(二)獲取文件列表
os.listdir() # list directory 獲取當前工作目錄下的文件列表
import os# 在腳本開頭獲取當前工作目錄
BASE_DIR = os.getcwd()# 構建數據文件路徑
data_path = os.path.join(BASE_DIR, "data", "input.csv")
output_path = os.path.join(BASE_DIR, "results", "output.csv")# 使用路徑
with open(data_path, "r") as f:data = f.read()# 保存結果
with open(output_path, "w") as f:f.write(data)
使用 r'' 原始字符串,這樣就不需要寫雙反斜杠 \\,因為\會涉及到轉義問題
path_a = r'C:\Users\YourUsername\Documents' # r''這個寫法是寫給python解釋器看,他只會讀取引號內的內容,不用在意r的存在會不會影響拼接
path_b = 'MyProjectData'
file = 'results.csv'# 使用 os.path.join 將它們安全地拼接起來,os.path.join 會自動使用 Windows 的反斜杠 '\' 作為分隔符
file_path = os.path.join(path_a , path_b, file)file_path
在 Python 中,反斜杠?\
?是用來表示轉義字符的。例如:
\n
?表示換行符\t
?表示制表符\"
?表示雙引號(用于在字符串中包含雙引號)
但在?Windows 文件路徑?中,路徑分隔符是?\
(例如:C:\Users\data.csv
),這就會產生沖突
如果直接在字符串中使用單斜杠?\
,Python 會將其視為轉義字符,導致路徑解析錯誤
(三)環境變量方法
# 使用 .items() 方法可以方便地同時獲取變量名(鍵)和變量值,之前已經提過字典的items()方法,可以取出來鍵和值
# os.environ是可迭代對象for variable_name, value in os.environ.items():# 直接打印出變量名和對應的值print(f"{variable_name}={value}")# 打印總數
print(f"\n--- 總共檢測到 {len(os.environ)} 個環境變量 ---")
目錄樹
C:\
├── Documents
│ ├── report.txt
│ └── project_folder
│ ├── data.csv
│ └── README.md
├── Pictures
│ ├── landscape.jpg
│ └── portrait.png
└── Downloads
常見用途
-
批量處理文件:例如重命名所有圖片文件、壓縮文件夾等。
-
搜索文件:查找特定類型的文件(如?
.csv
、.txt
)。 -
統計目錄信息:計算目錄大小、文件數量等
遍歷數據目錄并加載數據
import os
from PIL import Image
import numpy as npdata_dir = "data" # 數據根目錄
train_dir = os.path.join(data_dir, "train")
test_dir = os.path.join(data_dir, "test")# 加載訓練數據
X_train, y_train = [], []
for class_name in os.listdir(train_dir):class_dir = os.path.join(train_dir, class_name)if os.path.isdir(class_dir): # 確保是目錄for img_name in os.listdir(class_dir):img_path = os.path.join(class_dir, img_name)if img_path.endswith(('.jpg', '.jpeg', '.png')):# 加載圖像并預處理(示例:轉為NumPy數組)img = Image.open(img_path).resize((224, 224))img_array = np.array(img) / 255.0 # 歸一化X_train.append(img_array)y_train.append(class_name) # 類別標簽# 轉換為NumPy數組(用于深度學習模型)
X_train = np.array(X_train)
y_train = np.array(y_train)print(f"訓練數據形狀: {X_train.shape}")
print(f"訓練標簽數量: {len(y_train)}")
@浙大疏錦行