• 包, time与datetime, random, hashlib与hmac, requests, re


    包的特征

    1.包是含有__init__的文件夹,导包就是导入__init__

    2.包一定是被当作模块文件导入,模块文件的搜索路径以执行文件路径为基准

    相对导入与绝对导入

    绝对导入

    以包的根目录为基准

    相对导入

    以当前被导入的模块所在的目录为基准

    .表示当前文件夹下的文件

    ..表示父文件夹下的文件

    ...表示爷爷文件夹下的文件

    两种导入都只能在包的内部使用

    包的作用

    在扩展模块功能的时候,把多个模块文件放入一个包(文件夹)内,但不改变模块的导入方式,类似于函数的装饰器

    time模块和datetime模块

    import time
    
    #time模块:与时间相关
        #1.time.time()---返回当前时间戳,从1970年1月1日00:00:00开始计算
        
        #2.格式化时间
    print(time.strftime('%Y-%m-%d %H:%M:%S'))
    print(time.strftime('%Y-%m-%d %X'))
    print(time.strftime('%x %X'))
        
        #3.结构化时间
    print(time.localtime()) #列出时间的九个元素,年/月/日/时/分/秒/一周中第几天(周日始)/一年中第几天/是否夏令时
    
    
    import datetime
    
    #datetime模块:时间加减
    
    now = datetime.datetime.now()
    print(now)  #秒精确到小数点后六位
    
    #时间加减
    print(now + datetime.timedelta(3))  #加三天
    print(now + datetime.timedelta(weeks = 3))  #加三周
    print(now + datetime.timedelta(hours = 3))  #加三小时
    
    #时间替换
    print(now.replace(1949,10,1,10,1,10,0)) 
    

    random模块

    import random
    #random模块:随机数
    
    # random.seed(10)
    
    #常用
    print(random.random())  #随机(0-1)之间浮点数
    
    print(random.randint(1,3))  #随机[1-3]之间整数
    
    print(random.randrange(5))  #随机[0,5)的整数
    
    lt = [1,2,3]
    random.shuffle(lt)  #将列表随机洗牌
    print(lt)
    
    print(random.choice(lt))    #从可迭代对象中随机选择一个
    
    #随机数种子,控制只随机一次
    # random.seed(10)
    print(random.random())
    
    random.seed(time.time())    #梅森旋转算法
    print(random.random())
    
    print(random.sample(lt,2))  #抽样
    

    hashlib模块和hmac模块

    #hashlib模块
    import hashlib
    m = hashlib.md5()
    m.update(b's')
    m.update(b'b')
    print(m.hexdigest())  #26148d621ef74844918af182d63976b6
    
    m = hashlib.md5()
    m.update(b'sb')
    print(m.hexdigest())    #26148d621ef74844918af182d63976b6
    #可叠加性:多次update不同内容与直接一次update总内容结果一致
    
    #破解hashlib加密
        #1.列出用户常用密码表
        #2.通过遍历得到常用密码对应哈希结果
        #3.比对拦截包的哈希值得到正确密码
    pwd_list = ['abc','123','456','sb']
    hash_pwd = '26148d621ef74844918af182d63976b6'
    for pwd in pwd_list:
        m = hashlib.md5()
        m.update(pwd.encode('utf8'))
        res = m.hexdigest ()
        if res == hash_pwd:
            print('密码为:',pwd)
    
    #hmac模块:秘钥(salt)
    import hmac
    m = hmac.new(b'maerzi')
    m.update(b'caiqilong')
    print(m.hexdigest())    #95e4cf14b46c797c40da2b090a67b5b9
    
    m = hmac.new(b'mababa')
    m.update(b'caiqilong')
    print(m.hexdigest())    #7aab304fa2a10b67d4f480ae4c9e07a2
    #相同的密码,密钥不同的到的hmac结果不同
    

    typing模块

    与函数联用,控制函数参数的数据类型,提供基础之外的数据类型

    from typing import Iterable, Iterator
    def f(x: Iterator, y: Iterable) -> list:
        pass
    

    requests模块re模块

    requests 模块

    #requests模块:爬虫-->爬数据,模拟浏览器对url发送请求,拿到数据
    #url:同一资源定位符,永不重复
    import requests
    response = requests.get('https://www.cnblogs.com/nickchen121/')
    data = response.text
    # print(data)
    
    #正则re:从大的字符串中挑选出具有某种形状特点的字符串,结果以列表方式存储
    import re
    res_title = re.findall('<a class="postTitle2" .*?>(.*?)</a>',data,re.S)
    # print(res_title)
    res_digest = re.findall('<div class="c_b_p_desc">(.*?)<a href="https://.*?" class="c_b_p_desc_readmore">',data,re.S)
    # print(res_digest)
    l = len(res_digest)
    for i in range(l):
        print(res_title[i].strip()+'
    '+res_digest[i].strip()+'
    '+'*'*175)
    

    正则表达式

    #正则表达式
    import re
        #1. "^..." 表示以...字符开头, "^" 自己本身不占字符位置
    s = '''abcabc1  
    23'''
    res = re.findall('^abc',s)
    print(res)
    res = re.findall('abc',s)
    print(res)
    res = re.findall('^abc',s) # "" 表示转义字符使 "" 后的字符转义
    print(res)
    
        #2. "...$" 表示以..字符结尾, "$" 自己本身不占字符位置
    res = re.findall('bc$',s)
    print(res)
    res = re.findall('bc',s)
    print(res)
    
        #3. "." 表示匹配一个字符,该字符除了"
    "外均可
    res = re.findall('a.c.',s)
    print(res)
    
        #4. "w" 表示匹配一个单词字符,该字符属于字母数字下划线 "[A-Z,a-z,0-9,'_']"
    res = re.findall('w',s)
    print(res)
    
        #5. "W" 表示匹配一个单词字符,该字符不属于字母数字下划线 "[A-Z,a-z,0-9,'_']"
    res = re.findall('1WWW2',s)
    print(res)
    
        #6. "d" 表示表示匹配一个数字字符
    res = re.findall('dd',s)
    print(res)
    
        #7. "D" 表示匹配一个非数字字符
    res = re.findall('D',s)
    print(res)
    
        #8. "s" 等价于 "W"
    res = re.findall('s',s)
    print(res)
    
        #9. "S" 等价于 "w"
    res = re.findall('S',s)
    print(res)
    
        #10. "+" 表示匹配 "+" 前面一个字符 "[1,+∞)" 次,从 "+∞" 到 "1" , "+" 自己本身不占字符位置
    res = re.findall('abcd+','abcddddd abcd abc')
    print(res)
    
        #11. "?" 表示匹配 "?" 前面一个字符 "[0,1]" 次,从 "1" 到 "0" , "?" 自己本身不占字符位置
    res = re.findall('abcd?','abcddddd abcd abc')
    print(res)
    
        #12. "*" 表示匹配 "*" 前面一个字符 "[0,+∞)" 次,从 "+∞" 到 "0" , "*" 自己本身不占字符位置
    res = re.findall('abcd*','abcddddd abcd abc')
    print(res)
    
        #13. "[]" 表示匹配 "[]" 中的字符串中的某一个字符, "[]" 自己本身占一个字符位置
    res = re.findall('[abc]b','abcbbccbcdbc')
    print(res)
    
        #14. "[^]" 表示 "[^]" 中的字符串中的任意一个字符都不能匹配, "[^]" 自己本身占一个字符位置
    res = re.findall('[^abc]bc','abcbbccbc bc')
    print(res)
    
        #15. "|" 表示匹配 "|" 左边的字符串或者匹配 "|" 右边的字符串
    res = re.findall('bbc|abc','abcbbcdbc')
    print(res)
    
        #16. "{m,n}" 表示匹配 "{m,n}" 前面一个字符 "[m,n]" 次, "{m,n}" 自己本身不占字符位置, "{}" 内只有一个数表示匹配前一个字符确定的次数
    res = re.findall('abc{1,2}','abccabcabccc')
    print(res)
    

    贪婪模式非贪婪模式

    import re
    #贪婪模式(最大跨度): ".*" , 其中 ".":任意字符 , "*":"[0,+∞)"个
    s = 'bacdefgaaaaaaaaaaaag'
    print(re.findall('a.*g',s))
    
    #非贪婪模式(最小跨度): ".*?" , 其中 ".":任意字符, "*":"[0,+∞)"个, "?":进入非贪婪模式
    print(re.findall('a.*?g',s))
    

    特殊构造(仅了解)

    #特殊构造(仅了解)
    # "a(?=d)" 表示 "a" 后面是数字但不要数字,不消耗 "d" 内容
    s = 'a123 aaaa a234 abc'
    print(re.findall('a(?=d)',s))
    print(re.findall('a(?=w)',s))
    
    #匹配邮箱练习
    s = '#@#@#@nickchen121@163.com$$$$////nick@qq.cn$$#$#$[]]2287273393@162.com@$2423@423lksdlf@j#'
    res = re.findall('w+@w+.w+',s)  # "w" :字母/数字/下划线
    print(res)
    

    re模块中常用函数

    import re
    # re模块中常用的函数( "findall" 之外)
    #1. re.compile
    s = 'abcd abcddd abc'
    res = re.compile('abcd*')
    print(res)
    print(re.findall(res,s))
        #实际用途
    email_pattern = re.compile('w+@w+.w+')
    phione_pattern = re.compile('d{13}')
    
    # 接下来两个面试非常重要
        #2. re.match---匹配到一个之后就不再匹配,必须以以该字符串开头
    s = 'abcd abcddd abc'
    res = re.match('abcd*',s)
    print(res)
    print(res.group())
    
        #3. re.search---匹配到一个之后就不再匹配,可以不以该字符串开头
    res = re.search('abcd*',s)
    print(res)
    print(res.group())
    
    #4. re.split---以写的正则表达式划分
    s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
    print(re.split('d+',s))
    
    #5. re.sub == replace 将写的正则表达式替换成指定字符
    s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
    print(re.sub('d+','',s))
    
    #6. re.subn 比 re.sub 多输出替换次数
    s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
    print(re.subn('d+','',s))
    

    补充

    import re
    #7.补充
    #修饰符
        # re.S---非常有用
    s = '''abc
    abcabc*abc
    '''
    print(re.findall('abc.abc',s))  # "." 不匹配换行符
    print(re.findall('abc.abc',s,re.S))  # "re.s" 让 "." 能匹配换行符
    
    #9. 分组(非常重要):"()"---提取括号内的内容,多个括号提取内容时一个符合的结果用一个元组存储
    s = 'abc abcd amcdd'
    print(re.findall('a(.)c(d)',s))
    
        #有名分组(了解即可)---一般与 "re.search" 联用,给 "()" 提取的内容加上名字,以字典形式输出
    s = 'abc abcd amcdd'
    print(re.search('a(?P<name1>.)c(?P<name2>d)',s).groupdict())
    
        #有名分组与 "re.sub" 联用, 匹配的字符串中 "()" 提取的有名内容保留,其他去除
    s = 'abc123abc123'
    print(re.sub('cd+a',' ',s))
    print(re.sub('c(?P<name>d+)a',' g<name> ',s))
    

    总结

    #重点需记忆内容
        # 贪婪和非贪婪: ".*" / ".*?"
        # re.findall
        # re.S
        # "re.match" 和 "re.search" 区别
        # 分组: "()" ---有名分组: 给分组加名字
    
  • 相关阅读:
    iOS热更新-8种实现方式
    HTTPS分析-简单易懂
    猖獗的假新闻:2017年1月1日起iOS的APP必须使用HTTPS
    iOS的ATS配置
    Objective-C中block的底层原理
    iOS系列文章
    UIViewController生命周期-完整版
    缩放因子和UI设计
    iOS APP 如何做才安全
    逆向工程
  • 原文地址:https://www.cnblogs.com/-406454833/p/11627492.html
Copyright © 2020-2023  润新知