3、Python基础速通(一):变量、数据类型、字符串操作、列表与字典
各位同学,咱们直接进入正题。
做网络运维,脚本是吃饭的家伙。而Python,就是那把最顺手的刀。今天这一讲,咱们把Python最基础、最核心的几个概念捋一遍。别嫌基础,我见过太多人在这上面栽跟头。
核心观点:Python的变量、数据类型、字符串、列表和字典,是构建一切自动化脚本的砖瓦。你写100行代码,至少有80行在跟它们打交道。
3.1 变量:给数据贴个标签
变量是什么?说白了,就是给数据起个名字。你想想看,你操作一台交换机,总得知道它的IP地址吧?你不可能每次都把IP地址写死,对吧?
# 这就是变量
switch_ip = "192.168.1.1"
username = "admin"
password = "cisco123"
我个人习惯,变量名一定要见名知意。别用a、b、c这种,三个月后你自己都看不懂。我在项目中遇到过,有人用a = "192.168.1.1",结果后面代码里全是a、b、c,排查问题的时候差点把键盘砸了。
小技巧:Python变量名区分大小写。SwitchIP和switch_ip是两个不同的变量。我建议统一用小写加下划线,这是Python社区的约定俗成。
3.2 数据类型:Python帮你分好了类
Python是动态类型语言,你不需要声明变量类型。但你要知道,每个数据背后都有类型。
| 类型 | 例子 | 说明 |
|---|---|---|
| int | 10, 255, 1000 | 整数,比如端口号、VLAN ID |
| float | 3.14, 1.5 | 浮点数,比如带宽利用率 |
| str | "Hello", '192.168.1.1' | 字符串,IP地址、设备名都用它 |
| bool | True, False | 布尔值,判断条件时用 |
为什么会这样?因为Python在背后帮你做了类型推断。你写port = 22,Python就知道port是整数。你写ip = "10.0.0.1",Python就知道ip是字符串。
注意:我曾经在脚本里把端口号写成了字符串"22",结果跟整数22做比较时死活不相等。排查了半天,才发现是类型问题。嗯,这里要注意,type()函数是你的好帮手。
# 用type()查看类型
port = 22
print(type(port)) # 输出:<class 'int'>
port_str = "22"
print(type(port_str)) # 输出:<class 'str'>
3.3 字符串操作:处理设备配置的利器
网络运维里,字符串操作太频繁了。解析设备输出、拼接命令、提取关键信息,全是字符串的活儿。
3.3.1 字符串拼接
# 拼接命令
hostname = "R1"
interface = "GigabitEthernet0/1"
command = "show interface " + interface
print(command) # 输出:show interface GigabitEthernet0/1
# 用f-string更优雅(Python 3.6+)
command = f"show interface {interface} on {hostname}"
print(command) # 输出:show interface GigabitEthernet0/1 on R1
我个人强烈推荐f-string。它比用+拼接更清晰,也不容易出错。我在写批量备份脚本时,所有命令都是用f-string动态生成的。
3.3.2 字符串分割与提取
# 解析设备输出
output = "Interface: GigabitEthernet0/1, IP: 192.168.1.1/24, Status: up"
parts = output.split(",")
for part in parts:
print(part.strip())
你想想看,从设备上抓回来的配置,往往是一大段文本。用split()分割,用strip()去掉多余空格,再用find()或in判断关键字,基本就能搞定大部分解析工作。
避坑指南:我曾经用split(" ")去分割配置行,结果遇到多个空格时,列表里全是空字符串。后来改用split()(不带参数),它会自动处理连续空白字符。记住了,split()默认按任意空白字符分割。
3.4 列表:有序的容器
列表,说白了就是一个可以装很多东西的盒子,而且顺序固定。在运维脚本里,列表用来存设备列表、IP地址池、端口号集合,再合适不过。
# 设备列表
devices = ["R1", "R2", "R3", "SW1", "SW2"]
# 添加设备
devices.append("FW1")
print(devices) # 输出:['R1', 'R2', 'R3', 'SW1', 'SW2', 'FW1']
# 按索引访问
print(devices[0]) # 输出:R1
print(devices[-1]) # 输出:FW1(负索引从末尾开始)
# 切片
print(devices[1:3]) # 输出:['R2', 'R3']
我在项目中遇到过,需要批量ping一堆设备。把设备IP存在列表里,用for循环遍历,逐个ping。代码简洁,逻辑清晰。
# 批量ping示例
ip_list = ["192.168.1.1", "192.168.1.2", "192.168.1.3"]
for ip in ip_list:
result = os.system(f"ping -c 1 {ip}")
if result == 0:
print(f"{ip} is reachable")
else:
print(f"{ip} is unreachable")
核心操作:列表的增删改查——append()、remove()、pop()、index()、sort()。这些方法,你写脚本时几乎天天用。
3.5 字典:键值对的威力
字典,是Python里最强大的数据结构之一。它用键(key)来映射值(value),查找速度极快。在运维场景里,字典用来存设备配置、接口状态、路由表,简直完美。
# 设备信息字典
device = {
"hostname": "R1",
"ip": "192.168.1.1",
"vendor": "Cisco",
"model": "ISR4331",
"interfaces": ["G0/1", "G0/2", "G0/3"]
}
# 访问字典
print(device["hostname"]) # 输出:R1
print(device.get("vendor")) # 输出:Cisco(推荐用get,不会报错)
# 修改值
device["ip"] = "10.0.0.1"
# 添加新键
device["os_version"] = "16.9.5"
你想想看,如果你要管理100台设备,每台设备有10个属性。用列表存?你得记住每个索引对应什么。用字典?直接通过设备名或IP就能查到所有信息。这就是字典的魅力。
注意:字典的键必须是不可变类型(字符串、数字、元组)。列表不能当键。我曾经试图用列表当键,结果Python直接报错。嗯,这个坑我替你们踩过了。
3.6 列表与字典的嵌套
实际项目中,很少只用单一的数据结构。往往是列表里套字典,字典里套列表。比如,管理一个网络的所有设备:
# 设备列表,每个设备是一个字典
network_devices = [
{
"hostname": "R1",
"ip": "192.168.1.1",
"role": "core"
},
{
"hostname": "SW1",
"ip": "192.168.1.2",
"role": "access"
},
{
"hostname": "FW1",
"ip": "192.168.1.3",
"role": "firewall"
}
]
# 遍历所有设备
for device in network_devices:
print(f"Connecting to {device['hostname']} at {device['ip']}...")
# 这里可以写SSH连接代码
这种结构,在批量操作脚本里太常见了。从Excel或CSV里读设备信息,存成列表字典,然后逐个操作。我写的自动化备份脚本,核心数据结构就是这个样子。
3.7 本章知识体系
下面这张图,帮你理清今天讲的内容。变量是基础,数据类型是分类,字符串、列表、字典是三大核心工具。它们之间可以互相组合,形成更复杂的数据结构。
好了,今天的内容就到这里。变量、数据类型、字符串、列表、字典,这五个概念你吃透了,后面写脚本就会顺手很多。记住,多动手敲代码,光看是学不会的。