写一个极简的Python伪教程,用于配合最近的网络(伪)自动化学习。教程主要目的是学会基本看懂代码,能简单的编写修改。
我工作是CT(通信)工程师,不懂编程纯小白,Python也只是网上粗略的看了一些资料和电子书,仅有浅显的理解,不具备编程能力,不具备实际的出教程的能力。
因此本教程语言组织可能会非常不专业,敬请谅解。当然,我会尽量的让我表述准确,不对以后专门学习产生干扰和误解。
Python入门比较简单,如果你有高中英语,数学基础,就会非常容易理解,整体表达符合自然语义,非常推荐大家学习,就当玩玩也行的。
重点说明
先记下Python一些非常重要的规则:
- 缩进 极其重要,没有之一,这是程序正确运行的基础。
- 请在python中输入import this查看,或搜索Python之禅
安装Python,略。
本教程学习结构
一、使用Python 3.14
- 在命令行内使用,例如windows CMD终端中你输入python后就可以使用了。
- IDE工具,安装后你可以在windows开始菜单内找到IDLE (Python 3.14 64-bit),打开运行即可。
- VS code,Pycharm等工具内使用
以下是简单示例:
说明:
- print是Python中内置的一个基础函数,正如字面意思,它的作用是打印,显示内容,就像你在交换机CLI界面内使用display或show一样。
- 备注/批注:以#开头或'''包围的字符。Python不会运行解释批注内容,这只是给人看的。就像老师批改你的作文,批改内容不影响你的作文内容。
- x,y是变量
这样看Python是不是很符合自然语义?像高中数学一样,像自然的书写表达一样。
二、“数据”—— 一切的目标,唯一的实在。
任何编程语言的最终目的都是表达,展现。而文字和数字是我们这个世界的主要表达方式。因此编程语言主要就是处理这些数据,并符合目标的展现这些数据,至少Python我觉得是这样。
Python的所有目的都是为了如何处理,使用数据。后面遇见的所有概念均为此服务,均为方法,手段,技巧,工艺……。
数据就像是粮食,除粮食之外的所有概念均为如何处理,使用粮食,包括但不限于重量,价格,麻袋,蒸,煮,炒,存储,运输,交易,吃……。
2.1 最基本的,字符串和数字
Python中可操作的最基础数据内容仅有两种:字符串(string)和数字(number),这非常符合现实世界。
【字符串】:任何用""和''包括的都是字符串,包括文本,数字,特殊字符等。
【数】:就是数字,可以计算的那种。包括整数,浮点数(小数)等。- '''
- 这是一段批注,
- 下面展示字符串,
- 这段内容不会被Python运行,解释。
- '''
- "hello" #这是字符串
- `hello+123-_*/Aa` #这也是字符串
- "123456789" #这还是字符串
复制代码 运行点代码看看区别。
示例中,x,y是什么?是【变量】。而"x","y"是字符串。
2.2 “衍生”的数据类型-列表,元组,字典
为了更加方便的处理,使用基础的字符串和数字,衍生(定义)了一些其他数据类型,以前面的粮食为例,这些定义的数据格式就像是面粉,大米,方便使用,这样你不用购买小麦,稻子就可以做出面条,米饭。
这些数据类型有列表,元组,字典:
- 【列表 List】:[]方式。一种基础数据的组合方式,有序的,可修改的
- 用[]包括起来的数据就是列表,如a=[1,"abc","猫","苹果","手机"]。
- 列表可以嵌套,如b=[2,a]
- 可以使用[起始位置:结束位置]的方式切割列表。位置从0开始计算。
- 注意,列表切割[x:y]数学意义是[x:y),即不包含y。
- 是可修改的,如a[1]=xyz。
- 【元组 Tuple】:()方式。类似List,有序的,不可修改的
- 用()包括起来的数据就是Tuple,如c=(1,2,"张三","李四")。
- 可以切割,类似List。
- 不可修改,c[1]=3无效
- 可以c=(3,4,5,6),但这不是修改了元组,而是修改了变量c的赋值或者指向。
- 【字典 Dictionary】:{}方式。无序的,可修改的
- 用{}包括起来的数据就是字典。
- 每组数据都是成对的值,叫索引(key)和值(value)。
- 无序的,所以不能用[:]切割。key是不可重复的,是索引,类似列表中的序号。
- 可以通过key访问对应的值。
- 可以遍历方法.key(),.value()或者使用.items()同时遍历。
- 可添加修改key:value
- 可将字典嵌套在列表内,可将列表嵌套在字典内,也可以字典嵌套字典。
- 水果库存的字典示例,d={"苹果":15,"桔子":20,"香蕉":25,"梨":30}。
二、变量——程序语言里的代数
正如前面所展示,变量就像是初中,高中的代数一样,你可以用x,y,z,m,n,f(x),y(x),g(x)……去代表任何未知或已经知的数字,方程式,函数,表达式等。
例如在数学上,你可以这样:如下面的中学简单例题:
\[ \begin {align} y(x)=2x^2+1 \\ g(x)=4x^4+8x^2+4 \end {align}\]
如果g(x)=16,且x > 0,求x的值 。一般我们是如何计算呢?
\[ \begin {align} y(x)=2x^2+1 \\ t=y(x) \\ g(x)=(t+1)^2\\ t=3 \\ 2x^2+1=3 \\ x=1 \end {align}\]
正如上面所示,在数学上,我们引入变量t后,简化了g(x)的计算,且让计算易于理解。在Python中同样如此。变量让我们处理数据更方便,逻辑更清晰,代码更优雅易读。
同样也请认真记住这个概念,变量,正如其名,它是会变的,本身不是任何具体的数据,而是指向,被赋予,代表某个数据。就像数学中的未知数X,它不是某个数字,但它可以代表任何数字。
而在Python中,你不仅可以给变量指定数字,函数表达式,还可以指定为文本字符串,一个列表,元组,字典……也许是可以指定为任何内容,大概是如此。
普通变量应当以小写字母开头,且尽量让人容易理解。例如我们在写交换机脚本时,可以使用ip作为IP地址的变量,ip_list作为大量ip地址组成的列表的变量。
同时应尽量避免在变量中使用l,o。因为某些文本显示可能让人和数字1,0分不清,除非是常见的特定的,例如交换机中的环回接口loopback,想必不回让人觉得loop是100p。总之你可以稍微留意这一点。- >>> # 定义变量ip
- >>> ip="10.1.1.1" #这是一个“数据”,
- >>> print(ip) #这是如何使用数据————显示它当前指向的内容"10.1.1.1"
- 10.1.1.1
- >>> ip="10.1.1.200" #变量,是会变化的,它指向了新的数据
- >>> print(ip) #这是如何使用数据————显示它当前指向的内容"10.1.1.200"
- 10.1.1.200
- >>>
复制代码 2.1 使用变量
- #定义两个变量a和b
- a,b = 15,"小明"
- print(a) #直接使用变量
- 15
- print(b)
- 小明
- print("他的名字叫%s" %b) #格式化序列方式,%s格式化字符串
- 他的名字叫小明
- print("他的年龄是%s" %a)
- 他的年龄是15
- print("%s的年龄是%d" %(b,a)) #%d格式化整数
- 小明的年龄是15
- print(f"{b}的年龄是{a}") #格式化字符串方式,python3.6后支持
- 小明的年龄是15
- #定义两个变量x和y
- x,y = 2,3
- print(f"{x}乘以{y}的结果是:{x*y}")
- 2乘以3的结果是:6
复制代码
三、循环和条件判断
3.1 for循环
很重要的一个循环语法,是最常见的完成重复工作的方式。目前,我们仅需要能看懂它就行。
格式为for x in y: 后面跟上动作,行为,方法,手段,技巧……,你可以理解为,对于x,在y里面逐个寻找,并指向找到的目标,完成指定动作,直到找完。
变量x,你可以理解为一个【指针】,它首先指向了y里面的第1个数据,按指令操作,操作完成,指向第2个,再操作……直到结束。
很简单,就是指向--操作--指向--操作……,直到没有可操作的。
嗯,就像你在指挥一个叫小张的人在"盲盒堆"里给开盲盒,小张在做的事就是指向第1个盲盒--打开--指向第2个盲盒--打开……,直到"盲盒堆"空了。就像下面这样:- #这不是可运行代码,只是代码释义
- #模拟对比不绝对准确。
- #也解释了缩进,缩进使代码像文章段落一样清晰。
- #小张在盲盒堆按顺序打开,直到盲盒堆空了。然后破产了(不循环)。
- #准确点,变量不是“小张”,是“小张的第x个盲盒”
- for "小张" in "盲盒堆":
- 打开盲盒给你
- 破产了
- #还可以这样,小张在一堆沙糖桔里
- #准确点,变量不是“小张”,是“小张的第x个沙糖桔”
- #小张会吃第1个,休息1分钟,第2个休息1分钟……一直吃完。然后睡觉(不循环)。
- for "小张" in "一堆沙糖桔":
- 吃
- 休息1分钟
- 睡觉
- #也可以这样,小张在一年365天的时间里
- #准确点,变量不是“小张”,是“小张的第x天”
- #小张在第1天上班下班睡觉,第2天……第3天……直到一年结束。然后升职加薪(不循环)。
- for "小张" in "365天":
- 上班
- 下班
- 睡觉
- 升职加薪
复制代码 下面是一个正常的代码示例,相信你一定能看懂。- #ip_list是一个列表,里面存了一些交换机的ip
- #ip是一个变量,变量名字可以是任意的,只是ip符合语义。
- >>> ip_list = ["10.8.8.8","10.7.7.7","10.6.6.6","10.5.5.5"]
- >>> for ip in ip_list:
- ... print(ip)
- ...
- 10.8.8.8
- 10.7.7.7
- 10.6.6.6
- 10.5.5.5
复制代码 在上面的代码中,变量ip就像一个指针,它首先指向了第1个数据"10.8.8.8"然后打印,完成后指向第2个……第3个,直到结束。
所以下面再模拟一个伪代码,你应该也能看懂,它依次完成了4台交换机的telnet登录,用户名输入,密码输入,执行命令,保存查询结果至以ip地址命名的txt文件中。- # 这不是一个可运行的代码,只是代码释义
- # 伪代码的模拟对比不绝对准确。
- # 你知道的,在英文中,send是发送,save是保存,read是读取,output是输出
- >>> ip_list = ["10.8.8.8","10.7.7.7","10.6.6.6","10.5.5.5"]
- >>> for ip in ip_list:
- telnet {ip}
- send "用户名"
- send "密码"
- send "display version"
- read "屏幕内容"
- output = "屏幕内容"
- output.save = "{ip}.txt"
- print({ip},版本查询已完成)
复制代码上面这段伪代码 中,我用到了output.save。简单说下,在Python中,AAAA.xxxx代表对"AAAA"使用一个"xxxx"的方法(Methods)。
这是一个英文直译,Methods,方法,措施。初次听方法这个概念可能觉得怪怪的,你可以理解为动作,行为,方法,手段,技巧……,例如苹果.削皮,大米.蒸。
实例如下,通过某种动作,行为,方法,手段,技巧……,我把"we love python"转换成了首字母大写和全大写,而原字符串不受任何影响。其中title()和upper()就是方法。
到此,每次看到for x in y:,你都可以在心里默念,- for x in y:
- 对于x,指向y里面时: #一直把数据指完
- 操作1
- 操作2
- 完成,干别的去
复制代码 3.2 while循环
略,我还没学,瞄了一眼,觉得暂时用不上。也不难,while英文就是“当……时,做……事”,比较容易理解。
3.3 if-else 判断
if的英文意思是如果。
这就简单了,if……else就是字面意思,如果……否则。
你能看懂吗?我觉得能,如果看不懂请留言说哈~!- #代码释义
- if True
- do something #如果为真,忽略下面的,执行这个
- else
- do something #如果为假,忽略上面的,执行这个
- #又一个模拟释义,我只吃苹果,其他水果都你吃
- if "这是苹果"
- 我吃
- else
- 你吃
- #还是模拟释义,检查设备是否需要升级
- for ver_name in version_files:
- if ver_name == "Software_V1.1.10"
- print("需要升级")
- else
- print("需要升级")
复制代码 下面展示一个我写的简单代码示例
首先创建了一个字典,包含的名字和年龄,当然你也可以说这是名字和存款(万),区分他们是贫穷还是小康,这个随意。
使用for循环,2个变量,分别指向名字和年龄。
请注意缩进,在循环时,if判断是在for循环内的,同样的,我还使用了if嵌套,虽然并不推荐这样,因为有if-elif-else语句可以用。第二个if-else是在第一个else内的。
缩进决定了代码的执行位置,层次。这就像一篇文章的段落一样,缩进不同就代表了他是在段落内还是段落外。
例如,我们把if判断放在for之外,即和for平级,不受for影响,代码会在执行完for之后,再执行if。
可以看到,年龄判断仅对最后一个人有效。这是因为if不在for循环内,循环结束时,才执行if语句,此时变量name="小黑",age=45,仅能对age=45做判断执行。
至此相信各位已经能够看懂if-else语句了。
四、函数
通过前面介绍的工具,已经可以完成许多对数据的操作了,但还远远不够。
正如数学中的函数一样,一个函数代表了某个映射法则,代表了一种对应关系,代表了一种数据转换处理。
在Python中也是类似的,函数通常表示我们在如何处理数据,同样的,每个函数都需要有一个名称,就像数学中使用的f来代表一个函数。
在前文中使用的print就是一个python中内建的函数,可以直接使用,它负责将指定的内容打印到屏幕上。print就是函数名,我们不需要关心它包含的语句,表达式等内容,我们仅需要知道它的功能并使用即可,很多时候都是这样。
所以当你看到一个函数时,不要尝试理解它,你只需要知道它的功能并相信它是可用的,有效的即可。
就像你知道按下手机电源键可以开机,而你不需要知道手机内部电路是如何实现的,你只需要知道怎么用即可,至少现在是这样的。
假如存在一个函数a,它能将输入的数字求出平方值,那么只需要知道a(2)=4,a(9)=81诸如此类,并在需要的时候使用它。
对于你在读代码时遇见了不知道功能的函数,请善用搜索功能,或者你找一本相关的书籍或教程学习。
为什么要有函数
为什么要花功夫将程序拆分成函数呢?也许刚开始编程的时候这其中的原因并不明晰。下面这些解释都可作为参考。
- 新建一个函数,可以让你有机会给一组语句命名,这样可以让代码更易读和更易调试。
- 函数可以通过减少重复代码使程序更短小。后面如果需要修改代码,也只要修改一个地方即可。
- 将一长段程序拆分成几个函数后,可以对每一个函数单独进行调试,再将它们组装起来成为完整的产品。
- 一个设计良好的函数,可以在很多程序中使用。书写一次,调试一次,复用无穷。
4.1 使用函数
对于python中的内建函数你可以直接使用,但内建函数有限,可能有些功能无法实现,需要使用其他的函数。
python中有很多模块,在导入后就可以使用其包含的许多函数。例如我们使用的paramiko模块,导入后就可以通过SSH连接管理你的交换机,路由器,服务器等设备。
如下所示,我们使用paramiko模块中的函数,实现了登录交换机,并查询交换机的版本。- import paramiko
- import time
- ip = "10.7.7.7"
- username = "hao"
- password = "admin12345"
- #SSH终端函数,发起SSH连接
- ssh_client = paramiko.SSHClient ()
- ssh_client.set_missing_host_key_policy (paramiko.AutoAddPolicy ())
- ssh_client.connect (
- hostname=ip,username=username,password=password
- )
- print ("你已成功连接至", ip)
- command = ssh_client.invoke_shell () #类的实例化
- time.sleep (1) #time类,sleep函数,等待1秒
- command.send ("sys\n") #send函数,发送交换机命令
- command.send ("dis version\n")
- time.sleep (2)
- output = command.recv (65535) #recv函数,接收交换机命令的回显内容
- print (output.decode ("ascii")) #打印交换机的回显内容
- ssh_client.close
复制代码 在上述代码中,我们使用了paramiko中的两个类paramiko.SSHClient和ssh_client.invoke_shell的相关函数,功能是通过SSH连接设备,创建管道以使用交换机的命令行界面。不需要知道这些函数的功能是怎么实现的,你只需要怎么使用。
pyhon中有非常多的内建模块和第三方模块,你不可能知道所有的模块和所有的函数功能,当你需要使用它们时,只需要导入,查看模块的相关文档了解如何使用。
比如,你可以在Welcome to Paramiko’s documentation! — Paramiko documentation查看paramiko的包含的所有函数和方法。如果你看不懂英文,也只是需要找一个翻译工具而已或者找其他人翻译好的文档。
4.2 创建函数
前面使用的都是Python自带的或者他人制作提供的函数,有时候,可能需要我们自己写一个函数。
使用关键字def定义一个函数,参数可以为空。return表达式结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。- def 函数名(参数1,参数2……)
- 语句
- return
复制代码 函数定义结构如下图:
图片及示例来自Python3 函数 | 菜鸟教程
如下定义了一个比较数字大小的函数。输入两个数字,会将较大的值输出。- def max(a, b):
- if a > b:
- return a
- else:
- return b
复制代码
类
类是面向对象编程的一个概念,目前仅做了解即可。你可以暂时把类理解成很多函数的集合。而你需要以类.函数的方式去使用相应的函数。
正如前文所述的AAAA.xxxx方式,点后面的指令(函数,表达式……)代表了某种动作,行为,方法,手段,技巧……
以下是一些简介:
面向对象技术简介
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
方法:类中定义的函数。
……
更多请自行搜索相关书籍或教程。
总结
通过以上简单的学习,一般来说是可以看懂不太复杂的代码了,可以尝试进行我们的网络自动化学习进程了。虽然编写代码依然有些困难,但我们借助网络搜索,AI,实现看懂,简单的编写和修改代码并不是一件难事。
同样,在后续学习期间我们可能还需要经常的搜索查询资料或者借助AI工具。
最后作为复习验证,来尝试理解以下代码。以下代码为个人参考书籍编写并由AI辅助完成。可以实现对交换机的- #导入需要的模组
- import paramiko
- import time
- #创建ip列表,统一的用户名和密码
- ip = ["10.8.8.8","10.7.7.7","10.6.6.6","10.5.5.5"]
- username = "hao"
- password = "admin12345"
- ssh_client = paramiko.SSHClient ()
- ssh_client.set_missing_host_key_policy (paramiko.AutoAddPolicy ())
- #使用for循环依次登录交换机
- for i in ip:
- print ("正在连接至", i)
- ssh_client.connect (
- hostname=i,username=username,password=password,
- look_for_keys=False,allow_agent=False
- )
- command = ssh_client.invoke_shell ()
- time.sleep(0.1) #加入时间延迟,因为交换机命令界面完整
- #刚进入交换机时,命令行界面只显示一个内容,即hostname
- #一般是<hostname>或[hostname]
- #提取由<>或[]包括的内容
- #i指向连接的IP,sysname指向提取的hostname
- import re
- output = command.recv(65535).decode('ASCII').replace('\r','')
- match = re.search(r'[<\[](.*?)[>\]]', output)
- sysname = match.group(1)
- print ("你已成功连接至", i, "系统名称:", sysname)
-
- #向交换机发送指令
- time.sleep (0.1)
- command.send ("sys\n")
- command.send ("dis version\n")
- #读取交换机的回显内容,即'dis version'的查询结果
- time.sleep (0.2)
- output_text = command.recv(65535).decode('ASCII').replace('\r','')
- print (output_text)
- # 保存回显结果到TXT文件
- #文件名称为“hostname_IP_output.txt”
- filename = f"[{sysname}]_{i}_output.txt"
- with open(filename, 'w', encoding='utf-8') as f:
- f.write(f"交换机IP: {i} 系统名称:{sysname}\n")
- f.write("=" * 50 + "\n")
- f.write(output)
- f.write(output_text)
- f.write("\n" + "=" * 50 + "\n")
- f.write(f"检查时间: {time.strftime('%Y-%m-%d %H:%M:%S')}")
- print(f"回显结果已保存到文件: {filename}")
- ssh_client.close ()
- print ("已关闭", i, "的连接")
- print ("---------------------------------------------------------------")
- print ("================================================================")
- print ("检查结束")
复制代码 以上代码可参考我的博客文章【练习版】使用paramiko批量的查询,管理,配置路由器交换机
参考
Python3 教程 | 菜鸟教程
像计算机科学家一样思考Python(第2版)-艾伦 B. 唐尼 (Allen B. Downey)
Python编程:从入门到实践(第3版)(2025年新版)-[美]埃里克·马瑟斯
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |