【从零开始NetDevOps】第二章网工速通Python

《从零开始NetDevOps》是本人8年多的NetDevOps实战总结的一本书(且称之为书,通过公众号连载的方式,集结成册,希望有天能以实体书的方式和大家相见)。

NetDevOps是指以网络工程师为主体,针对网络运维场景进行自动化开发的工作思路与模式,是2014年左右从国外刮起来的一股“网工学Python"的风潮,最近几年在国内逐渐兴起。本人在国内某大型金融机构的数据中心从事网络自动化开发8年之久,希望能通过自己的知识分享,给大家呈现出一个不同于其他人的实战为指导、普适性强、善于抠细节、知其然知其所以然风格、深入浅出的NetDevOps知识体系,给大家一个不同的视角,一个来自于实战中的视角。

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

本系列文章会连载于“NetDevOps加油站”公众号,欢迎大家点赞关注
在这里插入图片描述

第二章 Python基础

​ 在第一章,为大家分享了我对NetDevOps的认知,NetDevOps发展的几个重要阶段,同时简单介绍了Python这门开发语言,本章节开始我们要开始硬核之旅,带领大家从零开始掌握Python,只有掌握了Python这门开发编程语言,我们才能够按照我们的需求编写脚本乃至工具平台。

​ Python是一门十分简单容易上手的编程语言,对于网络工程师而言,掌握Python这件事并不苦难,大家所要做的就是按部就班地掌握每个小节的知识点,并亲自将它敲出来!

​ 本章节,我会从网络运维的知识体系,将Python的为大家讲解清楚,讲解最核心的部分。当新手面对一门语言,个人认为,我们需要尽快地掌握最基础、最核心的知识,快速动手编写有成效的脚本,这样才会有行进下去的动力。很多初学者最容易犯的错误,可能就是买了一本非常好的书,从头看到尾学完之后,说懂吧,写不出来有用的代码(减少自己的工作量的脚本),说不懂吧,他还能写出来一些简单的脚本,比如比数字大小、猜数字等。这也与NetDevOps的理念不合,我们并没有把开发应用到日常运维之中。如何避免这种窘境?最佳的实践方法就是掌握最核心最基础的语法,以解决实际工作中遇到的问题为行进方向,不要被庞大的编程语言体系淹没在学习的迷雾之中。通过小步快跑的方式,以基础语法为核心,以解决实际问题为宗旨,不断扩展这么语言的学习范围和深度,实现滚雪球的效应,在一个个简单的脚本中看到光,在一个个问题的解决之后找到自信!

​ 同时在学习知识的过程中要学会举一反三,触类庞通。比如很多书籍以实际生活中的例子来讲基础语法,我们作为网络工程师,就要学会将这些情景映射到网络运维之中,类比网络运维。

​ 工欲善其事必先利其器,首先让我们一起动手来搭建一个Python的开发环境吧!

2.1 版本选择与环境搭建

我该选择哪个Python版本?

​ 关于Python版本的选择,在这个时代已经毫无疑问,一定选择Python3。Python2在当今这个时代已经是明日黄花,无论是官方还是第三,对于Python2的支持都到了尾声。且根据个人实践,我更推荐Python3.8、Python3.9。根据我在实际生产中的使用,以及对一些Python工具包的观测,很多包至少要求3.6的某个比较靠后的版本,基本都能支持3.9,所以3.8和3.9是不错的选择。本书所涉及到的包对3.9的支持也比较好,且3.9的官方支持时间会比3.8时间久一些,所以最优解目前个人认为是3.9。当然随着时间的变化,大家也可以按照这个思路去决定你入门的Python版本。

​ 同时根据笔者的一些实践经验来看,我也推荐初学者安装Anaconda最新版(截止到发稿,目前最新版本是2022.5,内含Python3.9的版本),它是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项,虽然是用于科学计算,但是集成的这180个包,如果是身处隔离的办公网络内,可以减少我们很多的麻烦,且内部集成了Jupyter Notebook这种基于web的交互式的IDE(开发集成环境,简单理解就是开发用的工具)。对于新手或者简单写些测试脚本也都是不错的选择。

