3. Python基础语法回顾
做振镜打标自动化,说白了就是让Python跟激光振镜硬件“对话”。
你得像指挥家一样,告诉它“现在打哪里、打多深、速度多快”。
这些命令背后全是变量、数据类型、运算符这些基础语法。
我做了十几年工业自动化,发现很多新人上来就写复杂逻辑,
最后卡在最基础的语法细节上——真的没必要。
这一章,我会从实战出发,带你快速过一遍这些基础,
顺便聊聊我在振镜打标项目里踩过的坑。
3.1 变量——给你的数据起个名字
变量就像给一个数据贴标签。我说“speed = 500”,后面你再用 speed 这个名儿,Python 就知道是500。
在振镜打标里,我习惯把激光功率、打标速度、延迟时间都存成变量,
这样调参的时候改一个地方就行,不用满代码翻。
变量命名有几个硬规矩:
- 只能包含字母、数字、下划线,不能数字开头
- 区分大小写,
Speed和speed是两个变量 - 不能跟 Python 关键字重名(比如
if、for)
⚠ 坑我踩过: 我曾经用 mark_speed 写得好好的,后来为了省事改成 markspeed,结果跟模块函数冲突了。变量名尽量语义化,别偷懒。
# 振镜打标常用变量
power = 80 # 激光功率百分比
mark_speed = 500 # 打标速度 mm/s
delay = 0.5 # 开关光延时 ms
frequency = 20000 # 脉冲频率 Hz
print(power, mark_speed, delay, frequency)
3.2 数据类型——Python 知道你在说啥
Python 不需要你提前声明类型,它会自动判断。但如果你搞混了类型,程序会直接崩溃。
比如你把打标速度写成了字符串 "500",后面一计算就出 TypeError。
我建议刚入门时多用 type() 检查一下。
| 数据类型 | 举例 | 振镜打标场景 |
|---|---|---|
int | 500 | 脉冲频率、打标次数 |
float | 0.5 | 延迟时间、坐标偏移量 |
str | "circle_path" | 文件名、指令字符串 |
bool | True | 激光开关、是否启用补偿 |
# 实际项目中经常混着用
power = 80.0 # float
mark_mode = "点阵" # str
is_laser_on = False # bool
print(type(power)) # <class 'float'>
3.3 运算符——让数据动起来
运算符就是数学符号和逻辑符号,没它你什么计算都做不了。
在振镜打标里,我经常会用到:
- 算术运算符:
+ - * / // % **。比如计算打标头移动距离。 - 比较运算符:
== != > < >= <=。判断坐标是否在有效范围。 - 逻辑运算符:
and or not。组合多个条件。 - 赋值运算符:
= += -= *= /=。快速修改变量。
💡 我自己的习惯: 写打标路径时,用 //(整除)来算阵列数量,用 %(取余)来切换奇偶行的偏移方向。
# 运算符在振镜参数计算中的应用
total_width = 100 # 打标宽度 mm
columns = 5 # 阵列列数
step = total_width // columns # 整除得到间距 20
offset = total_width % columns # 余数 0 正好整除
print(f"间距: {step}mm, 多余: {offset}mm")
# 逻辑判断:功率不能超过100
power = 105
if power > 100 or power < 0:
print("⚠ 功率数值异常,已自动截断")
power = max(0, min(power, 100))
3.4 表达式——搭积木一样组合
表达式就是变量和运算符拼起来的“算式”。它可以简单到 a + 1,也可以复杂到多行。
有一个关键点容易出错——运算符优先级。我见过太多人因为没加括号导致结果离谱。
举个例子:result = 10 + 20 * 3,结果是70,不是90。因为乘法优先级高。
你在振镜打标里写 speed = base_speed + offset * ratio 时,
最好加上括号:speed = base_speed + (offset * ratio),清晰又安全。
# 表达式优先级示例
x = 5
y = 10
z = 3
result = x + y * z # 5 + 30 = 35
result2 = (x + y) * z # 15 * 3 = 45
print(result, result2)
# 振镜打标实际表达式:计算扫描角度补偿
angle = 45.0
compensation = (90 - angle) * 0.0174533 # 弧度转换
print(f"补偿值: {compensation:.4f}")
📌 给你的建议: 遇到不确定的优先级,直接加小括号。别为了省敲两个键,花两小时 debug。我每次代码审查都会把含多运算符的表达式拆成几步写,可读性高很多。
3.5 实战中的数据类型转换
你从配置文件读到的参数往往是字符串 "500",但计算时你需要整数或浮点数。这时候就要做类型转换。
转换方法:
int("500")→ 500float("0.5")→ 0.5str(80)→ "80"
注意转换失败会抛异常,最好用 try...except 兜底。
# 从用户输入或配置文件读取打标参数
user_input = input("请输入打标速度 (mm/s): ") # 输入 "500"
try:
speed = float(user_input)
print(f"速度已设置: {speed} mm/s")
except ValueError:
print("输入无效,使用默认速度 300 mm/s")
speed = 300.0
⚠ 我记得有一次: 客户配置文件里写的频率是 "20k",我用 int("20k") 直接崩了。后来我加了一个单位解析函数才搞定。建议对工业数据做严格的预处理。
3.6 综合示例:振镜打标速度计算
把今天学的串起来:变量 → 数据类型 → 运算符 → 表达式 → 实战。
# 参数配置
base_speed = 500 # int,基础速度
accel_factor = 1.2 # float,加速度补偿系数
is_high_quality = True # bool,是否高精度模式
# 数据类型转换(从字符配置读)
raw_offset = "10.5"
offset = float(raw_offset) # str → float
# 表达式计算最终速度
if is_high_quality:
final_speed = base_speed * 0.8 - offset # 高精度时降速
else:
final_speed = base_speed * accel_factor + offset
final_speed = int(final_speed) # 最终转成整数传给振镜卡
print(f"最终打标速度: {final_speed} mm/s")
🎯 本章要点总结表
| 语法元素 | 核心原则 | 振镜打标常见误区 |
|---|---|---|
| 变量 | 先赋值后使用,命名规范 | 拼写错误导致 NameError |
| 数据类型 | int / float / str / bool 区分 | 字符串和数字混用运算 |
| 运算符 | 注意优先级,多用括号 | 整除 // 误当作 / 导致精度丢失 |
| 表达式 | 拆解为多步,增加可读性 | 一行写太长,调试困难 |
| 类型转换 | 转换前确保格式合法 | 直接 int("3.14") 报错 |
嗯,这些基础看着简单,但真上手写振镜程序时,每一个细节都可能让你多花半天时间。
我自己的经验是:写之前先在纸上把变量、类型、计算步骤列清楚,
然后一句一句敲,每句都打印出来看一眼结果。
基础打牢了,后面学文件读写、通讯协议、图形生成才会顺畅。