模块

一 模块的简单认识

1.什么是模块?

  模块就是我们把装有特定功能的代码进行归类,从代码编写的单位来看我们的程序:

      一条代码 < 语句块 < 代码块(函数,类) < 模块 ,我们写的所有的 py 文件都是模块

  引入模块的方法:

    1.import 模块

    2. from 模块  import 功能

二 collections 模块

  collections 模块  主要封装 了 一些 关于集合的相关 操作, 比如, iterable,iterator 等等, 除了这些以外,

collections 还提供了一些糊了 基本数据类型以外的数据集合类型,Counter , deque , OrderDict,defaultdict

以及 namedtuple

  1.Counter

    counter是一个计数器,主要用来计数

    计算一个字符串中 每个字符出现大的次数

# low:

# s = "hahage like pig,hahaha"
# dic = {}
# for i in s:
#     dic[i] = dic.get(i,0) + 1
# print(dic)
# # 结果 {'h': 5, 'a': 5, 'g': 2, 'e': 2, ' ': 2, 'l': 1, 'i': 2, 'k': 1, 'p': 1, ',': 1}

# # nb:
# 
# from collections import Counter
# s = "hahage like pig,hahaha"
# 
# print(Counter(s))
# 
#
# 结果 Counter({'h': 5, 'a': 5, 'g': 2, 'e': 2, ' ': 2, 'i': 2, 'l': 1, 'k': 1, 'p': 1, ',': 1})

# 获取的结果 可以像字典一样 进行使用 [key]

 

  2.deque 双向队列

      (重点)  说双向队列之前,我们需要了解下 1.栈 2. 队列

        1. 栈  FILO  先进后出,---> 好比 砌墙的砖头,老师傅做馒头

        2. 双向队列  FIFO 先进先出--> 好比,买火车票排队,所有排队的场景

  由于 python 没有给出 Stack 模块,所以我们自己动手写一个 粗略版本(注意此版本有严重的 并发问题)

class StopFullException(Exception):
    pass

class StopEmptyException(Exception):
    pass


class Stack:
    def __init__(self,size):
        self.size = size       # 定 容量
        self.lst = []          # 存放 元素的 列表
        self.top = 0           # 栈顶指针  初识为0 ,栈顶指针永远 指向 你要操作的 下一个位置
 
    # 出栈
    def pop(self):         # 取 元素
        if self.top == 0:
            raise StopEmptyException("your size is empty!!!")  # 报错用的
        self.top -= 1
        el = self.lst[self.top]
        return el

    # 入栈
    def push(self,el):               # 放元素
        if self.top >= self.size:     # 栈顶指针 超出了  size 容量 范围,就会报错
            raise StopFullException("your size is full!!!")
        self.lst.insert(self.top,el)   # 放元素  的时候 注意 ,必须使用 insert  插入
        self.top += 1              是在 self.top 的位置插入,而不是  添加

s = Stack(5)
s.push("哈哈哥")                      # 放入 "哈哈哥" 的 元素
print(s.pop())
print(s.pop())  # 此时 就会 报错,因为 你的 size 是空的,继续取值就会报错

 

  列队:python 提供了 queue 模块 ,使用起来 非常 方便

from collections import deque

q = deque()
q.append("哈哈哥")    # 右侧添加
q.append("嘻嘻姐")
q.appendleft("张曼玉")  # 左侧添加
q.appendleft("朱茵")
print(type(q),q)
# 结果 <class 'collections.deque'> deque(['朱茵', '张曼玉', '哈哈哥', '嘻嘻姐'])

print(q.pop())     # 右侧删除   嘻嘻姐
print(q.popleft())  # 左侧删除   朱茵

 

  3.namedtuple 命名 元祖

      命名元祖,顾名思义,给元祖内的 元素 进行命名,比如,我们说(x,y) 这是一个元祖,同时,我们还可以认为

          这是一个 坐标,这时,我们就可以 使用 namedtuple 对元素 进行 命名

 

from collections import namedtuple

# 自己定义一个元祖,如果想的到的话,这其实就是创建了一个类

nt = namedtuple("point",["x","y"])
p = nt(1,2)
print(p)    #  结果  point(x=1, y=2)
print(p.x)  # 1
print(p.y)  # 2

print(type(p))   # <class '__main__.point'>

 

  4.OrderDict  和  defaultdict

    OrderDict  有序字典,其实在 python 3.6 版本,字典 默认有序的 ,就是你存储的时候的 顺序

dic = {"a":"葫芦娃","b":"黑猫警长","c":"舒克贝塔"}
# print(dic)

from collections import OrderedDict

od = OrderedDict({"a":"葫芦娃","b":"黑猫警长","c":"舒克贝塔"})
print(od)  
# OrderedDict([('a', '葫芦娃'), ('b', '黑猫警长'), ('c', '舒克贝塔')])

 

   defaultdict  可以给 字典设置 默认值,当 key  不存在时,  直接获取默认值

 

from collections import defaultdict

