前言
《从零开始NetDevOps》是本人8年多的NetDevOps实战总结的一本书(且称之为书,通过公众号连载的方式,集结成册,希望有天能以实体书的方式和大家相见)。
NetDevOps是指以网络工程师为主体,针对网络运维场景进行自动化开发的工作思路与模式,是2014年左右从国外刮起来的一股“网工学Python"的风潮,最近几年在国内逐渐兴起,最近两年在国内也有少量的几本书,从不同角度来阐述了NetDevOps和它的技能体系,但和本人对于NetDevOps的理解还是有所不同,因为国内的网络环境相对比较复杂,而一些知识又和国外的平台绑定比较深,导致NetDevOps实践中有很多难题困扰着大家,笔者也在各种平台和场合解答过很多问题。此次希望能通过自己的知识分享,给大家呈现出一个不同于其他人的实战为指导、普适性强、善于抠细节、知其然知其所以然风格、深入浅出的NetDevOps知识体系,给大家一个不同的视角,一个来自于实战中的视角。
本人在国内某大型金融机构的数据中心从事网络自动化开发8年之久,从最早的脚本开发、一个简单的web自动化工具,到目前迭代出了一个由众多微服务组成的网络自动化运维系平台,覆盖了国内外众多主流厂商的设备,日常运维各种“奇葩”需求,和众多网工交流过NetDevOps底层技术,和很多网络团队管理者聊过网络自动化的前景与NetDevOps思想,甚至有幸和一些总监、创始人们聊过网络自动化运维平台的建设。
思想的不断碰撞、知识体系的不断迭代,让我有很多想说又无法名状的想法与情愫,希望在这本书中,与读者朋友们娓娓道来。
正文
2.3 编程前必备知识:变量、保留字、缩进、注释、输出
在正式学习Python之前,我们先准备一些基础的知识,以便我们后续章节的讲解。
大家不要嫌啰嗦,万丈高楼平地起,一定要打好基础!
2.3.1 标识符及变量
标识符是Python用于识别不同的变量、函数、对象、类、模块而起的一个名称,比如在代码开发中给某变量起名字,这个名字就是标识符,当然我们习惯成变量名(函数的标识符就称函数名,诸如此类)。
标识符的命名规则是包含字母、数字、下划线_
,且必须以一个非数字字符开始。且标识符是大小写敏感的,一定要注意区分大小写。
放到我们网络运维,我们定义一个变量,用来表示接入交换机,我们就可以给他们定义成as01,我们让as01的IP地址为192.168.1.1,这个过程就是赋值。
在Python中是这样表达的。
as01 = '192.168.1.1'
我们用单个等号=
来进行赋值。仔细看会发现等号左右各有一个空格,这主要是为了可读性更好,防止字符都紧紧挨在一起,显得非常拥挤。
Python不同于其他的语言,变量定义的第一时间就要赋值
回到命名规则,起名不能随便起,我们刚才讲过了,必须是字母、数字、下划线的组合,且不能以数字开头。
比如这几个起名就是合法的:as01 _as01 as_01
。
但是这个起名就是非法的:01as as-01
。因为第一个以数字开头了,第二个有“-”号,不在数字、字母、下划线这三种合法组成元素之一。
还有一种极端情况,单独的下划线"",也是合法的,如下:
device_name, _ = get_device_info(id=1)
这种情况主要是因为,在代码编写过程中,函数返回两个值,Python支持一次创建赋值多个变量,但有时候我们只关心第一个,那第二个变量名就定义为下划线,下划线作为一种约定俗称不重要的变量名使用。这种极端情况大家了解即可,因为有些人的代码是这么写的,假如有天我们遇到了这种风格的赋值,我们需要读懂其中的意思。
蛇形命名法
python的变量推荐使用蛇形命名法,其规则是单词全部用小写字母,单词之间用下划线隔开,因为酷似一条弯弯曲曲的小蛇,故称之为蛇形命名法。
如下我们定义一台设备的相关信息
device_name = 'AS01'
device_ip = '192.168.1.1'
device_start_u = 10
2.3.2 保留字
每门语言运行都会有一些特殊的语法,比如Python中用if去做判断,我们不能将if挪作他用(包括其他标识符也不行),这类特殊的标识我们称之为保留字(其他语言也称关键字)。Python有33个保留字,如下表。
image-20220527233446959
2.3.3 缩进
有别于java、C等其他语言,Python是以缩进来分隔代码的逻辑块。这种缩进特别像一篇文章,每段段落是两个空格开始。用两个空格我们可以区分出段落。在Python中用于突出一块完整的代码逻辑。其他的语言是有的是通过大括号来实现的。
关于缩进风格:
1. 首行要顶头写,无缩进。
2. 进入到某代码块,使用相同的空格缩进,标准Python风格是使用4个空格,但是个人认为层级过深可以适当用两个空格做缩进。
我们看一个例子如下:
a = 1
b = 2
if a > b:
print('a>b')
print('a is ',a)
else:
print('a<=b')
print('a is ',a)
虽然我们还没触碰Python的编程核心,但是这段代码也非常易懂,且可以执行,这就是Python的魅力,接近自然语言、伪码。
通过这段代码的缩进我们可以清晰知道,先定义了变量a,b。然后进行了一个判断。如果a比b大,则打印出a比b大,再打印出a的值。否则打印a小于等于b,再打印出b的值。
在更复杂的逻辑中,Python也是靠缩进来区分代码块。所以合适的逻辑和适当的留白(在不影响代码的情况下,多敲一个空格或者空白行),可以让我们的代码可读性更好。
注意,永远不要在普通文本编辑里,在代码中使用Tab键做缩进!这种视觉上是四个空格,实际是一个制表符,是一个缩进,极其容易造成缩进混乱,程序报错。但是在PyCharm等专业Python IDE里可以使用Tab键,它们会将其Tab键的输入替换成是4个空格。
2.3.4 注释
注释主要用于对代码做一些备注,良好的注释有助于提高我们代码的可维护性和可读性。
Python的注释有两种风格:
- “#”单行注释,可以单独写一行,也可以在Python代码后面写,但是注释内容都不能跨行
- 三个单引号或者三个双引号的多行注释
示例:
# 定义变量a,单起一行注释。“#”与注释内容建议一个空格,记得我们的留白
a = 1
b = 2 # 定义变量b,行末的注释,建议"#"与代码末端保持两个空格,提高可读性
'''
判断ab的大小主体逻辑。
可以写很多行内容。
可以把三个单引号一同替换为三个双引号
'''
a = 1
b = 2
if a > b:
print('a>b')
print('a is ',a)
else:
print('a<=b')
print('a is ',a)
2.3.5 输出
输出的方式千千万,我们这里讲的是用print函数打印出来结果,是为了给“人”看的,是stdout的一种方式。实际上写文件,写数据库也可以看作是输出。
# 定义变量并同时赋值
a = 'a'
b = 'b'
c = 'c'
# 在print默认空格隔开,以回车(换行)结束 直接
print(a,b,c)
print(a, b, c, sep=',') # 用sep指定的字符串来隔开
print(a, b, c, end=';') # 用end指定的符号来结束,默认是回车(换行)结束
结果如下:
a b c
a,b,c
a b c;