3、基础语法速通(一):变量与数据类型、字符串操作、列表与字典、元组与集合
各位同学,欢迎来到基础语法速通环节。
说实话,Python 语法是运维自动化的地基。地基不牢,后面写脚本会各种踩坑。我见过太多人,一上来就写几百行的自动化脚本,结果变量命名不规范、数据类型搞混,最后 debug 到崩溃。
今天咱们就把这五个核心知识点啃透。别急,慢慢来。
3.1 变量与数据类型
Python 的变量,说白了就是个「标签」。你把数据贴个名字,方便后面用。
核心要点:Python 是动态类型语言。变量不需要提前声明类型,赋值时自动推断。
# 我习惯这样写变量
name = "蓝海" # 字符串
age = 28 # 整数
salary = 15000.50 # 浮点数
is_admin = True # 布尔值
嗯,这里要注意:Python 里没有「常量」这个语法概念。但大家约定俗成,全大写的变量名就当常量用,别去改它。
MAX_RETRIES = 3 # 这就是常量,别手痒去赋值
我的经验:变量名一定要见名知意。我曾经接手过一个脚本,变量名叫 a、b、c、d,看得我头皮发麻。你想想看,三个月后你自己回来看,能记得 a 是啥意思吗?
Python 的基本数据类型,我整理了一张表,方便你对照:
| 类型 | 名称 | 示例 | 说明 |
|---|---|---|---|
| int | 整数 | 10 |
没有小数部分 |
| float | 浮点数 | 3.14 |
有小数部分 |
| str | 字符串 | "hello" |
用引号包裹 |
| bool | 布尔值 | True |
只有 True/False |
| NoneType | 空值 | None |
表示「没有值」 |
避坑指南:我曾经在写监控脚本时,把 None 和空字符串 "" 搞混了。结果条件判断一直出错。记住:None 是「没有值」,"" 是「值为空字符串」,两者完全不同。
3.2 字符串操作
字符串在运维脚本里太常见了。解析日志、拼接命令、格式化输出……哪哪都有它。
我个人最常用的几个操作:
# 字符串拼接
url = "http://" + "api.example.com" + "/v1/status"
# 字符串格式化(我推荐 f-string)
host = "web01"
port = 8080
print(f"连接 {host}:{port}") # 输出:连接 web01:8080
# 字符串分割
log_line = "2024-01-15 10:30:45 ERROR 连接超时"
parts = log_line.split(" ")
print(parts) # ['2024-01-15', '10:30:45', 'ERROR', '连接超时']
你想想看,解析日志的时候,split 是不是特别好用?
常用字符串方法速查:
strip()— 去掉首尾空白字符。我每次读配置文件都会用。replace(old, new)— 替换字符串。批量改 IP 地址时很香。startswith()/endswith()— 判断开头结尾。检查文件后缀名必备。join()— 把列表拼成字符串。比用 + 拼接高效得多。
# 举个例子:批量处理服务器列表
servers = ["web01", "web02", "db01"]
comma_separated = ",".join(servers)
print(comma_separated) # web01,web02,db01
我的习惯:能用 f-string 就别用 % 格式化。f-string 是 Python 3.6 引入的,可读性最好。我在项目中遇到过一个老脚本,全是用 %s 和 %d 拼的,改起来真想哭。
3.3 列表与字典
列表和字典,是 Python 里最常用的两种数据结构。说白了,列表就是「有序的盒子」,字典就是「带标签的盒子」。
列表(List)
# 列表的定义
ips = ["192.168.1.1", "192.168.1.2", "192.168.1.3"]
# 常用操作
ips.append("192.168.1.4") # 追加
ips.remove("192.168.1.1") # 删除
print(ips[0]) # 索引访问,输出 192.168.1.2
print(len(ips)) # 获取长度
列表推导式是个好东西,我经常用它来快速生成数据:
# 生成 1 到 10 的平方数
squares = [x**2 for x in range(1, 11)]
print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
字典(Dict)
字典是键值对。运维里最典型的场景就是存服务器配置信息:
server_info = {
"hostname": "web01",
"ip": "192.168.1.10",
"port": 80,
"status": "running"
}
# 访问
print(server_info["hostname"]) # web01
# 安全访问(推荐)
print(server_info.get("os", "unknown")) # 如果键不存在,返回 "unknown"
避坑指南:我曾经在遍历字典时,边遍历边删除元素,结果程序直接崩溃。记住:遍历字典时不要修改它的大小。如果要删除,先收集要删的键,遍历完再删。
# 正确的删除方式
keys_to_delete = [k for k, v in server_info.items() if v == "unknown"]
for k in keys_to_delete:
del server_info[k]
3.4 元组与集合
元组和集合,用的频率比列表和字典少一些,但用对场景,效果拔群。
元组(Tuple)
元组就是「不可变的列表」。一旦创建,不能修改。
# 元组定义
config = ("127.0.0.1", 6379) # Redis 默认配置
# 解包
host, port = config
print(host) # 127.0.0.1
print(port) # 6379
为什么要有元组?因为不可变意味着安全。比如数据库连接配置,你肯定不希望代码里不小心把它改了。
我的经验:函数返回多个值时,我习惯用元组。比如 return (status, message),调用方直接解包,代码很清爽。
集合(Set)
集合就是「无序的不重复元素集」。去重和集合运算,是它的强项。
# 去重
server_list = ["web01", "web02", "web01", "db01", "web02"]
unique_servers = set(server_list)
print(unique_servers) # {'web02', 'db01', 'web01'}
# 集合运算
running_servers = {"web01", "web02", "db01"}
failed_servers = {"web02", "db02"}
# 找出还在运行的服务器
still_running = running_servers - failed_servers
print(still_running) # {'web01', 'db01'}
你想想看,用集合做差集,是不是比用循环判断优雅多了?
小技巧:检查一个元素是否在集合里,速度比列表快得多。如果你要频繁做「存在性检查」,用集合代替列表,性能提升很明显。我在写监控告警去重时就用这招。
本章小结
好了,今天的内容就到这里。咱们把变量、字符串、列表、字典、元组、集合都过了一遍。
说实话,这些基础语法看着简单,但真正用好需要大量练习。我建议你每学一个知识点,就打开终端敲一遍。代码这东西,光看是学不会的。
下一章咱们继续聊「条件判断和循环」,到时候会写一些真正能跑的运维小脚本。敬请期待。
公众号:蓝海资料掘金营,微信deep3321