dd = defaultdict(list)   # 默认值  list
print(dd["哈哈哥"])     # 当 key 不存在 的时候,会自动 执行构造方法中传递的内容

print(dd)               #   defaultdict(<class 'list'>, {'哈哈哥': []})

 

 

 三  time 时间模块 

    时间模块是我们经常用到的,比如,如何 计算时间差,如何按照 要求展示 时间等 

 

import time

print(time.time())
# 1548066502.7162604    系统时间

print(time.gmtime())
# time.struct_time(tm_year=2019, tm_mon=1, tm_mday=21,
# tm_hour=10, tm_min=28, tm_sec=22, tm_wday=0, tm_yday=21, tm_isdst=
# 格林尼治 结构化时间   2019-1-21  10:28:28

# 格林尼治时间  从 1970 年 1月 1 日 00点 00分 00秒 开始计时的
#  和我们所在 时区 相差 8 小时

print(time.localtime())
# time.struct_time(tm_year=2019, tm_mon=1, tm_mday=21,
# tm_hour=18, tm_min=28, tm_sec=22, tm_wday=0, tm_yday=21, tm_isdst=0)
# 当地  结构化时间  2019-1-21  18:28:28

 

      在 python中  时间 分为 3种 表现形式:

    1.时间戳(timestamp)   时间戳 使用的 是 1970年01月01日 00点00分00秒 到现在一共经过了多少秒

              使用 float 表示

    2.格式化时间(strftime) 这个时间可以根据我们的 需要 对时间进行任意的 格式化

    3.结构化时间(struct_time) 这个时间 主要 可以把 时间进行类 划分,比如 1970年01月01日  00点00分

                00秒,这个时间可以被 细分为 年 月 日 ...一大堆东西

  日期格式化的 标准:

%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 当前时区的名称
%% %号本身

 

                

   时间的转化 : 比如给出 一个时间  123456789 ,如何转化成 我们 平时看到的 xx年xx 月 xx 日的时间呢

 

import time
t
= time.localtime(1548066502.7162604) s = time.strftime("%Y-%m-%d %H:%M:%S",t) print(s) # 2019-01-21 18:28:22

 

 

import time

# 现在给出了 时间怎么转化为 时间戳呢

s = "2019-01-21 18:28:22"
t = time.strptime(s,"%Y-%m-%d %H:%M:%S")
time = time.mktime(t)
print(time)   # 1548066502.0

 

   计算时间差

import time

true_time = time.mktime(time.strptime("2017-09-11 08:30:00","%Y-%m-%d %H:%M:%S"))
time_now = time.mktime(time.strptime("2017-09-11 11:30:00","%Y-%m-%d %H:%M:%S"))

dif_time = time_now - true_time

struct_time = time.localtime(dif_time)
print(struct_time)
# time.struct_time(tm_year=1970, tm_mon=1, tm_mday=2, tm_hour=10,
# tm_min=30, tm_sec=0, tm_wday=4, tm_yday=2, tm_isdst=0)

print("过去了%d年%d月%d天%d⼩小时%d分钟%d秒" %\
      (struct_time.tm_year - 1970,struct_time.tm_mon-1,struct_time.tm_mday-1,struct_time.tm_hour-8,
struct_time.tm_min,struct_time.tm_sec))

# 过去了0年0月0天3⼩小时0分钟0秒

 

四 random 模块

  所有的随机相关的内容都在 random 模块中

 

import random

# print(random.random())        # 0 - 1 之间的小数  [0,1)
# print(random.uniform(3,4))   # 指定 区间的 小数   [3,4)
#
# print(random.randint(1,10))        # 指定区间的 随机整数 [1,10]
# print(random.randrange(1,10,2))    # 1 - 10 之间的奇数    [1,10)
# print(random.randrange(2,10,2))    # 1 - 10 之间的偶数    [1,10)
#
# print(random.choice([1,"哈哈哥",["朱茵","张曼玉"]])   # 1 或者 "哈哈哥" 或者 ["朱茵","张曼玉"]
# print(random.sample([1,"123",[4,5]],2))   # [[4, 5], 1] 列表任意 两个 组合

# # shuffle 洗牌,随机打破lst 顺序
# lst = [1,2,3,4,5,6,7,8,9]
# random.shuffle(lst)
# print(lst)

 

 

#  35 选 7

count = 0
tt = set()
while count < 7:
    s = random.randint(1,35)
    tt.add(s)
    count += 1
print(tt)

 

五 os 模块

  所有的操作系统相关的内容都在 os 模块

import os

# os.makedirs("a/b/c")   # 可生成多层迭代目录
# os.removedirs("a/b/c")   # 若 目录为空 则删除 ,并递归到上一目录,若为空,继续删除,依次 类推

# os.mkdir("张曼玉")     # 创建一个单级目录  相当于 shell 中 mkdir dirname
# os.rmdir("张曼玉")      # 删除单级目录,若为空则删除,不为空则 报错:相当于shell 中的 rmdir dirname

