包
包的作用:
当模块内部函数过多,为了方便管理模块,把一个模块划分成多个模块,但是又不能改变导入方式
把多个模块放入 一个包中,未来导包就是__init__
什麽是包
包就是模塊
爲什麽要有包
1.包 == 模块, 包拿来导入用的
2.包是含有__init__.py
的文件夹; 导包就是导入__init__
3.包一定是被当作模块文件导入,模块文件 m1.py/m2.py
的搜索路径以执行文件 包的介绍.py
路径为准
time模塊
時間相關,提供了三種不同類型的時間(時間戳),三種不同類型的時間可以相互轉換
import time print(time.time()) # 时间戳形式 # 格式化时间 print(time.strftime('%Y-%m-%d %X')) # 结构化时间 print(time.localtime()) # 结构化时间 --》 格式化时间 struct_time = time.localtime(3600*24*365) print(time.strftime('%Y-%m-%d %X',struct_time)) # 格式化时间 --》 结构化时间 format_time = time.strftime('%Y-%m-%d %X') print(time.strptime(format_time,'%Y-%m-%d %X')) # 结构化时间 --》 时间戳 struct_time = time.localtime(3600*24*365) print(time.mktime(struct_time)) # 时间戳 --》 结构化时间 time_stamp = time.time() print(time.localtime(time_stamp)) # (*******) time.time() time.sleep(1)
datetime模塊
# datetime模块:时间的加减 import datetime now = datetime.datetime.now() print(now) # 默认3天 print(now + datetime.timedelta(3)) # 加3周 print(now + datetime.timedelta(weeks=3)) # 加3小时 print(now + datetime.timedelta(hours=3)) # 减3小时 print(now - datetime.timedelta(hours=3)) print(now + datetime.timedelta(hours=-3)) print(now.replace(year=1949, month=10, day=1, hour=10, minute=1, second=0, microsecond=0))
random模塊
random模块:随机数
import random # 掌握 # 0-1 print(random.random()) # [1-3] print(random.randint(1, 3)) # 打乱 lt = [1, 2, 3] random.shuffle(lt) print(lt) # 随机选择一个 print(random.choice(lt)) # 只随机一次 --> 梅森旋转算法 import time # random.seed(time.time()) # random.seed(111111111111) print(random.random()) # 了解 print(random.sample([1, 'a', 'c', 2, 3, 4], 2))
hashlib與hmac模塊
hashlib模塊:可對字符加密
hmac模塊:對字符加密,並加上密鑰
hashlib有叠加性
m=hashlib.md5() m.update(b'say') m.update(b'hello')# 981fe96ed23ad8b9554cfeea38cd334a #和 m.update(b'sayhello')# 981fe96ed23ad8b9554cfeea38cd334a #print出來的值是一樣的
手机号/生日/性别/qq账号/以前的密码/ --》 挖矿(算法)
hash_pwd = '0562b36c3c5a3925dbe3c4d32a4f2ba2' pwd_list = [ 'hash3714', 'hash1313', 'hash94139413', 'hash123456', '123456hash', 'h123ash', ] for pwd in pwd_list: m = hashlib.md5() m.update(pwd.encode('utf8')) res = m.hexdigest() if res == hash_pwd: print(f'获取密码成功:{pwd}')
hmac模塊可以用於破解密碼
import hmac m = hmac.new(b'maerzi') m.update(b'hash123456') # f82317e44545b0ab087109454814b5c4 print(m.hexdigest()) m = hmac.new(b'sdfjhjk2394879ul%$$Y#($&') m.update(b'hash123456') # 2a70fd0f13cb49357f40d326a4e071a2 print(m.hexdigest()) pwd_list = [ 'hash3714', 'hash1313', 'hash94139413', 'hash123456', '123456hash', 'h123ash', ]
requests模塊
requests模塊就是爬蟲:從網頁爬取數據
url-->一個特定網站-->永不重複
一般與re模塊一起使用
import requests import re res=requests.get("http://www.baidu.com") print(res.text) # .*?代表所有类型都要 resb=re.findall('')
爬取段子網 import re import requests response = requests.get('https://ishuo.cn') data = response.text res = re.findall('<div class="content">(.*?)</div>|</span><a href="/subject/.*?">(.*?)</a>', data) with open('duanzi_new.txt', 'w', encoding='utf8') as fw: for i in res: # type:str print(i) if i[1]: fw.write(i[1] + ':' + '\n\n') if i[0]: if i[0].startswith('<ul>'): continue fw.write(i[0] + '\n')
typing模塊
typing模塊:與函數聯用,控制函數參數的數據類型,提供了基礎數據類型之外的數據類型
lt=[1,2,3,4] print(type(lt) is list) from typing import Iterable,Iterator,Generator #print(lt == Iterable)#False def func(x:int,lt:Iterable)->list: return[1,2,3] func(10,'123123')
re模塊
re模塊:去字符串找符合某種特點的字符串
import re # s = '去字符串找符合某种特点的字符串' # # res = re.findall('', s) # print(res) # 元字符 s = 'abcdabc' # abc # abc # bc bc # ^:以...开头 res = re.findall('^ab', s) print(res) res = re.findall('^bc', s) print(res) # $: 以..结尾 s = 'abcdabc' res = re.findall('bc$', s) print(res) # .: 任意字符 s = 'abc红abc' res = re.findall('abc.', s) print(res) # \d: 数字 s = 'skld2342ljk' res = re.findall('\d', s) print(res) # \w: 非空,数字字母下划线 s = 'skld_23 42ljk' res = re.findall('\w', s) print(res) # \s:空,空格/\t/\n s = 'skld_23 42ljk' res = re.findall('\s', s) print(res) # \D: 非数字 s = 'skld2342ljk' res = re.findall('\D', s) print(res) # \W: 空 s = 'skld_23 42ljk' res = re.findall('\W', s) print(res) # \S:非空 s = 'skld_23 42ljk' res = re.findall('\S', s) print(res) # +: 前面的一个字符至少1个 s = 'abcddddd abcd abc' print(re.findall('abcd+', s)) # ?:前面的一个字符0-1个 s = 'abcddddd abcd abc' print(re.findall('abcd?', s)) # *:前面的一个字符至少0个 s = 'abcdddddddddddddddddd abcd abc' print(re.findall('abcd*', s)) # []: 中括号内的都可以 s = 'abc bbc cbc dbc' print(re.findall('[abc]bc', s)) # [^]: 中括号的都不可以 s = 'abc bbc cbc dbc' print(re.findall('[^abc]bc', s)) # |:或 s = 'abc bbc dbc' print(re.findall('abc|bbc', s)) # {2}:前面的字符2个 s = 'abccabc abccc' print(re.findall('abc{2}', s)) # {1,2}:前面的字符2个 s = 'abccabc abccc' print(re.findall('abc{1,2}', s)) # 贪婪模式 # .(任意字符)*(0-无穷个) s = 'abcdefgbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbg' print(re.findall('a.*g', s)) # 非贪婪模式(*******) # .(任意字符)*(0-无穷个)?(让他进入非贪婪模式) s = 'abcdefgbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbg' print(re.findall('a.*?g', s)) # bug # .(任意字符)*(0-无穷个)?(让他进入非贪婪模式) s = 'abcdefg' print(re.findall('.*?', s)) # 了解:特殊构造 # a(?=\d) :a后面是数字,但是不要数字,不消耗字符串内容 s = 'a123 aaaa a234 abc' # a1 aa # aa # aa a2 ab print(re.findall('a(?=\d)', s)) print(re.findall('a(?=\w)', s)) # 匹配邮箱: s = '#@#@#@nickchen121@163.com$$$$////nick@qq.com$$#$#$[]]2287273393@162.com@$2423423lksdlfj#' # \w(字母/数字/下划线)+(0-无穷个)@ \w(字母/数字/下划线)+(0-无穷个).com print(re.findall('\w+@\w+.com', s)) # 函数 ## compile s = 'abcd abcddd abc' # res = re.compile('abcd*') email_pattern = re.compile('\w+@\w+.com') phone_patter = re.compile('\d{13}') print(re.findall(email_pattern, s)) print(re.findall('abcd*', s)) # ## match: 从开头找一个,找得到就不找了 ;找不到报错 --》 # s = 'ab abcddd abc' # res = re.match('abcd*', s) # print(res.group()) ## search: 从字符串找一个,就不找了 s = 'ab abcddd abc' res = re.search('abcd*', s) print(res.group()) ## split s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj' print(re.split('\d+', s)) ## sub == replace s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj' print(re.sub('\d+', ' ', s)) ## subn --> 替换了多少次 s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj' print(re.subn('\d+', ' ', s)) # 补充(非常有用) ## 修饰符 --> re.S会让.匹配换行符(*****) s = '''abc abcabc*abc ''' # .不匹配换行 print(re.findall('abc.abc', s)) # ['abc*abc'] print(re.findall('abc.abc', s, re.S)) # ['abc\nabc', 'abc*abc'] ## 分组 --> 只要括号里的(*****) s = 'abc abcd abcdd' print(re.findall('a(.)c(d)', s)) ## 有名分组(了解) s = 'abc abcd abcdd' print(re.search('a(?P<name>.)c(?P<name2>d)', s).groupdict()) # 超高级用法 s = 'abc123abc123' # c123a print(re.sub('c(\d+)a', ' ', s)) print(re.sub('c(?P<name1>\d+)a', ' \g<name1> ', s)) # \g<name1>这个东西不能替换掉 # 以下必须得记住 # .*? # 贪婪和非贪婪 # findall # re.S # match和sarch的区别 # 分组 # 有名分组:给分组加名字 # 哪些做了解 # 杂七杂八的元字符 # 特殊构造元字符 # 特殊修饰符