干货分享丨Python从入门到编写POC之特殊函数

2020-06-17 8,978

Python从入门到编写POC系列文章是i春秋论坛作家「Exp1ore」表哥原创的一套完整教程,想系统学习Python技能的小伙伴,不要错过哦!

37ea7ee91a484f13baa985631b148dd0.jpg


今天分享的是Python从入门到编写POC之特殊函数、模块及包和库的相关知识点。

01、特殊函数

lambda函数,这个函数是一个只用一行就能解决问题的函数。

Python解释器中运行多行版:

>>> def add(x,y):
...     a = x+y
...     print a
...
>>> add(3,5)
8

一行版(引入了lambda函数):

>>> add = lambda x,y : x+y
>>> add(3,5)
8

4ccf6102f4b7457eba2c50944fd60eb4.jpg


使用方法:

在lambda函数后面直接加变量,变量后直接冒号,冒号后面是表达式,完美解决。

来个表达式:

lambda arg1,arg2,....,argn : expression using arguments

可以通过help命令来查看map函数的官方文档。

>>> help(map)Help on built-in function map in module __builtin__:
map(...)    map(function, sequence[, sequence, ...]) -> list
   Return a list of the results of applying the function to the items of    the argument sequence(s).  If more than one sequence is given, the    function is called with an argument list consisting of the corresponding    item of each sequence, substituting None for missing values when not all    sequences have the same length.  If the function is None, return a list of    the items of the sequence (or a list of tuples if more than one sequence).

dcc7ad0204524b628715901f91902fd8.jpg

使用方法:

map(函数,序列对象)

举个0-10的平方数的例子:

image.png

reduce函数也可通过help命令学习。

filter函数,顾名思义,就是过滤器的意思,用法跟map一样:filter(函数,序列对象)。

举个例子:

image.png

zip函数:

zip( )是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*号操作符,可以将list unzip(解压)。

通过help命令来看:

image.png

举个例子:

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> zip(a,b)
[(1, 4), (2, 5), (3, 6)]

长度不等时,取长度最小的。

>>> c = 'HELL0'
>>> d = 'MOMO'
>>> zip(c,d)
[('H', 'M'), ('E', 'O'), ('L', 'M'), ('L', 'O')]

还有个常用的是构造字典:

>>> demo1 = ['a','b','c']
>>> demo2 = ['d','e','f']
>>> demo3 = zip(demo1,demo2)
>>> demo = dict(demo3)
>>> print demo
{'a': 'd', 'c': 'f', 'b': 'e'}

afed15217f7346a3926c230ad2863ddd.jpg


02、模块

有C语言编程经验的朋友都知道在C语言中如果要引用sqrt这个函数,必须用语句"#include<math.h>"引入math.h这个头文件,否则是无法正常进行调用的。那么在Python中,如果要引用一些内置的函数,该怎么处理呢?

在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块。

很多熟悉import语句的朋友都知道,在前面的内容讲述中,用到过base64这个库。

例子是这样的:

image.png

这个是base64库,Python标准库之一,总而言之,就是一个模块,用import语句引入了这个模块,然后就可以使用模块中的函数了,不用自己动手写具体的函数,节约时间。

也可以这么理解,模块是一个程序,就是.py的程序,如何引入模块?

有以下四种方法:

【1】导入整个模块

>>> import sys
>>> print sys.argv
['']

【2】只导入我们要用到的

>>> from sys import argv
>>> print argv
['']

【3】模块名太长,可以起个别名

>>> import sys as s
>>> print s.argv
['']

【4】从模块中导入所有

>>> from sys import *
>>> print path #输出sys模块中的path
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk','
/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages','
/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat','
/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']

最后一种导入方法不建议使用,原因:若自己定义的变量或函数与所导入模块中的变量或函数同名,易产生混淆。

定义一个自己的模块,在一个目录下,创建了一个demo.py当作模块。

# coding = utf-8

lang = 'HELL0 MOMO'

cb700102d68f49faa96b07588340ca10.jpg


接下来,创建一个py,引入这个模块:

#coding = utf-8

import demo

print demo.lang

201a019c609c46aeab749b57c58ba4d8.jpg


如果是不同的目录该咋办呢?

这里我们就要用到sys库,把demo.py这个模块放到了c盘。

>>> import sys
>>> sys.path.append("C:\Users\20148\Desktop\demo.py")

用这种方法告诉Python解释器,我写的文件在哪里,C:\Users\20148\Desktop\demo.py是我的文件路径,然后就可以直接引入了。

>>> import demo
>>> demo.lang
'HELL0 MOMO'

826f5981f79f432a9350e70928eb0df8.jpg


回到demo.py的储存目录,会发现多一个pyc文件。

ead88802398e430e827a8ae95281efd3.jpg


这是为什么呢?

因为当Python解释器都去了.py的文件,先将它变成由字节码组成的pyc文件,然后这个pyc文件把文件给了一个叫Python虚拟机的东西运行。

继续深入,将demo.py这个文件改造。

image.png

d18b6ef3627b41ad9b7676a28ad63f63.jpg


如果将它作为模块,导入上面的方法,sys.path.append("路径"),然后查看模块属性,dir( )。

>>> dir(demo)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'lang']

都是一个文件,我们可以把它当作程序执行,也可以当作模块引入。

>>> __name__
'__main__'
>>> demo.__name__
'demo'

如果是程序执行的话,__name__=="__main__"。

如果是模块呢?demo.__name__==“demo”,即为模块的名称。

如果是模块的引入,就不用写if __name=="__main__"了。

03、包和库

包(带 __init__.py 的文件夹)和库,比模块大了,一个包(就是咱们熟悉的目录)里面有好多的模块(即为.py文件),就跟你钱包一样,有好多钱一样,当然了,库就更大了,一个Python的标准库有好多的包,包又有一堆的模块。

举个例子:

建立一个叫ichunqiu的目录,里面放两个py文件,一个BaZong.py,一个MoMo.py,再建立一个空文件__init__.py。

BaZong.py源码如下:

#coding = utf-8 

def BaZong():
        print 'HELL0 MOMO!!!'

MoMo.py源码如下:

#coding = utf-8 

def MoMo():
        print 'HELL0 BaZong!!!'

然后,咱们在与ichunqiu同级的目录中,创建一个demo.py调用这个ichunqiu的包。

image.png

ce43f0c1050a4695afad55af867b719e.jpg


以上是今天要分享的内容,大家看懂了吗?


本文作者:i春秋聚集地

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/133677.html

Tags:
评论  (0)
快来写下你的想法吧!

i春秋聚集地

文章数:24 积分: 225

i春秋聚集地旨在为信息安全爱好者提供及时有效的信息渠道和体验平台,欢迎关注公众号(icqedu),和“i春秋学院”微博了解更多网络安全新知识~

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号