2017.07.20 Python网络爬虫之Python函数和类

1.所有的程序都是由函数和类组成的,可以说任何程序里面包含的不是函数就是类

2.函数:In Python Everything is A Function,在Python中,所有的一切都是函数,典型的C语言写法,把所需的功能呢都写成一个一个函数,然后由函数调用函数

3.现在编写一个简单的程序makePasswordFileFunction.py,创建一个有针对性的专用密码字典:

# !usr/bin/env python
# -*- coding:utf-8 -*-


import os
import platform
import itertools
import time

def main():
"""主程序"""
global rawList #原始数据列表
rawList=[]
global denyList #非法单词列表
denyList=[' ','','@']
global pwList #最终的密码列表
pwList=[]
global minLen #密码的最小长度
minLen=6
global maxLen #密码的最大长度
maxLen=16
global timeout
timeout=3
global flag
flag=0
run={
'0':exit, #退出程序
'1':getRawList, #创建原始列表
'2':addDenyList, #添加不可能出现的元素
'3':clearRawList, #清空列表
'4':setRawList, #原始列表排序
'5':modifyPasswordLen, #修改最终的密码长度
'6':createPasswordList, #创建最终的字典列表
'7':showPassword, #显示密码
'8':createPasswordFile, #创建密码文件
}

while True:
mainMenu()
op=raw_input('输入选项:')
if op in map(str,range(len(run))):
run.get(op)()
else:
tipMainMenuInputError()
continue

def mainMenu():
"""主菜单"""
global denyList
global rawList
global pwList
global flag
clear()

print(u'| |')
print(u'='*40)
print(u"| |")
print(u"|| 0:退出程序")
print(u"|| 1:输入密码原始字符串")
print(u"|| 2:添加非法字符到列表")
print(u"|| 3:清空原始密码列表")
print(u"|| 4:整理原始密码列表")
print(u"|| 5:改变默认密码长度(%d-%d)" %(minLen,maxLen))
print(u"|| 6:创建密码列表")
print(u"|| 7:显示所有密码")
print(u"|| 8:创建密码文件")
print(u"||")
print(u'='*40)
print(u"||")
print(u"当前非法字符为:%s" %denyList)
print(u"当前原始密码元素为:%s" %rawList)
print(u"共有密码%d个" %len(pwList))
if flag:
print(u"已在当前目录创建密码文件dic.txt")
else:
print(u"尚未创建密码文件")

def clear():
"""清屏函数"""
OS=platform.system()
if (OS==u"Windows"):
os.system('cls')
else:
os.system('clear')

def tipMainMenuInputError():
"""错误提示"""
clear()
print(u"只能输入0-7的整数,等待%d秒后重新输入" %timeout)
time.sleep(timeout)


def getRawList():
"""获取原始数据列表"""
clear()
global denyList
global rawList
print(u"输入回车后直接退出")
print(u"当前原始密码列表为:%s" %rawList)
st=None
while not st== '':
st=raw_input("请输入密码元素字符串")
if st in denyList:
print(u"这个字符串是预先设定的非法字符串")
continue
else:
rawList.append(st)
clear()
print(u"输入回车后直接退出")
print(u"当前原始密码列表为:%s" %rawList)

def addDenyList():
"""添加非法词"""
clear()
global denyList
print(u"输入回车后直接退出")
print(u"当前非法字符为:%s" %denyList)
st=None

while not st=='':
st=raw_input("请输入需要添加的非法字符串:")
denyList.append(st)
clear()
print(u"输入回车后直接退出")
print(u"当前非法字符串列表为:%s" %denyList)

def clearRawList():
"""清空原始数据列表"""
global rawList
rawList=[]

def setRawList():
"""整理原始数据列表"""
global rawList
global denyList
a=set(rawList)
b=set(denyList)
rawList=[]
for str in set(a-b):
rawList.append(str)

def modifyPasswordLen():
"""修改默认密码的长度"""
clear()
global maxLen
global minLen
while True:
print(u"当前密码长度为%d-%d" %(minLen,maxLen))
min=raw_input("请输入密码最小长度:")
max=raw_input("请输入密码最大长度:")
try:
minLen=int(min)
maxLen=int(max)
except ValueError:
print(u"密码长度只能输入数字[6-18]")
break
if minLen not in xrange(6,19) or maxLen not in xrange(6,19):
print(u"密码长度只能输入数字[6-18]")
minLen=6
maxLen=16
continue
if minLen==maxLen:
res=raw_input("确定将密码长度设定为%d吗?(Yy/Nn)" %minLen)
if res not in list('yYnN'):
print(u"输入错误,请重新输入")
continue
elif res in list('Yy'):
print(u"好吧,你确定就好")
break
else:
print(u"给个机会,改一下把")
continue
elif minLen>maxLen:
print(u"最小长度比最大长度还大,可能吗?请重新输入")
minLen=6
maxLen=16
continue
else:
print(u"设置完毕,等待%d秒后返回主菜单" %timeout)
time.sleep(timeout)
break

def createPasswordList():
"""创建密码列表"""
global rawList
global pwList
global maxLen
global minLen
titleList=[]
swapcaseList=[]
for st in rawList:
swapcaseList.append(st.swapcase())
titleList.append(st.title())

sub1=[]
sub2=[]
for st in set(rawList+titleList+swapcaseList):
sub1.append(st)
for i in xrange(2,len(sub1)+1):
sub2+=list(itertools.permutations(sub1,i))
for tup in sub2:
PW=''
for subPW in tup:
PW+=subPW

if len(PW) in xrange(minLen,maxLen+1):
pwList.append(PW)
else:
pass

def showPassword():
"""显示创建的密码"""
global pwList
global timeout
for i in xrange(len(pwList)):
if i%4 ==0:
print("%s " %pwList[i])
else:
print("%s " %pwList[i])

print(' ')
print(u"显示%d秒,回到主菜单" %timeout)
time.sleep(timeout)

def createPasswordFile():
"""创建密码字典文件"""
global flag
global pwList
print(u"当前目录下创建字典文件:dic.txt")
time.sleep(timeout)
with open('./dic.txt','w+') as fp:
for PW in pwList:
fp.write(PW)
fp.write(' ')
flag=1

if __name__ == '__main__':
main()


重点讲解几个用到的函数:
1.map()函数:
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9]

如果希望把list的每个元素都作平方,就可以用map()函数:



因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算:

def f(x):
    return x*x
print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
输出结果:

[1, 4, 9, 10, 25, 36, 49, 64, 81]
注意:map()函数不改变原有的 list,而是返回一个新的 list。

利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。

由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。
2.platform.system()函数:
  • platform.system() 获取操作系统类型,windows、linux等
  • platform.platform() 获取操作系统,Darwin-9.8.0-i386-32bit
  • platform.version() 获取系统版本信息 6.2.0
  • platform.mac_ver()
  • platform.win32_ver() ('post2008Server', '6.2.9200', '', u'Multiprocessor Free')

3.os.system('cls')函数: 在 python命令行中使用下面命令,可以清除命令行。

4.itertools.permutations()函数:itertools模块,使得排列组合的实现非常简单

有序排列:e.g., 4个数内选2个排列:

>>> print list(itertools.permutations([1,2,3,4],2))
[(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]

程序执行结果为:

5.类:In python Everything is  A Class,这种C++的写法就是把所有相似的功能都封装到一个类中,最理想的情况是一个程序只有一个主程序,然后在主程序里实例化类

编写一个密码字典,makePasswordFileClass.py:

# !usr/bin/env python
# -*- coding:utf-8 -*-


import os
import platform
import time
import itertools

class MakePassword(object):
def __init__(self):
self.rawList=[]
self.denyList=[' ','','@']
self.pwList=[]
self.minLen=6
self.maxLen=16
self.timeout=3
self.flag=0
self.run={
'0':exit,
'1':self.getRawList,
'2':self.addDenyList,
'3':self.clearRawList,
'4':self.setRawList,
'5':self.modifyPasswordLen,
'6':self.createPasswordList,
'7':self.showPassword,
'8':self.createPasswordFile
}
self.main()

def main(self):
while True:
self.mainMenu()
op=raw_input('输入选项:')
if op in map(str,range(len(self.run))):
self.run.get(op)()
else:
self.tipMainMenuInputError()
continue



def mainMenu(self):
self.clear()
print(u'| |')
print(u'='*40)
print(u"| |")
print(u"|| 0:退出程序")
print(u"|| 1:输入密码原始字符串")
print(u"|| 2:添加非法字符到列表")
print(u"|| 3:清空原始密码列表")
print(u"|| 4:整理原始密码列表")
print(u"|| 5:改变默认密码长度(%d-%d)" %(self.minLen,self.maxLen))
print(u"|| 6:创建密码列表")
print(u"|| 7:显示所有密码")
print(u"|| 8:创建密码文件")
print(u"||")
print(u'='*40)
print(u"||")
print(u"当前非法字符为:%s" %self.denyList)
print(u"当前原始密码元素为:%s" %self.rawList)
print(u"共有密码%d个" %len(self.pwList))
if self.flag:
print(u"已在当前目录创建密码文件dic.txt")
else:
print(u"尚未创建密码文件")

def clear(self):
OS=platform.system()
if (OS ==u'Windows'):
os.system('cls')
else:
os.system('clear')

def tipMainMenuInputError(self):
self.clear()
print(u"只能输入0-7的整数,等待%d秒后重新输入" %self.timeout)
time.sleep(self.timeout)

def getRawList(self):
self.clear()
print(u"输入回车后直接退出")
print(u"当前原始密码列表为:%s" %(self.rawList))
st=None
while not st=='':
st=raw_input("请输入密码元素字符串:")
if st in self.denyList:
print(u"这个字符串是预先设定的非法字符串")
continue
else:
self.rawList.append(st)
self.clear()
print(u"输入回车后直接退出")
print(u"当前原始密码列表为:%s" %self.rawList)

def addDenyList(self):
self.clear()
print(u"输入回车后直接退出")
print(u"当前非法字符为:%s" %self.denyList)
st=None
while not st=='':
st=raw_input("请输入需要添加的非法字符串:")
self.denyList.append(st)
self.clear()
print(u"输入回车直接退出")
print(u"当前非法字符串列表是:%s" %self.denyList)

def clearRawList(self):
self.rawList=[]
def setRawList(self):
a=set(self.rawList)
b=set(self.denyList)
self.rawList=[]
for str in set(a-b):
self.rawList.append(str)

def modifyPasswordLen(self):
self.clear()
while True:
print(u"当前密码长度为%d-%d" %(self.minLen,self.maxLen))
min=raw_input("请输入密码最小长度:")
max=raw_input("请输入密码最大长度:")
try:
self.minLen=int(min)
self.maxLen=int(max)

except ValueError:
print(u"密码长度只能输入数字[6-18]")
break
if self.minLen not in xrange(6,19) or self.maxLen not in xrange(6,19):
print(u"密码长度只能输入数字[6-18]")
self.minLen=6
self.maxLen=16
continue
if self.minLen==self.maxLen:
res=raw_input("确定将密码长度设定为%d吗?(Yy/Nn)" %self.minLen)

if res not in list('yYNn'):
print(u"输入错误,请重新输入")
continue
elif res in list('Yy'):
print(u"好吧,你确定就好")
break
else:
print(u"给个机会,改一下吧")
continue

elif self.minLen>self.maxLen:
print(u"最小长度大于最大长度,可能吗?请重新输入")
self.minLen=6
self.maxLen=16
continue
else:
print(u"设置完毕,等待%d 秒后返回主菜单" %self.timeout)
time.sleep(self.timeout)
break

def createPasswordList(self):
titleList=[]
swapcaseList=[]
for st in self.rawList:
swapcaseList.append(st.swapcase())
titleList.append(st.title())

sub1=[]
sub2=[]
for st in set(self.rawList+titleList+swapcaseList):
sub1.append(st)
for i in xrange(2,len(sub1)+1):
sub2+=list(itertools.permutations(sub1,i))
for tup in sub2:
PW=''
for subPW in tup:
PW+=subPW

if len(PW) in xrange(self.minLen,self.maxLen+1):
self.pwList.append(PW)
else:
pass

def showPassword(self):
for i in xrange(len(self.pwList)):
if i%4==0:
print(u"%s " %self.pwList[i])
else:
print(u"%s " %self.pwList[i])
print(' ')
print(u"显示%d秒,回到主菜单" %self.timeout)
time.sleep(self.timeout)

def createPasswordFile(self):
print(u"当前目录下创建字典文件:dic.txt")
time.sleep(self.timeout)
with open('./dic.txt','w+') as fp:
for PW in self.pwList:
fp.write(PW)
fp.write(' ')

self.flag=1


if __name__ == '__main__':
mp=MakePassword()



执行结果完全一样





原文地址:https://www.cnblogs.com/hqutcy/p/7214604.html