# 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)}")
@浙大疏锦行