0
点赞
收藏
分享

微信扫一扫

网工速通Python-part4-判断与循环

前言

NetDevOps是指以网络工程师为主体,针对网络运维场景进行自动化开发的工作思路与模式,是2014年左右从国外刮起来的一股“网工学Python"的风潮,最近几年在国内逐渐兴起,最近两年在国内也有少量的几本书,从不同角度来阐述了NetDevOps和它的技能体系,但和本人对于NetDevOps的理解还是有所不同,因为国内的网络环境相对比较复杂,而一些知识又和国外的平台绑定比较深,导致NetDevOps实践中有很多难题困扰着大家,笔者也在各种平台和场合解答过很多问题。此次希望能通过自己的知识分享,给大家呈现出一个不同于其他人的实战为指导、普适性强、善于抠细节、知其然知其所以然风格、深入浅出的NetDevOps知识体系,给大家一个不同的视角,一个来自于实战中的视角。

本人在国内某大型金融机构的数据中心从事网络自动化开发8年之久,从最早的脚本开发、一个简单的web自动化工具,到目前迭代出了一个由众多微服务组成的网络自动化运维系平台,覆盖了国内外众多主流厂商的设备,日常运维各种“奇葩”需求,和众多网工交流过NetDevOps底层技术,和很多网络团队管理者聊过网络自动化的前景与NetDevOps思想,甚至有幸和一些总监、创始人们聊过网络自动化运维平台的建设。

思想的不断碰撞、知识体系的不断迭代,让我有很多想说又无法名状的想法与情愫,希望在这本书中,与读者朋友们娓娓道来。

由于时间比较仓促,文章中难免有所纰漏,敬请谅解,同时笔者也会在每个章节完成后进行修订再发布,欢迎大家持续关注


判断与循环是驱动程序运转的关键所在,本章节只讲最核心的判断与循环内容,方便大家快速了解python的判断循环如何编写。

正文

2.5 判断循环

2.5.1 判断

python的判断语句使用if开始进行,搭配使用elif或者else。

if后面进阶条件判断表达式和冒号,条件表达式是能得到布尔值的一段表达式,符合条件则进入对应的代码块(注意缩进,相对if缩进4个空格)。

elif是在条件表达式不满足后继续进行一种判断。

else是用于以上条件均不满足的情况。

在判断中,if必须有,elif和else根据实际需要添加,且else一般在最后。

其形式如:

if <条件表达式1>:
    <代码块1>
elif <条件表达式2>:
    <代码块2>
elif <条件表达式3>:
    <代码块3>
else:
    <代码块4>

示例:

intf_status = 'up'
if intf_status == 'up':
    print('端口up,正常')
elif intf_status == 'down':
    print('端口up,异常')
else:
    print('未知端口状态')  # 写两行,缩进体现出这两行是一段代码块
    print('端口状态{}'.format(intf_status))   # 此处特意写两行代码,缩进体现出这两行是一段代码块


if intf_status == 'up':
    print('端口up,正常')
else:
    print('端口up,正常')

结合字符串的一些方法,对于新手而言,可以解析很多网络配置信息,当然这不是解析网络配置的最优解,对于新手而言,是最快捷最易掌握的方法,或者在一些特别简单的情况下,我们通过字符串的操作就可以提取出信息,而无需动用正则或者textfsm(后续篇章会讲)。

line = '''Eth1/1          1       eth  trunk  up      none                     1000(D) 11'''
if line.startswith('Eth'):
    intf_info = line.split()
    intf_name = intf_info[0]
    intf_stauts = intf_info[4]
    # 在以下行输出端口名称和状态
    print('intf_name:{},satus:{}'.format(intf_name, intf_stauts))
else:
    print('此行,未发现端口信息')

这段代码中,我们通过对一行show命令的回显进行了信息的提取,通过字符串的startswith方法判断是否为端口的回显,再用split方法切割字符串,将返回的字符串列表赋值给一个新的列表变量intf_info,然后通过列表的索引获取端口中的信息,将端口名称和状态打印出来,实际可以在后续输出到表格中,同时对状态进行一些判断实现类似巡检的功能。