当然本书还是以纯粹的Python环境作为演示,暂不安装Anaconda。

Python的安装

​ 对于新手,我一定会强调:**保证你的电脑中只有一个Python环境!**如果安装出现了问题没有达到预期,一定卸载干净,重启电脑后,确保没有文件残留后,再重新点击安装文件进行安装!

​ 一个电脑是可以装多个Python环境的,但是Python的可运行文件在环境变量中只有一个会生效,我们安装了一个Python环境后加载到了环境变量中,出于某种原因,我们可能选择重装,如果稍有操作不慎,可能会导致电脑中有两个共存的Python,而对于初学者而言,往往搞不清楚自己究竟用的是哪个Python环境,这个是我在实际工作中所观察到的,很多网络工程师都会被环境的安装劝退,或者是在后期,由于环境的问题导致自己一直无法进行开发。比如你安装了一个连接网络设备的netmiko包(后续会详细讲到),以为自己使用的是A环境,在开发中IDE也默认了A环境,但是你无论怎么导入这个包,程序都说找不到。原因是由于初学阶段安装时各种问题重装Python,导致多个Python共存,netmiko实际被安装到了B环境。你的开发环境指向了A环境,无论你怎么导入都不会成功的。

​ 我们一定要去官方网站,结合自己的操作系统下载对应的Python安装文件。官网地址https://www.python.org/

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xwd7lZfe-1658882259395)(assets/image-20220527002110867.png)]

在官网中,我们点击Downloads的All releases导航栏,进入到版本选择页面。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qD0Uyy9R-1658882259397)(assets/image-20220527002222391.png)]

在上半部分,我们会看到Python目前几个活跃的版本,它的发行日期以及官方支持结束日期。其中3.9的版本综合官方支持时长和目前主流的NetDevOps Python工具包支持情况,是最优解。

我们来到网站中部,选择最新的Python3.9版本即可,点击download进入安装包选择。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YI7eEdPq-1658882259398)(assets/image-20220527002424062.png)]

在新打开的网站底部,我们选择对应的安装文件点击即可下载。本书操作系统为64位win10操作系统,所以选择对应的版本下载安装。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4TGTkqjC-1658882259398)(assets/image-20220527002612549.png)]

双加对应的安装文件,这个时候一定要勾选上将Python添加到环境变量的选项,这样我们打开cmd窗口输入Python才会有效果。我们可以选择安装到默认位置,也可以安装到指定盘符目录下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cf7Ykz7A-1658882259399)(assets/image-20220527002946978.png)]

很快就可以安装完成。这个时候我们打开CMD,输入“python”,进入到Python的交互式编程窗口。至此,Python就完成了安装。

通过在CMD(或者其他terminal中)敲入“python”进入到的模式是Python自带的交互式编程,在这里我们每敲一个命令都会实时计算。但是关闭窗口后这些这些代码也都消失。其实更多用于演示或者测试一些比较短的代码,响应会更快一些。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cbtgzXci-1658882259400)(assets/image-20220527185811927.png)]

现在请跟我敲下第一行代码

print('Hello,world')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ViT00GVB-1658882259401)(assets/image-20220527185854880.png)]

至此我们完成了Python的安装,敲下了我们的第一行Python代码。

总结
  1. 新手建议选择Python3.9。
  2. 新手建议电脑中只有一套Python环境。

2.2 IDE的推荐与设置

安装好了Python环境,我们就需要选择Python的IDE(集成开发环境)了。IDE一般都支持支持语法高亮、智能代码补全、自定义快捷键、自动格式化代码等等。合理使用优秀的IDE,可以极大地提升我们的开发效率。

