前言
以Python编程为主,围绕渗透测试展开的一门专栏。专栏内容包括: Python基础编程(Python基础、语法、对象、文件操作,错误和异常),Python高级编程(正则表达式、网络编程、WEB编程),以及Python安全编程(个人博客开发,Python爬虫的编写,漏洞exp的编写,红队-漏洞扫描器开发,蓝队-自动化工具等等),通过本专栏的学习,能把Python编程应用到实际的渗透当中,可以提高效率,同时拥有新的思路,同时也能打造属于自己的武器库工具
基础篇(一)
Hello World程序
长期以来,编程界都认为刚接触一门新语言时,如果首先使用它来编写一个在屏幕上显示消息“Hello world!”的程序,将给你带来好运。
要使用Python来编写这种Hello World程序,只需一行代码:
print("Hello world!")
这种程序虽然简单,却有其用途:如果它能够在你的系统上正确地运行,你编写的任何Python程序都将如此。
变量
下面来尝试在程序中使用一个变量。在这个文件开头添加一行代码,并对第2行代码进行修改,如下所示:
message = "Hello Python world!"
print(message)
我们添加了一个名为message 的变量 。每个变量都存储了一个值 ——与变量相关联的信息。在这里,存储的值为文本“Hello Python world!”。
这样程序会输出“Hello Python world!”
数据类型
字符串
大多数程序都定义并收集某种数据,然后使用它们来做些有意义的事情。鉴于此,对数据进行分类大有裨益。我们将介绍的第一种数据类型是字符串。字符串虽然看似简单,但能够以很多不同的方式使用它们。
字符串 就是一系列字符。在Python中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号,如下所示:
"This is a string."
'This is also a string.'
这种灵活性让你能够在字符串中包含引号和撇号:
'I told my friend, "Python is my favorite language!"'
"The language 'Python' is named after Monty Python, not the snake."
"One of Python's strengths is its diverse and supportive community."
数字
在编程中,经常使用数字来记录游戏得分、表示可视化数据、存储Web应用信息等。Python根据数字的用法以不同的方式处理它们。鉴于整数使用起来最简单,下面就先来看看Python是如何管理它们的。
在Python中,可对整数执行加(+ )减(- )乘(* )除(/ )运算
2 + 3
3 - 2
2 * 3
3 / 2
程序运行的结果如下:
在Python中使用两个乘号表示乘方运算:
3 ** 2
3 ** 3
10 ** 6
程序运行的结果如下:
浮点数
Python将带小数点的数字都称为浮点数 。大多数编程语言都使用了这个术语,它指出了这样一个事实:小数点可出现在数字的任何位置。每种编程语言都须细心设计,以妥善地处理浮点数,确保不管小数点出现在什么位置,数字的行为都是正常的。
从很大程度上说,使用浮点数时都无需考虑其行为。你只需输入要使用的数字,Python通常都会按你期望的方式处理它们:
0.1 + 0.1
0.2 + 0.2
2 * 0.1
2 * 0.2
程序运行的结果如下:
但需要注意的是,结果包含的小数位数可能是不确定的:
0.2 + 0.1
3 * 0.1
程序运行的结果如下:
注释
在大多数编程语言中,注释都是一项很有用的功能。本书前面编写的程序中都只包含Python代码,但随着程序越来越大、越来越复杂,就应在其中添加说明,对你解决问题的方法进行大致的阐述。注释 让你能够使用自然语言在程序中添加说明。
在Python中,注释用井号(# )标识。井号后面的内容都会被Python解释器忽略,如下所示:
# 向大家问好
print("Hello Python people!")
程序运行的结果如下,Python解释器将忽略第1行,只执行第2行:
列表
列表 由一系列按特定顺序排列的元素组成。你可以创建包含字母表中所有字母、数字0~9或所有家庭成员姓名的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。鉴于列表通常包含多个元素,给列表指定一个表示复数的名称(如letters 、digits 或names )是个不错的主意。
在Python中,用方括号([] )来表示列表,并用逗号来分隔其中的元素。下面是一个简单的列表示例,这个列表包含几种自行车:
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles)
如果你让Python将列表打印出来,Python将打印列表的内部表示,包括方括号,程序运行的结果如下:
访问列表元素
列表是有序集合,因此要访问列表的任何元素,只需将该元素的位置或索引告诉Python即可。要访问列表元素,可指出列表的名称,再指出元素的索引,并将其放在方括号内。
例如,下面的代码从列表bicycles 中提取第一款自行车:
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[0])
当你请求获取列表元素时,Python只返回该元素,而不包括方括号和引号,在Python中索引是从0开始的,而不是从1开始的:
如果我们要访问该列表中的第三个元素,那我们便可以写出如下程序
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[2])
程序运行的结果如下
Python为访问最后一个列表元素提供了一种特殊语法。通过将索引指定为-1 ,可让Python返回最后一个列表元素:
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[-1])
程序运行的结果如下
切片
要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range() 一样,Python在到达你指定的第二个索引前面的元素后停止。要输出列表中的前三个元素,需要指定索引0~3,这将输出分别为0 、1 和2 的元素。
下面的示例处理的是一个运动队成员列表:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[0:3])
代码打印该列表的一个切片,其中只包含三名队员。输出也是一个列表,其中包含前三名队员,程序运行的结果如下:
你可以生成列表的任何子集,例如,如果你要提取列表的第2~4个元素,可将起始索引指定为1 ,并将终止索引指定为4 :
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[1:4])
这一次,切片始于’marita’ ,终于’florence’ ,程序运行的结果如下:
如果你没有指定第一个索引,Python将自动从列表开头开始:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[:4])
由于没有指定起始索引,Python从列表开头开始提取,程序运行的结果如下:
无论列表多长,这种语法都能够让你输出从特定位置到列表末尾的所有元素。负数索引返回离列表末尾相应距离的元素,因此你可以输出列表末尾的任何切片。例如,如果你要输出名单上的最后三名队员,可使用切片players[-3:] :
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[-3:])
上述代码打印最后三名队员的名字,即便队员名单的长度发生变化,也依然如此,程序运行的结果如下:
元组
列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,这对处理网站的用户列表或游戏中的角色列表至关重要。然而,有时候你需要创建一系列不可修改的元素,元组可以满足这种需求。Python将不能修改的值称为不可变的 ,而不可变的列表被称为元组 。
定义元组
元组看起来犹如列表,但使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。
例如,如果有一个大小不应改变的矩形,可将其长度和宽度存储在一个元组中,从而确保它们是不能修改的:
dimensions = (200, 50)
print(dimensions[0])
print(dimensions[1])
我们首先定义了元组dimensions ,为此我们使用了圆括号而不是方括号。接下来,我们分别打印该元组的各个元素,使用的语法与访问列表元素时使用的语法相同:
空行、缩进与多行代码
空行
要将程序的不同部分分开,可使用空行。你应该使用空行来组织程序文件,但也不能滥用;只要按本书的示例展示的那样做,就能掌握其中的平衡。例如,如果你有5行创建列表的代码,还有3行处理该列表的代码,那么用一个空行将这两部分隔开是合适的。然而,你不应使用三四个空行将它们隔开。
空行不会影响代码的运行,但会影响代码的可读性。Python解释器根据水平缩进情况来解读代码,但不关心垂直间距。
缩进
建议每级缩进都使用四个空格,这既可提高可读性,又留下了足够的多级缩进空间。
在字处理文档中,大家常常使用制表符而不是空格来缩进。对于字处理文档来说,这样做的效果很好,但混合使用制表符和空格会让Python解释器感到迷惑。每款文本编辑器都提供了一种设置,可将输入的制表符转换为指定数量的空格。你在编写代码时应该使用制表符键,但一定要对编辑器进行设置,使其在文档中插入空格而不是制表符。
在程序中混合使用制表符和空格可能导致极难解决的问题。如果你混合使用了制表符和空格,可将文件中所有的制表符转换为空格,大多数编辑器都提供了这样的功能。
多行代码
很多Python程序员都建议每行不超过80字符。最初制定这样的指南时,在大多数计算机中,终端窗口每行只能容纳79字符;当前,计算机屏幕每行可容纳的字符数多得多,为何还要使用79字符的标准行长呢?这里有别的原因。专业程序员通常会在同一个屏幕上打开多个文件,使用标准行长可以让他们在屏幕上并排打开两三个文件时能同时看到各个文件的完整行。PEP 8还建议注释的行长都不超过72字符,因为有些工具为大型项目自动生成文档时,会在每行注释开头添加格式化字符。
有关行长的指南并非不可逾越的红线,有些小组将最大行长设置为99字符。在大多数编辑器中,都可设置一个视觉标志——通常是一条竖线,让你知道不能越过的界线在什么地方。