诸如此类,我们可以提取出网络设备的软件版本,同时与基线比对。打印只是初学阶段用于调试和执行结果反馈的一种方法,更高级的方法是将获取的信息输出到表格,甚至是数据库中,大家一定要有这个意识。

2.5.2 循环

在判断的示例中我们进行了一行回显的信息提取,在实际工作中,我们的回显一定是多行的,这个时候我们提取信息,可以通过循环处理每行文本进行信息的提取。

在Python中有两种循环,一种是for循环,一种是while循环。

for循环

Python的for循环可以不通过索引非常方便的遍历访问序列(包含但不局限于字符串、列表、元组、集合、字典)。

其形式如:

for i in <序列>:
    <代码块>

其中每次循环i会被自动赋值此次访问的成员(字典的遍历i每次是key),并且i是一个局部的变量,严格意义上只有在此代码块内才可以被访问使用,否则容易引起程序报错,或者程序未按预期执行。

a = [1, 2, 3]
# a = (1, 2, 3)
# a = {1, 2, 3}
for i in a:
    print(i)
'''列表的输出结果如下:
1
2
3
'''

字典的for循环比较特殊,它访问的是key。如果要取对应的value,需要通过key去访问。

dev_info = {'ip': '192.168.1.1', 'name': 'as01'}
for i in dev_info:
    print(i)
    print(dev_info[i])  # 将对应i作为key传入,取出对应的value。
'''输出结果如下:
ip
192.168.1.1
name
as01'''

我们也可以通过字典的一个特殊方法items,它会返回一个元组的列表(这个描述并不准确,但是方便理解),这个列表的成员是一个元组,key与value,我们通过非常方便的赋值方法给k,v这两个局部变量。

dev_info = {'ip': '192.168.1.1', 'name': 'as01'}
for k, v in dev_info.items():
    print(k)
    print(v)
'''输出结果如下:
ip
192.168.1.1
name
as01'''
print(dev_info.items(),type(dev_info.items()))
'''输出结果如下,其实返回的是一个特殊的数据结构dict_items,但是我们可以简单理解为返回了元组的列表
dict_items([('ip', '192.168.1.1'), ('name', 'as01')]) <class 'dict_items'>
'''

while循环

while的使用规则如下:

while <条件表达式>:
    <代码块>

只要条件满足(条件表达式为True),就不断循环,条件不满足时退出循环。

示例为一个计算1到100的和的代码。

i = 1
end = 100
sum = 0
while i <= end:
    sum = sum + i
    i = i + 1
print(sum)  # 输出结果5050

我们定义了起始值i,结束值100,和初始值为0。然后进入while循环,判断条件是起始值i小于等于结束值。在代码块内,我们先求和,用上次循环的和加上当前数字i的值,然后把i向下一个数字移动。

循环中经常还会用到两个关键字continue与break(二者只出现在循环中):

  1. continue代表结束此次循环,即continue后的代码块不再执行。比如某些条目我们不关注,无需继续处理此条目,则跳过这次循环,进入下一个条目的处理。
  2. break代表结束本次所有的循环,跳出当前循环。比如我们已经找到了要提取的信息,无需再继续执行下面的循环,则可以使用此关键字。

练习:要查询某交换机up的端口及其信息

intfs = [{'name': 'Eth1/1', 'status': 'up'},
         {'name': 'Eth1/2', 'status': 'up'},
         {'name': 'Eth1/3', 'status': 'down'},
         {'name': 'Eth1/4', 'status': 'up'},
         ]
# 计数器i
i = 0
# 端口数目
intfs_num = len(intfs)
# up的端口列表初始化值为空列表
up_intfs = []
# 进行循环,当计数器小于端口数目时可以循环
while i < intfs_num:
    intf = intfs[i]
    if intf['status'] == 'up':
        # up端口追加成员
        up_intfs.append(intf)
    # 对计数器进行累加
    i = i + 1  # 等同于 i += 1 ,这是一种简便写法,python中不同其他语言,无i++这种写法。
print(up_intfs)  # 输出结果为[{'name': 'Eth1/1', 'status': 'up'}, {'name': 'Eth1/2', 'status': 'up'}, {'name': 'Eth1/4', 'status': 'up'}]


举报

相关推荐

0 条评论