常用模块-01

Posted af1y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用模块-01相关的知识,希望对你有一定的参考价值。

本节主要内容:

1.模块的简单认识

2.collections模块

3.time时间模块

4.random模块

5.os模块

6.sys模块

 

 一.模块的简单认识

模块:就是我们把装有特定功能的代码进行归类的结果.

引入模块的方式

1.import 模块

2.from xxx import 模块

 

二.collections模块

collections模块主要封装了一些关于集合类的相关操作.例如:Iterable,Iterator等等.

1.Counter

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

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

from collections import Counter

s = "life is a chocolate"
ss = Counter(s)
print(ss)
# 结果:
# Counter({‘ ‘: 3, ‘l‘: 2, ‘i‘: 2, ‘e‘: 2, ‘a‘: 2, ‘c‘: 2, ‘o‘: 2, ‘f‘: 1, ‘s‘: 1, ‘h‘: 1, ‘t‘: 1})

 

 

2.deque双向队列

在说双向队列之前我们先了解两种数据结构:

1.栈:FILO.它的特点是先进后出

2.队列:FIFO.先进先出

由于python中没有给出栈(stack)模块,我们可以粗略写一个栈的模块:

class StackFullError(Exception):
    pass


class StackEmptyError(Exception):
    pass

#
class Stack:
    def __init__(self,size):
        self.size = size
        self.index = 0
        self.lst = []

    def push(self,el):
        if self.index == self.size:
            raise StackFullError("the stack is full")
        self.lst.insert(self.index,el)
        self.index += 1

    def pop(self):
        if self.index == 0:
            raise StackEmptyError
        self.index -= 1
        c =self.lst.pop(self.index)
        return c


st = Stack(3)
st.push("早上好")
st.push("中午好")
st.push("晚上好")

print(st.pop())
print(st.pop())
print(st.pop())

 

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

import queue

q = queue.Queue()
q.put("刘德华")
q.put("张学友")
q.put("郭富城")

print(q)
print(q.get())
print(q.get())
print(q.get())
# print(q.get()) #队列中如果没有元素了,继续获取的话,会阻塞

 

注意.如果队列里没有元素了.再也就拿不出来元素了,此时程序会阻塞.

双向队列deque,此队列是collections中的.

from collections import deque

q = deque()
q.append("Mandy")
q.append("Cassie")  # 右侧添加
q.appendleft("Luis")    # 左侧天剑
q.append("Hans")

print(q.pop())  # 右侧删除
print(q.popleft())  # 左侧删除
print(q.pop())
print(q.popleft())

 

 

3.namedtuple 命名元组

命名元组: 给元组内的元素进行命名.

from collections import namedtuple

# 定义元组,其实相当于创建了一个类
ppp = namedtuple("hah",["x","y","c"])
p = ppp(1,2,3)
print(p)
# p.c = 15  # 报错,因为ppp始终是个元组,元组不能进行增删改操作
print(p.y)

 

 

4.orderdict 和 defaultdict

orderdict: 字典的key默认是无序的,而OrderDict是有序的

dic = {a:娃哈哈, b:薯条, c:胡辣汤} 
print(dic)
 
from collections import OrderedDict 
od = OrderedDict({a:娃哈哈, b:薯条, c:胡辣汤}) 
print(od)

 

由于python3.5后的版本打印字典都默认按输入时顺序打印,所以看不出效果.但是内部储存还是无序的,因为字典的key是按hash列表储存的.

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

from collections import defaultdict

dc = defaultdict(list)  # 括号里面的是一个可被调用的对象
print(dc["周星驰"])
# 结果: []

 

三.time时间模块(重点)

时间模块是一个经常要用到的模块.比如,如何计算时间差,如何按照客户的要求展示时间.等等.

