淘先锋技术网

首页 1 2 3 4 5 6 7

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\n" %pwList[i])

else:

print("%s\t" %pwList[i])

print('\n')

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('\n')

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\n" %self.pwList[i])

else:

print(u"%s\t" %self.pwList[i])

print('\n')

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('\n')

self.flag=1

if __name__ == '__main__':

mp=MakePassword()

执行结果完全一样