# print(os.listdir("D:\learn-py\idea\青春练习册"))
# # 列出 指定目录下的 所有 文件和子目录,包括 隐藏文件,并以列表方式 打印

# os.remove()  # 删除一个文件,文件操作 的 时候用到过
# os.rename("副本","原文件名称") # 改名字
# print(os.stat("D:\learn-py\idea\青春练习册"))  # 获取文件/ 目录信息

# os.system("D:\learn-py\idea\青春练习册")   # 运行 shell 命令,直接显示
# os.popen("D:\learn-py\idea\青春练习册").read() #运行 shell 命令,获取执行结果
# print(os.getcwd())  # 获取当前工作目录,即当前 python 脚本工作 的目录 路径
# os.chdir("dirname")   # 改变当前脚本工作 目录,相当于 shell 下 cd


# #####  os.path
# print(os.path.abspath("02天  运算符 和 编码.py"))
# #  结果 D:\learn-py\idea\青春练习册\02天  运算符 和 编码.py
# # 返回 path 规范化的 绝对 路径

# print(os.path.split("D:\learn-py\idea\青春练习册\02天  运算符 和 编码.py"))
# # ('D:\\learn-py\\idea', '青春练习册\x02天  运算符 和 编码.py')
# # 将  path 分割成 目录 和   文件名     以元组 返回

# print(os.path.dirname("D:\\learn-py\\idea', '青春练习册\x02天  运算符 和 编码.py"))
# #  结果   ('D:\learn-py
# # 返回 path 的 目录,其实就是  os.path.split(path)  的 第一个 元素

# print(os.path.basename("D:\\learn-py\\idea', '青春练习册\x02天  运算符 和 编码.py"))
# # 结果  idea', '青春练习册天  运算符 和 编码.py
# # 返回  path 最后的文件名,如果 path 以/或\结尾,那么就会返回 空值
# # 即 os.path.split(path) 的  第二个  元素
# print(os.path.exists("D:\\learn-py\\idea', '青春练习册\x02天  运算符 和 编码.py"))
# # False
# # 如果 path 存在,返回 True,如果 path 不存在,返回 False

# print(os.path.isabs("D:\\learn-py\\idea', '青春练习册\x02天 运算符 和 编码.py"))
# # True
# # 如果 path 是 绝对 路径 ,返回 True

# print(os.path.isfile("D:\\learn-py\\idea', '青春练习册\x02天 运算符 和 编码.py"))
# # False
# # 如果 path 文件 存在 返回 True 否则 返回 False

# print(os.path.isdir("D:\\learn-py\\idea', '青春练习册\x02天 运算符 和 编码.py"))
# # False
# # 如果 path 是一个存在的 目录,返回True ,否则 返回 False

# print(os.path.join("D:\\learn-py\\idea", "青春练习册\x02天 运算符 和 编码.py"))
# # 结果 D:\learn-py\idea\青春练习册天 运算符 和 编码.py
# # 将多个 路径 组合后返回,第一个 绝对路径之前的 参数 将 被 忽略

# print(os.path.getatime("D:\learn-py\idea\青春练习册"))
# # 结果 1548081536.3541353
# # 返回 path 所指向的 文件 或者 目录 的 最后 访问时间

# print(os.path.getmtime("D:\learn-py\idea\青春练习册"))
# # 结果 1548082056.9019089
# # 返回 path 所指向的文件 或者 目录 的 最后 修改时间

# print(os.path.getsize("D:\learn-py\idea\青春练习册"))
# # 12288
# # 返回 path 的大小

# # 特殊 属性

# os.sep("D:\learn-py\idea\青春练习册") # 输出操作系统特定的路路径分隔符,win下为"\\",Linux下为"/"
# os.linesep("D:\learn-py\idea\青春练习册") # 输出当前平台使⽤用的⾏行行终⽌止符,win下为"\r\n",Linux下为"\n"
# os.pathsep("D:\learn-py\idea\青春练习册") # 输出⽤用于分割⽂文件路路径的字符串串 win下为;,Linux下为:
# os.name("D:\learn-py\idea\青春练习册") # 输出字符串串指示当前使⽤用平台。win->'nt'; Linux->'posix'


 

   os.stat() 属性解读

stat 结构:
st_mode: inode 保护模式
st_ino: inode 节点号。
st_dev: inode 驻留留的设备。
st_nlink: inode 的链接数。
st_uid: 所有者的⽤用户ID。
st_gid: 所有者的组ID。
st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
st_atime: 上次访问的时间。
st_mtime: 最后⼀一次修改的时间。
st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更更改的时间,在
其它系统上(如Windows)是创建时间(详细信息参见平台的文档)

 

 

 六 sys  模块

  所有 和 python 解释器  相关 的 都在 sys 模块

sys.argv 命令⾏行行参数List,第⼀一个元素是程序本身路路径
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路路径,初始化时使用PYTHONPATH环境变量量的值

sys.platform 返回操作系统平台名称

 

posted @ 2019-01-21 23:00  会飞的草帽  阅读(203)  评论(0编辑  收藏  举报