这两天学习了一些基本的Python模块,现在做一些整理,理清楚
查看大佬的理解:
开始时间:15:32:06 先标一下开始时间,看看用多久写完这一篇整理= =
分别是以下几个模块:
- import 模块调用
- time 时间模块
- os 系统管理模块
- ranadom 随机数模块
- re 正则表达式模块
- sys 环境配置模块
- json pickle 模块
- hashlib 哈希模块
import 模块调用
import是一个用的最多的一种方法,它应该不算是一个模块,但是在理解模块前必须得理解import这个方法
1 import time #导入时间模块
2 import time from time #从时间模块导入time()函数
3 import time from time as TIME #同上,并赋予新名称为TIME
4 '''
5 import 的实质就是执行导入的代码
6 包的本质是一个目录(内部必须含有__init__.py)用来从逻辑上组织模块
7 导入包,即执行该包下的__init__.py文件
8 注意import只会在当前环境变量中搜索导入的包,所以当跨文件导入包时,要先添加环境变量,如下添加环境变量:
9 '''
10 import os
11 #help(os)
12 import sys
13 print(sys.path)#查看当前环境路径
14 print(__file__)#查看当前文件相对路径
15 #所谓相对路径,例如:/pytext/zhihu/day5_1.py 这就是相对路径
16 #将相对路径修改为绝对路径
17 print()#现在输出的就是绝对路径
18 #通过下面的方法返回上一级文件,例如,返回一层
19 print()
20 #依次类推,就能找到所需要添加的环境变量
21 #找到后如下添加到环境路径中
22 sys.path.append(os.path.dirname(os.path.abspath(__file__)))
23 #一般要用到的话至少返回两层以上,此处简写了
View Code
1 import time #导入时间模块
2 import time from time #从时间模块导入time()函数
3 import time from time as TIME #同上,并赋予新名称为TIME
4 '''
5 import 的实质就是执行导入的代码
6 包的本质是一个目录(内部必须含有__init__.py)用来从逻辑上组织模块
7 导入包,即执行该包下的__init__.py文件
8 注意import只会在当前环境变量中搜索导入的包,所以当跨文件导入包时,要先添加环境变量,如下添加环境变量:
9 '''
10 import os
11 #help(os)
12 import sys
13 print(sys.path)#查看当前环境路径
14 print(__file__)#查看当前文件相对路径
15 #所谓相对路径,例如:/pytext/zhihu/day5_1.py 这就是相对路径
16 #将相对路径修改为绝对路径
17 print()#现在输出的就是绝对路径
18 #通过下面的方法返回上一级文件,例如,返回一层
19 print()
20 #依次类推,就能找到所需要添加的环境变量
21 #找到后如下添加到环境路径中
22 sys.path.append(os.path.dirname(os.path.abspath(__file__)))
23 #一般要用到的话至少返回两层以上,此处简写了
View Code
导入优化,假如一个模块包含很多函数,但是你仅仅需要其中一个,此时就可以使用from来优化函数的调用,
减少内存的消耗,不对,就是尽量使用from,以最大化优化,避免冗余的代码工作
time 时间模块
在时间模块中,时间被定义成三种形式
- 时间戳: 时间戳是指从1970年1月1日零点开始距离现在的时间多少,它以秒为格式
- 时间元组: struct_time 是以九种时间格式组成的元组
- 时间字符串形式: 就是平常见到的年月日,时分秒
1 '''
2 该模块中所有函数如下
3 time() -- return current time in seconds since the Epoch as a float
4 返回当前的时间戳
5 clock() -- return CPU time since process start as a float
6 返回处理器时间,3.3开始已废弃 , 改成了time.process_time()测量处理器运算时间,不包括sleep时间,不稳定,mac上测不出来
7 sleep() -- delay for a number of seconds given as a float
8 作用使程序暂停一段时间
9 gmtime() -- convert seconds since Epoch to UTC tuple
10 返回标准时间,即格林尼治时间
11 localtime() -- convert seconds since Epoch to local time tuple
12 返回本机时间,已时间元组的形式返回
13 asctime() -- convert time tuple to string
14 将时间元组转化为字符串形式
15 ctime() -- convert time in seconds to string
16 将时间戳转换成字符串形式
17 mktime() -- convert local time tuple to seconds since Epoch
18 将时间戳转换成时间元组形式
19 strftime() -- convert time tuple to string according to format specification
20 按照给定的格式将时间元组转换成字符串形式
21 strptime() -- parse string to time tuple according to format specification
22 与上一个相反
23 tzset() -- change the local timezone
24 改变当前时区= =旅行必备,可以通过这个开发一个自动调整为当地时间的工具
25 '''
View Code
这个部分在帮助文档里说的很细,有什么不清楚请用help(time)
再说一下时间元组的九个元素
- tm_hour 一天24个小时
- tm_isdst 是否是夏令时,1为是,0为否,-1为不知道
- tm_mday 这个月中的第几天
- tm_min 这个小时中的第多少分钟
- tm_mon 一年中的第几个月
- tm_sec 这分钟中的第几秒
- tm_wday 这一周中的第几天
- tm_yday 这一年中的第几天
- tm_year 今夕是何年呐
时间元组的格式如下:
time.struct_time(tm_year=2017, tm_mon=4, tm_mday=10, tm_hour=16, tm_min=53, tm_sec=55, tm_wday=0, tm_yday=100, tm_isdst=0)
另外还有一个datetime模块,是基于time模块的一个加强版
os 系统管理模块
提供对操作系统进行调用的方法
1 #文件操作中,这个版块很重要
2 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
3 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
4 os.curdir 返回当前目录: ('.')
5 os.pardir 获取当前目录的父目录字符串名:('..')
6 os.makedirs('dirname1/dirname2') 可生成多层递归目录
7 #是指可以连续在建立的新文件中建立新文件,本质是对mkdir的重复调用
8 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
9 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
10 os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname,用于清理电脑?
11 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
12 os.remove() 删除一个文件
13 os.rename("oldname","newname") 重命名文件/目录
14 os.stat('path/filename') 获取文件/目录信息
15 os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
16 os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
17 os.pathsep 输出用于分割文件路径的字符串
18 os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
19 os.system("bash command") 运行shell命令,直接显示
20 os.environ 获取系统环境变量
21 os.path.abspath(path) 返回path规范化的绝对路径
22 os.path.split(path) 将path分割成目录和文件名二元组返回
23 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
24 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
25 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
26 os.path.isabs(path) 如果path是绝对路径,返回True
27 os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
28 os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
29 os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
30 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
31 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
View Code
之前还在想这个操作里面怎么没有建立新文件,现在想想直接用'w'模式写入不就创建了一个新文件嘛
这个模块用到的地方还是挺多的,文件的建立,删除,路径查询,在垃圾文件的处理方面应该也用的上
random 随机数模块
这个模块有意思了,程序中很多地方都要用到这种伪随机数,游戏里可以用到
1 import time
2 import random
3 puke = []
4 huase = ['红心','梅花','黑桃','方块']
5 for one in range(0,4):
6 aa = []
7 for i in range(1,14):
8 i = huase[one] + str(i)
9 puke.append(i)
10 puke.append('大王')
11 puke.append('小王')
12 print(puke)
13 print(len(puke))
14 for num in range(10):
15 print(random.sample(puke,17))
16 while True:
17 beilv = 1
18 person = random.shuffle(puke)
19 person1 = puke[0:17]
20 print(len(person1),person1)
21 person2 = puke[17:34]
22 print(len(person2),person2)
23 person3 = puke[34:51]
24 print(len(person3),person3)
25 choose = puke[51:55]
26 #现在把扑克牌分发显示给各位玩家
27 #玩家反馈是否叫地主,由随机庄家开始叫地主,如果抢地主则倍率*2
28 #将底牌加入地主的牌库
29 #现在设立一个监视器,判断出牌是否符合规则,并且监视每一位的手牌数
30 #一局结束后,询问是否go on?
31 break
View Code
斗地主的一个大概思路,什么时候有时间来完成
random.shuffle() 将输入列表随机排序
sys 环境配置模块
sys模块用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互,例如与Python解释器交互
1 import sys
2 #sys模块中包含了各种所需的配置
3 sys.argv[0] #显示代码所在文件的路径
4 #如结果:['D:/python/workrom/day10/进程process.py']
5 sys.path #返回当前环境配置(文件搜索路径,模块搜索路径)
6 sys.maxsize #所接受的最大int值,以避免数据溢出
7 sys.platform # 返回操作系统平台名称 win32 Linux
View Code
sys.stdin.readline() 监听键盘输入,直至回车,类似input
sys.stadout.write('打印值:') 可以用来做进度条 同 print(end=''), 即不换行,在同一行进行多次输出
re 正则模块
re正则模块用于匹配字符串形式文件中的目标字符串,可以进行替换
下面举一个例子来看一看正则的用法
1 import re
2
3 def fuhao_chuli(string):
4 if '--' in string:
5 string = string.replace('--','+')
6 if '+-' in string:
7 string = string.replace('+-','-')
8 if '-+' in string:
9 string = string.replace('-+','-')
10 return string
11
12 def jisuan(string):
13 '''
14 :param string:格式化后的计算式 ,形式如:A+B,仅含三项,数字+运算符+数字
15 :return: 计算结果
16 '''
17 # 先把运算符取出来
18 pattern = re.compile(r'\d([*+/-])-?\d', re.S)
19 fuhao = re.findall(pattern, string)[0]
20 pattern1 = re.compile(r'(.*\d)[*+/-](-?\d.*)')
21 num = re.findall(pattern1,string)
22 num1 = float(num[0][0])
23 num2 = float(num[0][1])
24 if fuhao == '+':
25 jieguo = num1 + num2
26 elif fuhao == '-':
27 jieguo = num1 - num2
28 elif fuhao == '*':
29 jieguo = num1 * num2
30 elif fuhao == '/':
31 if num2 == 0:
32 print('分母不可为0')
33 jieguo = 'wrong'
34 return jieguo
35 jieguo = num1 / num2
36 jieguo = round(jieguo,7)
37 return jieguo
38 #一直在正则匹配出问题,需要再熟悉
39 def kuohao_jisuan(string):#本来以为已经解决问题,但是在浮点数处遇到问题,不能以string,太麻烦
40 '''
41 该函数将最底层含括号进行运算,思路,先乘除,后加减
42 :param string: 内部无括号的计算式,字符形式
43 :return: 计算结果
44 '''
45 if '*' in string or '/' in string:
46 #pattern = re.compile(r'\d+[*/][*/0-9]+',re.S)#'1+2*3*4'
47 # pattern = re.compile(r'\d[*/0-9.]+\d')#换一种匹配规则:加减中间含乘除的匹配项
48 # chen_chu = re.findall(pattern,string)#'2*3*4'
49 # #print(chen_chu)
50 # for ch_ch_one in chen_chu:
51 #print(string)
52 pattern_ch_ch = re.compile(r'[0-9.]+[*/]-?[0-9.]+',re.S)#取出乘除的第一项
53 zu_chen_chu = re.findall(pattern_ch_ch,string)#'2*3'
54 answer = str(jisuan(zu_chen_chu[0]))
55 string = string.replace(zu_chen_chu[0],answer)
56 return kuohao_jisuan(string)
57 else:
58 try:
59 string = fuhao_chuli(string)
60 float(string)
61 return string
62 except:
63 string = fuhao_chuli(string)
64 pattern_j_j = re.compile(r'-?[0-9.]+[+-][0-9.]+',re.S)
65 zu_jia_jian = re.findall(pattern_j_j,string)
66 answer = str(jisuan(zu_jia_jian[0]))
67 string = string.replace(zu_jia_jian[0], answer)
68 return kuohao_jisuan(string)
69 #print(kuohao_jisuan('-6-2*3/4-4*2'))
70 #主函数,现将最底层括号匹配,然后计算后返回替代
71 def all_jisuan(string):
72 string = string.replace(' ','')
73 if '(' not in string and ')' not in string:
74 string = kuohao_jisuan(string)
75 return string
76 else:
77 pattern = re.compile(r'\([^()]+\)', re.S)#括号开始括号结束,中间没有括号
78 base_kh_list = re.findall(pattern,string)
79 for base_kh in base_kh_list:
80 base_kh1 = base_kh[1:-1]#base_kh为去除括号的算式
81 kuohao_out = kuohao_jisuan(base_kh1)
82 string = string.replace(base_kh,kuohao_out)
83 string = fuhao_chuli(string)
84 return all_jisuan(string)
85 return string
86 #替换之后可能出现*- +- -- /-这样的情况,所以这时候就需要处理
87 def start():
88 while True:
89 shuru = str(input('q is out\ninput:\n'))
90 if shuru == 'q':
91 break
92 answer = all_jisuan(shuru)
93 if '+' in answer:
94 answer = answer[1:]
95 print(answer)
96
97 if __name__ == '__main__':
98 start()
View Code
上面这个计算器是属于匹配边修改才做出来的,一步步试,其中用到了大量的[]操作
更详细具体看一看
pickle/json 模块
load/loads 读取pickle/json格式,load从文件读取,loads从读取的为内存中的对象
dump/dumps 编码为pickle/json格式,dump为编码写入到文件,dumps为编码到内存中的对象
hashlib 哈希模块
哈希模块用于对对象的加密及确认对象是否被修改
1 import hashlib
2
3 a = "a test string".encode() 需要哈希加密的文件需先encode为字节形式
4 a.update('add'.encode()) 假如新的需要加密的部分
5 print(hashlib.md5(a).hexdigest())
6 print(hashlib.sha1(a).hexdigest())
7 print(hashlib.sha224(a).hexdigest())
8 print(hashlib.sha256(a).hexdigest())
9 print(hashlib.sha384(a).hexdigest())
10 print(hashlib.sha512(a).hexdigest())
View Code
http://www.atool.org/hash.php有对各种编码的解释
python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密
散列消息鉴别码,简称HMAC,是一种基于消息鉴别码MAC(Message Authentication Code)的鉴别机制。使用HMAC时,消息通讯的双方,通过验证消息中加入的鉴别密钥K来鉴别消息的真伪;
一般用于网络通信中消息加密,前提是双方先要约定好key,就像接头暗号一样,然后消息发送把用key把消息加密,接收方用key + 消息明文再加密,拿加密后的值 跟 发送者的相对比是否相等,这样就能验证消息的真实性,及发送者的合法性了。
import hmac
h = hmac.new(b'天王盖地虎', b'宝塔镇河妖')
print h.hexdigest()
View Code
阮一峰对加密这一部分可以去他的博客参照一下
外文参照MD5,sha1,sha256等:https://www.tbs-certificates.co.uk/FAQ/en/sha256.html
MD5,SHA-1,SHA-2,SHA-256,SHA-512,SHA-3,RIPEMD-160 - aTool