对于新手,Python的IDE选择,笔者推荐PyCharm的社区版本,PyCharm是由JetBrains打造的一款Python IDE,有社区版和专业版,专业版加入了一些web开发和科学计算开发的便利功能,对于普通用户,社区版足矣。

安装与配置

通过PyCharm的官方网站 https://www.jetbrains.com/pycharm/ 我们点击Download,会打开一个新的页面,选择社区版即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wz0ZoJ2u-1658882259402)(assets/image-20220527195937907.png)]

双击安装软件,按需调整安装位置,以及一些其他的选项(这些选项不影响基本使用),等待安装结束后打开PyCharm。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VnjvQp6R-1658882259402)(assets/image-20220527200055130.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-flugw1CM-1658882259403)(assets/image-20220527200521596.png)]

登录之后会让我们选择创建工程还是打开一个现有的代码项目。在此我们选择创建新项目。

我们修改一些项目的配置,比如我们选择修改项目名称和位置。默认的如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WAywBlVx-1658882259404)(assets/image-20220527200652722.png)]

在这个配置选项中,对于初学者我们建议不适用虚拟环境(虚拟环境我们在本书的后续会讲),记得我们说过,对于新手尽量只有一套Python环境。

我们选择自己配置Python解析器,如下图点击“…”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FxBC6We5-1658882259405)(assets/image-20220527201009179.png)]

这个时候会弹出一个窗口,我们选择系统解析器,在右侧的解析器地址中选择我们安装的Python即可(对于新手而言一定要先安装Python,再安装Pycharm)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hGqfe3xa-1658882259405)(assets/image-20220527201235346.png)]

我们也可以选择修改我们的项目名称。之后点击create按钮即可创建项目。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X4ukS04i-1658882259406)(assets/image-20220527201418725.png)]

项目创建之初PyCharm会对我们的Python环境进行索引,以便提供更方便的开发功能。同时默认帮我们创建了一个代码,我们可以删除调,或者在上一步取消创建main.py的选项。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DSvTqQyV-1658882259413)(assets/image-20220527201630959.png)]

创建第一个脚本并运行

在右侧的项目区域我们右键选择New->Python File,给文件命名即可创建好Python文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DtLYnGvJ-1658882259414)(assets/image-20220527202121650.png)]

在新建的Python文件中我们简单编写打印一个字符串的代码,然后右键,选择 Run 我们的脚本名称。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tNXl9qST-1658882259415)(assets/image-20220527202423024.png)]

结果如下,在下方会有一个窗口,把我们的代码结果输出,程序如果正常执行,最后的exit code是0。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Heq9mEf-1658882259416)(assets/image-20220527202348973.png)]

至此我们的整个开发环境已经搭建好了。PyCharm有很多的便利用法,我们在后续文章中逐步展开。

2.3 速学Python的基础知识

在正式学习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的变量推荐使用蛇形命名法,其规则是单词全部用小写字母,单词之间用下划线隔开,因为酷似一条弯弯曲曲的小蛇,故称之为蛇形命名法。

如下我们定义一台设备的相关信息

device_name = 'AS01'
device_ip = '192.168.1.1'
device_start_u = 10

2.3.2 保留字

​ 每门语言运行都会有一些特殊的语法,比如用if去做判断,我们不能用if来作为变量名(包括其他标识符也不行),这类我们称之为保留字(其他语言也称关键字)。Python有33个保留字,如下表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lHKmgea9-1658882259416)(assets/image-20220527233446959.png)]

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。然后进行了一个判断。如果符合条件或者不符合条件,分别进行了对应的输出。每种情况下的输出逻辑都可以通过缩进看出,打印的两行代码缩进相同,且上下连贯没有被中断,所以这两行代码是一起的。

​ 在更复杂的逻辑中,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;

2.4 基础数据类型

每个编程语言都有自己独特的基础数据类型,我们耳熟能详的比如整数、字符串、数组等等,其他所有的复杂对象都是从这些基础的数据结构衍生出来的。。

