python函数和类

发布时间:2017-11-12 00:18:31编辑:Run阅读(4055)

    函数

    曾经有一句非常出名的话是 In Unix Everything Is A File,在unix中所有的一切都是文件

    在这里可以借鉴一下 In Python Everything Is A Function,在python程序中,所有的一切都是函数,把所需的功能写成一个一个的函数,然后由函数调用函数,以此类推,最终完成整个程序的功能

    记得之前提过暴力破解,不管用什么工具,暴力破解都少不了一个合适的字典,下面编写一个简单的程序makepasswordfilefunction.py,创建一个有针对性的专用密码字典

    代码如下

    # coding: utf-8
    __author__ = 'www.py3study.com'
    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': createpassowrdfile, #创建密码文件
        }
    
        while True:
            mainMenu()
            op = 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"|| 0:退出程序")
        print(u"|| 1:输入密码原始字符串")
        print(u"|| 2:添加非法字符串到列表")
        print(u"|| 3:清空原始密码列表")
        print(u"|| 4:整理原始密码列表")
        print(u"|| 5:改变默认密码长度({}-{})".format(minlen, maxLen))
        print(u"|| 6:创建密码列表")
        print(u"|| 7:显示所有密码")
        print(u"|| 8:创建字典文件")
        print(u"||")
        print(u"="*40)
        print(u"||")
        print(u"当前非法字符为:{}".format(denylist))
        print(u"当前原始密码元素为:{}".format(rawlist))
        print(u"共有密码{}个".format(len(pwlist)))
        if flag:
            print(u"已在当前目录创建密码文件dict.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的整数,等待{}秒后重新输入".format(timeout))
        time.sleep(timeout)
    
    def getrawlist():
        '''获取原始数据列表'''
        clear()
        global denylist
        global rawlist
        print(u"输入回车后直接退出")
        print(u"当前的原始密码列表为:{}".format(rawlist))
        st = None
        while not st == '':
            st = input("请输入密码元素字符串:")
            if st in denylist:
                print(u"这个字符串是预先设定的非法字符串")
                continue
            else:
                rawlist.append(st)
                clear()
                print(u"输入回车后直接退出")
                print(u"当前原始密码列表为:{}".format(rawlist))
    
    def adddenylist():
        '''添加非法词'''
        clear()
        global denylist
        print(u"输入回车后直接退出")
        print(u"当前非法字符为:{}".format(denylist))
        st = None
        while not st == '':
            st = input("请输入需要添加的非法字符串:")
            denylist.append(st)
            clear()
            print(u"输入回车后直接退出")
            print(u"当前原始密码列表为:{}".format(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"当前密码长度为{}-{}".format(minlen, maxLen))
            min = input("请输入密码最小长度:")
            max = input("请输入密码最大长度:")
            try:
                minlen = int(min)
                maxLen = int(max)
            except ValueError:
                print(u"密码长度只能输入数字[6-18]")
                break
            if minlen not in range(6,19) or maxLen not in range(6,19):
                print(u"密码长度只能输入数字[6-18]")
                minlen = 6
                maxLen = 16
                continue
            if minlen == maxLen:
                res = input(u"确定将密码长度设定为{}吗?(Yy/Nn)".format(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"设置完毕,等待{}秒后回主菜单".format(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 range(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 range(minlen, maxLen + 1):
                pwlist.append(PW)
            else:
                pass
    
    def showpassword():
        '''显示创建的密码'''
        global pwlist
        global timeout
        for i in range(len(pwlist)):
            if i % 4 == 0:
                print("{}".format(pwlist[i]))
            else:
                print("{}".format(pwlist[i]))
        print('\n')
        print(u"显示{}秒,回到主菜单".format(timeout))
        time.sleep(timeout)
    
    def createpassowrdfile():
        '''创建密码文件'''
        global flag
        global pwlist
        print(u"当前目录下创建字典文件:dict.txt")
        time.sleep(timeout)
        with open('dict.txt', 'w') as fp:
            for PW in pwlist:
                fp.write(PW)
                fp.write('\n')
        flag = 1
    
    if __name__ == '__main__':
        main()

    应该看到的结果blob.png

    该脚本将输入的元素根据一定的规则修改,添加后当作新元素添加到元素列表中去,最后将元素列表排列组合得到最后的字典列表

关键字