第2章:Python基础速通(上)——环境配置与核心语法
各位同学,欢迎来到Python基础速通的上半场。说实话,我见过太多材料科学的研究者,一提到编程就头疼。其实Python没那么可怕,它就是个工具,跟你的扫描电镜、XRD衍射仪一样,用熟了就是顺手的事。
这一章,咱们先把Python的“实验室”搭起来,再搞定最核心的几个数据类型和控制结构。别急,慢慢来。
2.1 Python环境配置:Anaconda + Jupyter
我个人习惯用Anaconda来管理Python环境。为什么?因为材料科学经常需要各种科学计算库(NumPy、SciPy、pandas),Anaconda一次性帮你装好了,省得你一个个去pip安装,踩坑踩到怀疑人生。
2.1.1 安装Anaconda
去官网下载对应操作系统的安装包。Windows用户记得勾选“Add Anaconda to my PATH environment variable”——嗯,这一步我当年没勾,结果命令行里死活找不到conda命令,折腾了半小时。
2.1.2 创建虚拟环境
虚拟环境这东西,说白了就是给你的每个项目一个独立的“小房间”。材料科学的项目往往依赖不同版本的库,比如有的项目用TensorFlow 1.x,有的用2.x,混在一起会出大问题。
# 创建一个名为materials的虚拟环境,Python版本3.9
conda create -n materials python=3.9
# 激活环境
conda activate materials
# 安装常用科学计算库
conda install numpy scipy pandas matplotlib jupyter
你想想看,每次换项目就换一个环境,干净又清爽。我在做合金相图预测时,就专门建了一个环境装pymatgen和ase,跟其他项目完全隔离。
2.1.3 Jupyter Notebook入门
Jupyter Notebook是我最推荐的交互式编程工具。它把代码、运行结果、图表、文字说明都放在一个文档里,特别适合做数据分析的探索性工作。
# 启动Jupyter
jupyter notebook
启动后浏览器会自动打开一个页面,点“New” -> “Python 3”就能新建一个笔记本。快捷键记两个:Shift+Enter运行当前单元格,Esc + m把单元格切换成Markdown模式(写注释用)。
2.2 变量与数据类型
Python的变量不需要声明类型,直接赋值就行。这跟C语言、Fortran完全不一样,刚开始可能会不习惯,但用久了你会觉得——真香。
2.2.1 基本数据类型
| 类型 | 示例 | 说明 |
|---|---|---|
| 整数 (int) | a = 42 |
材料科学里常用来表示原子序数、晶格参数 |
| 浮点数 (float) | b = 3.14159 |
键长、能量值、温度等连续量 |
| 字符串 (str) | c = "Fe" |
元素符号、材料名称、文件路径 |
| 布尔值 (bool) | d = True |
判断条件是否成立 |
# 实际项目中的例子
element = "Ti" # 钛元素
atomic_number = 22 # 原子序数
lattice_constant = 2.95 # 晶格常数(埃)
is_metal = True # 是金属
print(f"{element}的原子序数是{atomic_number},晶格常数为{lattice_constant}Å")
# 输出:Ti的原子序数是22,晶格常数为2.95Å
2.2.2 类型转换
有时候从文件读进来的数据是字符串,但你需要做数学运算,就得转换类型。我在处理实验数据时经常遇到这种情况。
# 从CSV文件读到的数据是字符串
temp_str = "298.15"
temp_float = float(temp_str) # 转成浮点数
temp_kelvin = temp_float + 273.15 # 现在可以做运算了
# 反过来,把数字转成字符串用于输出
print("温度是" + str(temp_kelvin) + "K")
"5" + 3 会报错,必须先把字符串转成数字。
2.3 列表与字典
这两种数据结构在材料科学中太常用了。列表就像一排试管架,按顺序放着你的样品;字典就像元素周期表,通过名字(键)找到对应的属性(值)。
2.3.1 列表(List)
列表用方括号 [] 表示,可以放任意类型的数据。索引从0开始,这跟大多数编程语言一样。
# 创建一个合金成分列表
alloys = ["Fe-3Si", "Fe-6.5Si", "Fe-9Si"]
print(alloys[0]) # 输出:Fe-3Si
# 列表常用操作
alloys.append("Fe-12Si") # 添加元素
alloys.insert(1, "Fe-4.5Si") # 在指定位置插入
alloys.remove("Fe-3Si") # 删除元素
print(len(alloys)) # 获取列表长度
# 切片操作——提取子列表
first_two = alloys[:2] # 前两个元素
last_one = alloys[-1] # 最后一个元素
我记得有一次处理1000多个合金样品的成分数据,就是用列表的切片和循环,几行代码就搞定了筛选工作。要是手动在Excel里操作,估计得加班到半夜。
2.3.2 字典(Dictionary)
字典用花括号 {} 表示,每个元素是“键:值”对。键必须是不可变类型(字符串、数字等),值可以是任意类型。
# 存储一种材料的多种属性
material = {
"name": "钛合金Ti-6Al-4V",
"density": 4.43, # g/cm³
"melting_point": 1660, # °C
"young_modulus": 114, # GPa
"applications": ["航空发动机", "生物植入物", "船舶"]
}
# 访问字典中的值
print(material["name"]) # 输出:钛合金Ti-6Al-4V
print(material.get("poisson_ratio", "未记录")) # 安全访问,不存在时返回默认值
# 修改和添加
material["density"] = 4.42 # 修改已有键的值
material["yield_strength"] = 830 # 添加新键值对
2.4 条件与循环
条件判断让程序能“思考”,循环让程序能“重复劳动”。这两个控制结构,是写任何实用程序的基础。
2.4.1 if-elif-else条件判断
# 根据硬度值判断材料类型
hardness = 58 # HRC
if hardness < 20:
category = "软质材料"
elif hardness < 40:
category = "中等硬度"
elif hardness < 60:
category = "硬质材料"
else:
category = "超硬材料"
print(f"硬度{hardness}HRC属于{category}")
条件判断里有个坑,我刚开始学的时候踩过——Python用 == 判断相等,用 = 赋值。写条件时一不小心写成 if a = 5,编译器会报错。嗯,这个错误我犯过不下五次。
2.4.2 for循环
for循环用来遍历列表、字典等可迭代对象。在材料科学里,最常见的场景就是批量处理数据。
# 遍历合金列表,计算每个合金的密度(假设数据)
alloys = ["Al-2Cu", "Al-4Cu", "Al-6Cu"]
densities = [2.70, 2.75, 2.80] # g/cm³
for i in range(len(alloys)):
print(f"{alloys[i]}: {densities[i]} g/cm³")
# 更Pythonic的写法——用zip同时遍历两个列表
for alloy, density in zip(alloys, densities):
print(f"{alloy}: {density} g/cm³")
2.4.3 while循环
while循环适合不知道具体循环次数,但知道终止条件的场景。比如迭代计算直到收敛。
# 模拟迭代计算晶格常数,直到变化小于阈值
lattice = 3.0 # 初始值
tolerance = 0.001
change = 1.0
iteration = 0
while change > tolerance:
old_lattice = lattice
# 这里模拟某种迭代计算
lattice = lattice * 0.99 + 0.03
change = abs(lattice - old_lattice)
iteration += 1
print(f"第{iteration}次迭代: {lattice:.4f}Å")
print(f"收敛后的晶格常数: {lattice:.4f}Å")
2.5 本章知识体系
下面这张图把本章的核心知识点串起来了。你可以把它当作一张“地图”,学完后再回头看看,心里就有数了。
好了,这一章的内容就到这里。环境搭好了,变量、列表、字典会用了,条件循环也懂了——你已经可以写一些简单的材料数据处理脚本了。比如读取一个CSV文件,筛选出符合条件的样品,再输出结果。试试看?