Python的基础数据类型包含以下几种:

  1. 数字
  2. 字符串
  3. 列表
  4. 字典
  5. 元组
  6. 集合
  7. 布尔

下面我们依次展开讲解各个数据类型

另外还有一个特殊值,空值None,类似于其他语言中的NULL,它代表是一个空对象(它不是基础数据类型,但是是一个非常简单且需要掌握的数据类型),不做过多展开。

2.4.1 数字

Python中的数字分为整数(int)、浮点数(float)、复数(complex),复数在日常中基本不会涉及,我们跳过。

整数

Python中的整数与我们的书写习惯一致。正整数、负整数、零均按我们的日常使用习惯使用即可。

整数的上下限在64位系统中可以认为无上限。而且在日常网络运维也不会出现一个内存无法保存的整数。我们无需关注这些极端情况。

a = 10
b = 0
c = -20
浮点数

浮点数即我们日常所说的小数,浮点数在Python中与我们的书写也一致。

x = 51.2
y = -11.2

同时它还支持科学计数法,大家了解即可,日常开发中很少使用。

a = 1.23e-18  # 等同于1.23*10^-18
数字的计算

python的数值支持加(+),减(-),乘(*),除(/),整除(//),取余(%),代码如下:

a = 6
b = 8
print(a + b)  # 输出结果14
print(a - b)  # 输出结果-2
print(a * b)  # 输出结果48
print(a / b)  # 输出结果0.75
print(a // b)  # 输出结果0
print(a % b)  # 输出结果6

2.4.2 字符串

​ 字符串是非常重要的一个数据类型,它是以引号括起来的一段文本。引号可以是单引号、双引号、三引号(三个单引号或者三个双引号),但是一定要成对出现,引号中间的文本内容是字符串承载的数据。字符串是严格区分大小写的。只写一对引号,内容为空,我们称之为空字符串。在Python中没有char(单个字符)这种数据类型,字符串中的字符可以是任意个,包括零个、一个或者多个

示例:

a = 'NetDevOps'
b = "NetDevOps"
c = '''this is a book about NetDevOps
这是一本关于NetDevOps的书
'''

示例中我们用单引号,双引号和三引号分别创建了三个字符串。假如我们的字符串中含有引号,这个时候该如何处理呢?

方法1:定义字符串的引号和字符串文本中的引号使用不同的引号。对于新手建议使用这种。

d = "It's a book about NetDevOps."
e = 'It is a book about "NetDevOps".'
f = '''It's a book abount "NetDevOps".'''  # 文本中既有单引号又有双引号,我们可以考虑用三引号。

方法2:使用转义符号反斜杠——“\”,转移符号后接我们要使用的引号。

d = 'It\'s a book about NetDevOps.'
e = "It is a book about \"NetDevOps\"."
关于转义

我们想用字符串表示一个回车怎么处理呢?

Python的做法是使用\n代表回车,其中\ 就是转义符号,它后面接字母n代表回车换行,字母n的表达意义发生了转换,这就是转义。反斜杠被称为转义符号,\n被称为转义字符。

下表是一些常用的转义字符(笔者根据日常运维所需进行了取舍,后续常用的列了出来)

转义字符 说明
\n 换行,将光标位置移到下一行开头。
\r 将光标位置移到本行开头
\t 横向制表符
\' 单引号
\" 双引号
\\ 斜杠符号,\本身是转义符号,我们想用它表示字符串本身时需要转义

在NetDevOps中, 我们写代码,我们定义一个设备名称的变量,就可以赋值成字符串类型的,设备的制造商可以是字符串,设备的所在房间可以是字符串,设备端口的配置可以字符串。待执行的一条命令也可以是字符串。

dev_name = 'as01'
dev_manufacture = 'HUAWEI'
dev_room = '0401'
# 我们可以适当对单词进行缩写,比如用intf代表interface。
# 但是尽量不要用int,int是一个用于将对象转换成整数的函数。
intf_config =
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值