找回密码
 立即注册
首页 业界区 业界 极简小白Python教程-实现能基本看懂和简单编写代码 ...

极简小白Python教程-实现能基本看懂和简单编写代码

郦惠 4 天前
写一个极简的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等工具内使用
以下是简单示例:
1.png

说明:

  • print是Python中内置的一个基础函数,正如字面意思,它的作用是打印,显示内容,就像你在交换机CLI界面内使用display或show一样。
  • 备注/批注:以#开头或'''包围的字符。Python不会运行解释批注内容,这只是给人看的。就像老师批改你的作文,批改内容不影响你的作文内容。
  • x,y是变量
这样看Python是不是很符合自然语义?像高中数学一样,像自然的书写表达一样。
二、“数据”—— 一切的目标,唯一的实在。

任何编程语言的最终目的都是表达,展现。而文字和数字是我们这个世界的主要表达方式。因此编程语言主要就是处理这些数据,并符合目标的展现这些数据,至少Python我觉得是这样。
Python的所有目的都是为了如何处理,使用数据。后面遇见的所有概念均为此服务,均为方法,手段,技巧,工艺……。
数据就像是粮食,除粮食之外的所有概念均为如何处理,使用粮食,包括但不限于重量,价格,麻袋,蒸,煮,炒,存储,运输,交易,吃……。
2.1 最基本的,字符串和数字

Python中可操作的最基础数据内容仅有两种:字符串(string)和数字(number),这非常符合现实世界。
字符串】:任何用""和''包括的都是字符串,包括文本,数字,特殊字符等。
】:就是数字,可以计算的那种。包括整数,浮点数(小数)等。
  1. '''
  2. 这是一段批注,
  3. 下面展示字符串,
  4. 这段内容不会被Python运行,解释。
  5. '''
  6. "hello"             #这是字符串
  7. `hello+123-_*/Aa`   #这也是字符串
  8. "123456789"         #这还是字符串
复制代码
运行点代码看看区别。
2.png

示例中,x,y是什么?是【变量】。而"x","y"是字符串。
2.2 “衍生”的数据类型-列表,元组,字典

为了更加方便的处理,使用基础的字符串和数字,衍生(定义)了一些其他数据类型,以前面的粮食为例,这些定义的数据格式就像是面粉,大米,方便使用,这样你不用购买小麦,稻子就可以做出面条,米饭。
这些数据类型有列表,元组,字典:

  • 【列表 List】:[]方式。一种基础数据的组合方式,有序的,可修改的

    • 用[]包括起来的数据就是列表,如a=[1,"abc","猫","苹果","手机"]。
    • 列表可以嵌套,如b=[2,a]
    • 可以使用[起始位置:结束位置]的方式切割列表。位置从0开始计算。
    • 注意,列表切割[x:y]数学意义是[x:y),即不包含y。
    • 是可修改的,如a[1]=xyz。
      3.png


  • 【元组 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}。
    4.png


二、变量——程序语言里的代数

正如前面所展示,变量就像是初中,高中的代数一样,你可以用x,y,z,m,n,f(x),y(x),g(x)……去代表任何未知或已经知的数字,方程式,函数,表达式等。
例如在数学上,你可以这样:
  1. x=2
  2. y=3
  3. x=a+b
复制代码
如下面的中学简单例题:

\[  \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。总之你可以稍微留意这一点。
  1. >>> # 定义变量ip
  2. >>> ip="10.1.1.1"   #这是一个“数据”,
  3. >>> print(ip)       #这是如何使用数据————显示它当前指向的内容"10.1.1.1"
  4. 10.1.1.1
  5. >>> ip="10.1.1.200"   #变量,是会变化的,它指向了新的数据
  6. >>> print(ip)       #这是如何使用数据————显示它当前指向的内容"10.1.1.200"
  7. 10.1.1.200
  8. >>>
复制代码
2.1 使用变量
  1. #定义两个变量a和b
  2. a,b = 15,"小明"
  3. print(a)        #直接使用变量
  4. 15
  5. print(b)
  6. 小明
  7. print("他的名字叫%s" %b)    #格式化序列方式,%s格式化字符串
  8. 他的名字叫小明
  9. print("他的年龄是%s" %a)
  10. 他的年龄是15
  11. print("%s的年龄是%d" %(b,a))    #%d格式化整数
  12. 小明的年龄是15
  13. print(f"{b}的年龄是{a}")        #格式化字符串方式,python3.6后支持
  14. 小明的年龄是15
  15. #定义两个变量x和y
  16. x,y = 2,3
  17. print(f"{x}乘以{y}的结果是:{x*y}")
  18. 2乘以3的结果是:6
复制代码
5.png
6.png

三、循环和条件判断

3.1 for循环

很重要的一个循环语法,是最常见的完成重复工作的方式。目前,我们仅需要能看懂它就行。
格式为for x in y: 后面跟上动作,行为,方法,手段,技巧……,你可以理解为,对于x,在y里面逐个寻找,并指向找到的目标,完成指定动作,直到找完。
变量x,你可以理解为一个【指针】,它首先指向了y里面的第1个数据,按指令操作,操作完成,指向第2个,再操作……直到结束。
很简单,就是指向--操作--指向--操作……,直到没有可操作的。
嗯,就像你在指挥一个叫小张的人在"盲盒堆"里给开盲盒,小张在做的事就是指向第1个盲盒--打开--指向第2个盲盒--打开……,直到"盲盒堆"空了。就像下面这样:
  1. #这不是可运行代码,只是代码释义
  2. #模拟对比不绝对准确。
  3. #也解释了缩进,缩进使代码像文章段落一样清晰。
  4. #小张在盲盒堆按顺序打开,直到盲盒堆空了。然后破产了(不循环)。
  5. #准确点,变量不是“小张”,是“小张的第x个盲盒”
  6. for "小张" in "盲盒堆":
  7.     打开盲盒给你  
  8. 破产了   
  9. #还可以这样,小张在一堆沙糖桔里
  10. #准确点,变量不是“小张”,是“小张的第x个沙糖桔”
  11. #小张会吃第1个,休息1分钟,第2个休息1分钟……一直吃完。然后睡觉(不循环)。
  12. for "小张" in "一堆沙糖桔":
  13.     吃
  14.     休息1分钟  
  15. 睡觉  
  16. #也可以这样,小张在一年365天的时间里
  17. #准确点,变量不是“小张”,是“小张的第x天”
  18. #小张在第1天上班下班睡觉,第2天……第3天……直到一年结束。然后升职加薪(不循环)。
  19. for "小张" in "365天":
  20.     上班
  21.     下班
  22.     睡觉
  23. 升职加薪      
复制代码
下面是一个正常的代码示例,相信你一定能看懂。
  1. #ip_list是一个列表,里面存了一些交换机的ip
  2. #ip是一个变量,变量名字可以是任意的,只是ip符合语义。
  3. >>> ip_list = ["10.8.8.8","10.7.7.7","10.6.6.6","10.5.5.5"]
  4. >>> for ip in ip_list:
  5. ...     print(ip)
  6. ...
  7. 10.8.8.8
  8. 10.7.7.7
  9. 10.6.6.6
  10. 10.5.5.5
复制代码
在上面的代码中,变量ip就像一个指针,它首先指向了第1个数据"10.8.8.8"然后打印,完成后指向第2个……第3个,直到结束。
所以下面再模拟一个伪代码,你应该也能看懂,它依次完成了4台交换机的telnet登录,用户名输入,密码输入,执行命令,保存查询结果至以ip地址命名的txt文件中。
  1. # 这不是一个可运行的代码,只是代码释义
  2. # 伪代码的模拟对比不绝对准确。
  3. # 你知道的,在英文中,send是发送,save是保存,read是读取,output是输出
  4. >>> ip_list = ["10.8.8.8","10.7.7.7","10.6.6.6","10.5.5.5"]
  5. >>> for ip in ip_list:
  6.         telnet {ip}
  7.         send "用户名"
  8.         send "密码"
  9.         send "display version"
  10.         read "屏幕内容"
  11.         output = "屏幕内容"
  12.         output.save = "{ip}.txt"
  13.     print({ip},版本查询已完成)
复制代码
上面这段伪代码 中,我用到了output.save。简单说下,在Python中,AAAA.xxxx代表对"AAAA"使用一个"xxxx"的方法(Methods)。
这是一个英文直译,Methods,方法,措施。初次听方法这个概念可能觉得怪怪的,你可以理解为动作,行为,方法,手段,技巧……,例如苹果.削皮,大米.蒸。
实例如下,通过某种动作,行为,方法,手段,技巧……,我把"we love python"转换成了首字母大写和全大写,而原字符串不受任何影响。其中title()和upper()就是方法。
7.png

到此,每次看到for x in y:,你都可以在心里默念,
  1. for x in y:
  2. 对于x,指向y里面时:   #一直把数据指完
  3.     操作1
  4.     操作2
  5. 完成,干别的去
复制代码
3.2 while循环

略,我还没学,瞄了一眼,觉得暂时用不上。也不难,while英文就是“当……时,做……事”,比较容易理解。
3.3 if-else 判断

if的英文意思是如果。
这就简单了,if……else就是字面意思,如果……否则。
你能看懂吗?我觉得能,如果看不懂请留言说哈~!
  1. #代码释义
  2. if True
  3.     do something    #如果为真,忽略下面的,执行这个
  4. else
  5.     do something    #如果为假,忽略上面的,执行这个
  6. #又一个模拟释义,我只吃苹果,其他水果都你吃
  7. if "这是苹果"
  8.     我吃
  9. else
  10.     你吃
  11. #还是模拟释义,检查设备是否需要升级
  12. for ver_name in  version_files:
  13.     if  ver_name == "Software_V1.1.10"
  14.         print("需要升级")
  15.     else
  16.         print("需要升级")
复制代码
下面展示一个我写的简单代码示例
8.png

首先创建了一个字典,包含的名字和年龄,当然你也可以说这是名字和存款(万),区分他们是贫穷还是小康,这个随意。
使用for循环,2个变量,分别指向名字和年龄。
请注意缩进,在循环时,if判断是在for循环内的,同样的,我还使用了if嵌套,虽然并不推荐这样,因为有if-elif-else语句可以用。第二个if-else是在第一个else内的。
缩进决定了代码的执行位置,层次。这就像一篇文章的段落一样,缩进不同就代表了他是在段落内还是段落外。
例如,我们把if判断放在for之外,即和for平级,不受for影响,代码会在执行完for之后,再执行if。
9.png

可以看到,年龄判断仅对最后一个人有效。这是因为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模块中的函数,实现了登录交换机,并查询交换机的版本。
  1. import paramiko
  2. import time
  3. ip = "10.7.7.7"
  4. username = "hao"
  5. password = "admin12345"
  6. #SSH终端函数,发起SSH连接
  7. ssh_client = paramiko.SSHClient ()
  8. ssh_client.set_missing_host_key_policy (paramiko.AutoAddPolicy ())
  9. ssh_client.connect (
  10.     hostname=ip,username=username,password=password
  11.     )
  12. print ("你已成功连接至", ip)
  13. command = ssh_client.invoke_shell ()    #类的实例化
  14. time.sleep (1)                          #time类,sleep函数,等待1秒
  15. command.send ("sys\n")                  #send函数,发送交换机命令
  16. command.send ("dis version\n")
  17. time.sleep (2)
  18. output = command.recv (65535)       #recv函数,接收交换机命令的回显内容
  19. print (output.decode ("ascii"))     #打印交换机的回显内容
  20. 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。
  1. def 函数名(参数1,参数2……)
  2.     语句
  3.     return
复制代码
函数定义结构如下图:
图片及示例来自Python3 函数 | 菜鸟教程
10.png

如下定义了一个比较数字大小的函数。输入两个数字,会将较大的值输出。
  1. def max(a, b):
  2.     if a > b:
  3.         return a
  4.     else:
  5.         return b
复制代码
11.png



类是面向对象编程的一个概念,目前仅做了解即可。你可以暂时把类理解成很多函数的集合。而你需要以类.函数的方式去使用相应的函数。
正如前文所述的AAAA.xxxx方式,点后面的指令(函数,表达式……)代表了某种动作,行为,方法,手段,技巧……
以下是一些简介:
面向对象技术简介

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
方法:类中定义的函数。
……
更多请自行搜索相关书籍或教程。
总结

通过以上简单的学习,一般来说是可以看懂不太复杂的代码了,可以尝试进行我们的网络自动化学习进程了。虽然编写代码依然有些困难,但我们借助网络搜索,AI,实现看懂,简单的编写和修改代码并不是一件难事。
同样,在后续学习期间我们可能还需要经常的搜索查询资料或者借助AI工具。
最后作为复习验证,来尝试理解以下代码。以下代码为个人参考书籍编写并由AI辅助完成。可以实现对交换机的
  1. #导入需要的模组
  2. import paramiko
  3. import time
  4. #创建ip列表,统一的用户名和密码
  5. ip = ["10.8.8.8","10.7.7.7","10.6.6.6","10.5.5.5"]
  6. username = "hao"
  7. password = "admin12345"
  8. ssh_client = paramiko.SSHClient ()
  9. ssh_client.set_missing_host_key_policy (paramiko.AutoAddPolicy ())
  10. #使用for循环依次登录交换机
  11. for i in ip:
  12.     print ("正在连接至", i)
  13.     ssh_client.connect (
  14.         hostname=i,username=username,password=password,
  15.         look_for_keys=False,allow_agent=False
  16.         )
  17.     command = ssh_client.invoke_shell ()
  18.     time.sleep(0.1)         #加入时间延迟,因为交换机命令界面完整
  19.     #刚进入交换机时,命令行界面只显示一个内容,即hostname
  20.     #一般是<hostname>或[hostname]
  21.     #提取由<>或[]包括的内容
  22.     #i指向连接的IP,sysname指向提取的hostname
  23.     import re      
  24.     output = command.recv(65535).decode('ASCII').replace('\r','')
  25.     match = re.search(r'[<\[](.*?)[>\]]', output)
  26.     sysname = match.group(1)
  27.     print ("你已成功连接至", i, "系统名称:", sysname)
  28.    
  29.     #向交换机发送指令
  30.     time.sleep (0.1)
  31.     command.send ("sys\n")
  32.     command.send ("dis version\n")
  33.     #读取交换机的回显内容,即'dis version'的查询结果
  34.     time.sleep (0.2)
  35.     output_text = command.recv(65535).decode('ASCII').replace('\r','')
  36.     print (output_text)
  37.     # 保存回显结果到TXT文件
  38.     #文件名称为“hostname_IP_output.txt”
  39.     filename = f"[{sysname}]_{i}_output.txt"
  40.     with open(filename, 'w', encoding='utf-8') as f:
  41.         f.write(f"交换机IP: {i} 系统名称:{sysname}\n")
  42.         f.write("=" * 50 + "\n")
  43.         f.write(output)
  44.         f.write(output_text)
  45.         f.write("\n" + "=" * 50 + "\n")
  46.         f.write(f"检查时间: {time.strftime('%Y-%m-%d %H:%M:%S')}")
  47.     print(f"回显结果已保存到文件: {filename}")
  48.     ssh_client.close ()
  49.     print ("已关闭", i, "的连接")
  50.     print ("---------------------------------------------------------------")
  51. print  ("================================================================")
  52. print ("检查结束")
复制代码
以上代码可参考我的博客文章【练习版】使用paramiko批量的查询,管理,配置路由器交换机
参考

Python3 教程 | 菜鸟教程
像计算机科学家一样思考Python(第2版)-艾伦 B. 唐尼 (Allen B. Downey)
Python编程:从入门到实践(第3版)(2025年新版)-[美]埃里克·马瑟斯

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册