zoukankan      html  css  js  c++  java
  • 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()



    执行结果完全一样





  • 相关阅读:
    反射
    IDEA配置数据库
    配置idea的maven镜像为aliyun
    蓝桥---芯片测试(思维)
    汉诺塔(思维、DP思想)
    立方数(质因子、优化)
    碎碎念(DP)
    牛牛战队的比赛地(三分)
    子段乘积(尺取、逆元)
    子段异或(位运算)
  • 原文地址:https://www.cnblogs.com/hqutcy/p/7214604.html
Copyright © 2011-2022 走看看