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