import time 
print(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秒 这个时间可以被细分为年,月,日,星期,等等...

 

我们一般展示给客户看的时间都是进行格式化后的时间,而不是时间戳.

s = time.strftime("%Y-%m-%d %H:%M:%S")    # 必须记住
print(s)

 

# 从时间戳 -> 格式化时间
t = time.localtime(1542513992) # 时区   gmtime() 格林尼治时间.
print(t)
str_time = time.strftime("%Y-%m-%d %H:%M:%S", t)
print(str_time)

结果: 2018-11-18 12:06:32

 

日期格式化的标准:

%y 两位数的年份表示(00-99)

%Y 四位数的年份表示(0000-9999)

%m 月份(01-12

%d 月内中的一天(0-31)

%H 24小时制小时数(0-23)

%I 12小时制小时数(01-12)

%M 分钟数(0-59)

%S 秒 (00-59)

%a 本地简化星期名称

%A本地完整星期名称

%b 本地简化的月份名称

%B 本地完整的月份名称

%c 本地相应的日期表示和时间表示

%j 年内的一天(001-366)

%p 本地A.M.或P.M.的等价符

%U 一年中的星期数(00-53)

%w 星期(0-6),星期天为星期的开始

%x 本地相应的日期表示

%X 本地相应的时间表示

%Z 当前时区的名称

%% %号本身

 

结构化时间:

print(time.localtime()) 
结果: time.struct_time(tm_year=2017, tm_mon=05, tm_mday=8, tm_hour=10, tm_min=24, tm_sec=42, tm_wday=0, tm_yday=126, tm_isdst=0) 

 

 

时间的转换:所有的转化都要通过结构化时间来转化

 

# 数据库里存了一个时间戳 1888888888
# 从时间戳 -> 格式化时间
t = time.localtime(1542513992) # 时区   gmtime() 格林尼治时间.
print(t)
str_time = time.strftime("%Y-%m-%d %H:%M:%S", t)
print(str_time)

用户输入一个时间. 变成时间戳
格式化时间 -> 时间戳
2018-11-18 12:06:32
s = "2018-11-18 12:06:32"
t = time.strptime(s, "%Y-%m-%d %H:%M:%S") #  string parse time
print(t)
# 结构化时间 -> 时间戳
ss = time.mktime(t)
print(ss)
print(time.strftime("%Y年%m月%d日"))

# 中文
import locale
locale.setlocale(locale.LC_CTYPE, "chinese")

 

 

 

 

计算时间差:

第一种算法:

begin = "2018-11-14 16:30:00"
end = "2018-11-14 18:00:00"
# 用时间戳计算出时间差(秒)
begin_struct_time = time.strptime(begin, "%Y-%m-%d %H:%M:%S")
end_stract_time = time.strptime(end, "%Y-%m-%d %H:%M:%S")

begin_second = time.mktime(begin_struct_time)
end_second = time.mktime(end_stract_time)

# 秒级的时间差   180000
diff_time_sec = abs(begin_second - end_second)

# 转换成分钟
diff_min = int(diff_time_sec//60)
print(diff_min)

diff_hour = diff_min//60  # 1
diff_min_1 = diff_min % 60 # 30

print("时间差是 %s小时%s分钟" % (diff_hour, diff_min_1))

 

第二种算法:

begin = "2019-11-14 16:30:00"
end = "2018-11-14 18:00:00"
# 用时间戳计算出时间差(秒)
begin_struct_time = time.strptime(begin, "%Y-%m-%d %H:%M:%S")
end_stract_time = time.strptime(end, "%Y-%m-%d %H:%M:%S")

begin_second = time.mktime(begin_struct_time)
end_second = time.mktime(end_stract_time)

# 秒级的时间差  180000
diff_time_sec = abs(begin_second - end_second)

# 转化成结构化时间
t = time.gmtime(diff_time_sec) # 最好用格林尼治时间。 否则有时差
print(t)

print("时间差是%s年%s月 %s天 %s小时%s分钟" % (t.tm_year-1970, t.tm_mon-1, t.tm_mday-1,t.tm_hour, t.tm_min ))

 

关于time模块还需要去看的内容: datetime(时间), calender(日历)

四.random模块

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

import random

print(random.randint(1,2))  # [start, end]
print(random.random()) # (0,1)之间的小数
print(random.uniform(3,10)) # (3, 10 )的随机小数

n = random.randrange(1, 10, 3) # [1, 10) 从奇数中获取到随机数
while n != 10:
    n = random.randrange(1, 10, 3)

for i in range(1, 10, 3):
    print(i)

print(random.choice([1, 周杰伦, ["盖伦", "胡辣汤"]])) # 列表中的任意一个元素
print(random.sample([1, 23, [4, 5]], 2)) # 列表元素任意2个组合

lst = ["周杰伦", "昆凌", "马化腾", "马丽", "沈腾", "秋雅"]
random.shuffle(lst) # 随机打乱顺序
print(lst)

 

 

五.os模块

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

import os
os.makedirs(dirname1/dirname5) # 创建文件夹目录结构
os.removedirs(dirname1/dirname5)  # 删除文件夹, 如果文件夹内没有东西。 就可以删除。 否则报错

os.mkdir(dirname/哈哈)  # mkdir如果父级目录不存在。 报错
os.rmdir(dirname) # 删除文件夹

print(os.listdir(../)) # 获取到文件夹内的所有内容. 递归

print(os.stat(dirname)) # linux

os.system("dir") # 直接执行命令行程序
s = os.popen("dir").read()
print(s)

print(os.getcwd() ) # 当前程序所在的文件夹

print(os.path.abspath("../day020 继承") ) # 获取绝对路径
print(os.path.split("D:python_workspaceday020 继承")) # 拆分路径 (‘D:\python_workspace‘, ‘day020 继承‘)
print(os.path.dirname("D:python_workspaceday020 继承")) # D:python_workspace
print(os.path.basename("D:python_workspaceday020 继承")) # day020 继承

print(os.path.exists("dirname")) # 判断文件是否存在
print(os.path.isabs("D:python_workspaceday020 继承")) # 是否是绝对路径

print(os.path.isfile("01 今日主要内容")) # 是否是文件
print(os.path.isdir("dirname")) # 是否是文件夹

print(os.path.getsize("01 今日主要内容") ) # 文件大小

print("胡辣汤", "传盛", "big", sep="small")

print("c:"+os.sep+"胡辣汤") # \/  文件路径的分隔符

print(os.name) # nt

 

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       返回操作系统平台名称

 




以上是关于常用模块-01的主要内容,如果未能解决你的问题,请参考以下文章

Python 常用模块学习

如何将字符串数据从活动发送到片段?

常用模块-01

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

C#常用代码片段备忘

swift常用代码片段