⼀. 模块的简单认识
什么是模块. 模块就是我们把装有特定功能的代码进行归类的结果. 从代码编写的单位来看我们的程序, 从小到大的顺序: 一条代码 < 语句块 < 代码块(函数, 类) < 模块. 我们目前写的所有的py文件都是模块.
引入模块的⽅方式:
1. import 模块
2. from xxx import 模块
二.collection模块
collections模块主要封装了了⼀一些关于集合类的相关操作,还提供了⼀些除了基本数据类型以外的数据集合类型. Counter, deque, OrderDict, defaultdict以及namedtuple.
1.Counter
Counter是一个计数器,主要用来计数.
#计算一个字符中每个字符出现的次数:#方法一
s = "ccj like pig"dic={}for c ins:
dic[c]=dic.setdefault(c,0)+1
print(dic)#{'c': 2, 'j': 1, ' ': 2, 'l': 1, 'i': 2, 'k': 1, 'e': 1, 'p': 1, 'g': 1}
#方法二(Counter):
from collections importCounterprint(Counter(s))#Counter({'c': 2, ' ': 2, 'i': 2, 'j': 1, 'l': 1, 'k': 1, 'e': 1, 'p': 1, 'g': 1})
2.deque双向队列.
先了解两种数据结构:
1.栈 : FILO. 取数据时 会''先进后出''.(砌墙后取砖头)
2.队列 : FILO.取数据时 会''先进先出''. (类似排队)
#队列: python提供了queue模块. 使用起来非常方便
importqueue
q=queue.Queue()
q.put("李")
q.put("张")
q.put("孙")print(q.get())print(q.get())print(q.get())print(q.get()) #这里无数据可取#注意. 如果队列里没有元素了. 再也拿不出来元素了,此时程序会阻塞.
deque, 注意, 此队列是collections中的.
from collections importdeque
q=deque()
q.append("张开") #右侧添加
q.append("贝尔")
q.appendleft("赵廷") #左侧添加
q.appendleft("高圆")print(q) #deque(['高圆', '赵廷', '张开', '贝尔'])
print(q.pop()) #贝尔 #右侧删除
print(q.popleft()) #高圆 #左侧删除
3. namedtuple 命名元组
命名元组, 顾名思义. 给元组内的元素进⾏命名. 比如. 我们说(x, y) 这是⼀个元组. 同时. 我们还可以认为这是⼀个点坐标. 这时, 我们就可以使用namedtuple对元素进⾏命名.
from collections importnamedtuple#自己定义了一个元组, 这其实就是创建了一个类
nt = namedtuple("point", ["x", "y"])
p= nt(1, 2)print(p) #point(x=1, y=2)print(p.x)# 1print(p.y) # 2
4.defaultdict
defaultdict: 可以给字典设置默认值. 当key不存在时. 直接获取默认值:
from collections importdefaultdict
dd= defaultdict(list) #默认值list
print(dd['哈哈']) #[ ] 当key不存在的时候. 会自动执行构造方法中传递的内容.
lst =[11,22,33,44,55,66,77,88]
d=defaultdict(list) #创建一个字典,默认字典里是列表
for el inlst:if el <66:
d['K1'].append(el) #字典里Key不存在,则取默认值空列表[], dic['key]会创建key.
else:
d['K2'].append(el)print(d)#defaultdict(, {'K1': [11, 22, 33, 44, 55], 'K2': [66, 77, 88]})
三. time 时间模块
importtimeprint(time.time()) #打印出当前系统时间(时间戳) 结果为一串数字如:1538927647.483177
在python中时间分成三种表现形式:
1. 时间戳(timestamp). 时间戳使用的是从1970年01月01⽇00点00分00秒到现在⼀共经过了多少秒... 使⽤float来表示.
2. 格式化时间(strftime). 这个时间可以根据我们的需要对时间进⾏任意的格式化.
3. 结构化时间(struct_time). 这个时间主要可以把时间进⾏行行分类划分. 比如. 1970年年01⽉月01⽇日 00点00分00秒 这个时间可以被细分为年, 月, 日.....⼀大堆东西.时间戳我们已经见过了就是time.time(). ⼀般, 我们不会把这样的时间显示给客户,那就需要对时间进行格式化操作.
importtime
shijian= time.strftime("%Y-%m-%d %H:%M:%S")print(shijian) #2018-11-14 19:27:12
日期格式化的标准:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的⼀天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的⼀天(001-366)
%p 本地A.M.或P.M.的等价符
%U ⼀年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W ⼀年中的星期数(00-53)星期⼀一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
时间格式的转换:
时间戳 转 格式化时间, 需要先转成结构化时间再转格式化时间.
格式化时间 转 时间戳时间,需要先转成结构化时间再转时间戳时间.
也就是说都得通过结构化时间来转化.
#当前结构化时间
importtimeprint(time.localtime())#结果:time.struct_time(tm_year=2018, tm_mon=11, tm_mday=14, tm_hour=19, tm_min=38, tm_sec=36, tm_wday=2, tm_yday=318, tm_isdst=0)
比如. 我们的数据库中存储了这样⼀个时间: 1888888888. 如何显示成xxxx年xx月xx⽇?
importtime#时间戳:1888888888
shijianchuo=1888888888 #时间戳为1888888888
t_jiegou=time.localtime(shijianchuo) #先为转结构化时间
print(t_jiegou) #time.struct_time(tm_year=2029, tm_mon=11, tm_mday=9, tm_hour=11, tm_min=21, tm_sec=28, tm_wday=4, tm_yday=313, tm_isdst=0)
t_geshi=time.strftime('%Y-%m%-%d %H:%M:%S',t_jiegou) #再转格式化时间 (XXXX年-XX月-XX日 XX时:XX分:XX秒)
print(t_geshi) #打印出格式化后的时间2029-11-09 11:21:28
格式化时间再转回时间戳:
#格式化时间转时间戳
s2='2029-11-09 11:21:28' #格式化时间其实就是字符串格式
t_jiegou=time.strptime(s2,'%Y-%m-%d %H:%M:%S') #把格式化时间转成结构化时间
t_shijian=time.mktime(t_jiegou) #得到结构化时间,再转成时间戳
print(t_shijian) #1888888888.0 一般带小数.0
四. random模块
所有关于随机相关的内容都在random模块中.
importrandomprint(random.randint(1,3)) #1,2,3随机抽选一个
print(random.random()) #随机 (0,1)中的小数
print(random.uniform(3,10)) #(3,10)随机小数
print(random.choice(['1','2','3','4'])) #随机选择其中一个
print(random.sample(['1','2','[34]','SB'],2)) #随机两个 ['2', '[34]']
lst=['1','2','[34]','SS']
random.shuffle(lst)#打乱顺序 ['[34]', '2', 'SS', '1']
print(lst)
五. os模块
所有和操作系统相关的内容都在os模块.
os.makedirs('dirname1/dirname2') 可⽣生成多层递归⽬目录
os.removedirs('dirname1') 若⽬录为空,则删除,并递归到上⼀级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') ⽣生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若⽬录不为空则⽆法删除,报错;相当于shell中
rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表⽅式打印
os.remove() 删除⼀个⽂文件
os.rename("oldname","newname") 重命名⽂文件/目录
os.stat('path/filename') 获取文件/目录信息
os.system("bash command") 运行shell命令,直接显示
os.popen("bash command).read() 运行shell命令,获取执行结果
os.getcwd() 获取当前⼯作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd#os.path
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和⽂件名⼆元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第⼀个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第⼆个元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路路径,返回True
os.path.isfile(path) 如果path是⼀个存在的⽂件,返回True。否则返回False
os.path.isdir(path) 如果path是⼀个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第⼀个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小#特殊属性:
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"os.linesep 输出当前平台使用的行终止符, win下为"\r\n",Linux下为"\n"os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。 win->'nt'; Linux->'posix'
六. sys模块
所有和python解释器相关的都在sys模块.
sys.argv 命令⾏行行参数List,第⼀个元素是程序本身路路径
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路路径,初始化时使⽤用PYTHONPATH环境变量量的值
sys.platform 返回操作系统平台名称