这两天学习了一些基本的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 时间模块

在时间模块中,时间被定义成三种形式

  1. 时间戳:  时间戳是指从1970年1月1日零点开始距离现在的时间多少,它以秒为格式
  2. 时间元组: struct_time 是以九种时间格式组成的元组
  3. 时间字符串形式: 就是平常见到的年月日,时分秒



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)

再说一下时间元组的九个元素

  1. tm_hour    一天24个小时
  2. tm_isdst    是否是夏令时,1为是,0为否,-1为不知道
  3. tm_mday    这个月中的第几天
  4. tm_min    这个小时中的第多少分钟
  5. tm_mon    一年中的第几个月
  6. tm_sec    这分钟中的第几秒
  7. tm_wday    这一周中的第几天
  8. tm_yday    这一年中的第几天
  9. 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