Python渗透测试编程技术:方法与实践(第2版)
上QQ阅读APP看书,第一时间看更新

3.8 函数与模块

函数用来完成一定的功能,如向一个函数提供输入,这个函数会返回一个输出。有些功能会经常用到,如果反复为这些功能编写代码,会使得程序变得极为臃肿而且难以阅读。这时就可以使用函数来改善程序,函数能提高应用的模块性以及代码的复用率。

Python中的函数可以分成两种:一种是Python中内置的函数,例如大家都很熟悉的print();另一种是自定义的函数。

编写一个函数很简单,Python中的函数一般包含以下5个部分。

□ 函数的标识符。首先要使用def来创建一个函数,def就是标识符(define的缩写)。

□ 函数名。每一个函数都要有一个名字,这个函数的名字最好能体现出它的功能。

□ 函数的参数。如果将函数比作一个机器,那么参数是放入这个机器的原料,函数的参数需要放在()中。完成之后需要使用冒号结束这一行。

□ 函数体。这部分是函数的主体,其中是实现函数功能的代码。函数体的语句需要相对函数标识符缩进。

□ 函数的return语句。表示函数结束,可以返回一个值。如果没有return语句,则表示返回None。

下面给出了一个计算平方的函数。

     def square(x):
         y= x**2
         return y

如果在命令行中编写这个函数,那么在出现冒号的时候,Python命令行中原本的“>>>”会变成“…”,这时按下Tab键执行缩进。当函数内容完成之后,连续按两下回车键,就可以结束函数编写。这时命令中行又变成“>>>”,如图3-19所示。

图3-19 编写一个函数

如果需要调用这个函数,只需要使用这个函数的名字和参数即可,例如计算99的平方,只需要输入square(99),如图3-20所示。

图3-20 调用一个函数

除了上述定义的函数之外,Python还支持使用匿名函数。匿名函数使用lambda关键字创建。Python中lambda表达式的形式如下所示。

     函数名=lambda 参数列表:函数体

在Python中,lambda表达式适用于简单的函数,例如上例中的square()函数就可以写成如下形式:

     square = lambda x: x**2

如果将一些经常使用的函数编写到一个Python文件中,在任何程序中都可以调用,则会更加方便,C语言中的头文件以及Java中的包就实现了这样的功能,在Python中,这种文件称为模块。如果你有编程基础,一定会对#include <stdio.h>这条语句感到熟悉,而Python中使用的是import语句。

1.import语句

如果希望引入某个模块,可以使用import加上模块的名字,例如要引入Socket模块,就可以使用:

     import socket

如果要同时引入多个模块,可以使用逗号分开:

     import socket,random

这样引用之后,在调用模块中的函数时,必须使用“模块名.函数名”方式来引用。

2.from…import语句

一个模块中可能包含大量的函数,但是程序一般不会使用到它的全部函数。一般使用哪个函数,只需要引入它即可,这时就可以使用from…import语句。例如,只须引入scapy.all模块中的srp()函数,就可以使用如下语句:

     from scapy.all import srp

通过这种方式引入,调用函数时只需要给出函数名,不需要给出模块名。如果需要导入一个模块的所有内容,只须将函数名写成”*”即可,如下所示:

     from scapy.all import *