[ python ] 常用模块

collections 模块

在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:

  •     nametuple: 生成可以使用名字来访问元素内容的tuple
  •     deque: 双端队列,可以快速的从另外一侧追加和推出对象
  •     OrderedDict: 计数器,主要用来计数
  •     defaultdict: 有序字典
  •     Counter: 带有默认值的字典

 

nametuple

我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:

>>> t = (1,2)

 

但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。
这时,namedtuple就派上了用场:

 

类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple定义:

1
2
#namedtuple('名称', [属性list]):
Circle = namedtuple('Circle', ['x', 'y', 'r'])

 

使用该属性还可以运用在纸牌游戏中,花色和数字才能确定的表示一张牌。

 

deque

使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了。因为list是线性存储,数据量大的时候,插入和删除效率很低。

deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:

 

deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。

 

OrderedDict

使用dict时,key是无序的。在对dict做迭代时,我们无法确定key的顺序
如果要保持key的顺序,可以用OrderDict:

 

注意,OrderDict 的key会按照插入的顺序排序,不是key本身排序:

 

定义的OrderDict使用方式和普通的字典一样,只是比普通的字典多了一个有序的功能

 

defaultdict

有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66 , 'k2': 小于66}

复制代码
values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]

my_dict = {}

for value in values:
    if value > 60:
        if 'k1' in my_dict:
            my_dict['k1'].append(value)
        else:
            my_dict['k1'] = [value, ]
    elif value < 60:
        if 'k2' in my_dict:
            my_dict['k2'].append(value)
        else:
            my_dict['k2'] = [value, ]

print(my_dict)
原生字典解决方法
复制代码
复制代码
from collections import defaultdict

values = [11, 22, 33,44,55,66,77,88,99,90]

my_dict = defaultdict(list) # 设置字典中,每个元素都是一个list,list的key值由下面随意定义

for value in values:
    if value > 60:
        my_dict['k1'].append(value)
    elif value < 60:
        my_dict['k2'].append(value)


print(my_dict)
print(my_dict['aaaaaaa']) # 随意定义的key值都会对应一个list

# 执行结果:
# []
# defaultdict(<class 'list'>, {'k1': [66, 77, 88, 99, 90], 'asdfadfasdf': [], 'k2': [11, 22, 33, 44, 55]})
defaultdict字典解决方法
复制代码

 

使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:

注意:使用 defaultdict 设置默认值是无法使用常量的,如果要设置常量为默认值,需要借助 lambda来设置,如下:

 

Counter

Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的interger(包括0和负数)。

1
2
3
4
5
6
7
8
9
In [45]: from collections import Counter
 
In [46]: c = Counter('adfasdfawrsadfadfasdfzcv')
 
In [47]: print(c)   # 统计每个字符出现的次数并生成一个字典类型
Counter({'a': 6, 'f': 5, 'd': 5, 's': 3, 'w': 1, 'c': 1, 'v': 1, 'r': 1, 'z': 1})
 
In [48]: print(c['a'])  # 可以单独获取某个字符的次数,使用方法和字典取值一样
6

 

时间模块:time


和时间有关系的我们就要用时间模块。在使用模块之前,应该首先导入这个模块。

1
2
3
4
5
#常用方法
1.time.sleep(secs)
(线程)推迟指定的时间运行。单位为秒。
2.time.time()
获取当前时间戳

 

表示时间的三种方式:

在python中,通常有这三种方式来表示时间:时间戳、元组、格式化的时间字符串:
(1)时间戳(timestamp): 通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。
(2)格式化的时间字符串(Format String):'1990-12-06'

复制代码
%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 当前时区的名称
%% %号本身
python中时间日期格式化符号
复制代码

(3)元组(struct_time):struct_time元组共有9个元素:(年、月、日、时、分、秒,一年中第几周,一年中第几天等)

 

首先,我们先导入time模块,来认识一下python中表示时间的几种格式:

1
2
3
4
5
6
7
8
9
10
11
In [1]: from collections import namedtuple
In [49]: import time
 
In [50]: time.time()
Out[50]: 1539398412.6536071 # 时间戳
 
In [51]: time.strftime('%Y%m%d %X')
Out[51]: '20181013 10:40:40'    # 格式化时间
 
In [52]: time.localtime()
Out[52]: time.struct_time(tm_year=2018, tm_mon=10, tm_mday=13, tm_hour=10, tm_min=40, tm_sec=47, tm_wday=5, tm_yday=286, tm_isdst=0)    # 结构化时间

 

小结:时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的

三种格式之间的转换

 

In [6]: time.localtime(1500000000)
Out[6]: time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
时间戳 --> 结构化时间:time.localtime
In [7]: time.mktime(time.localtime(1500000000))
Out[7]: 1500000000.0
结构化时间 --> 时间戳: time.mktime
In [12]: time.strftime('%Y%m%d %H:%M:%S', time.localtime(1500000000))
Out[12]: '20170714 10:40:00'
结构化时间 --> 格式化时间: time.strftime
In [14]: time.strptime('20170714 10:40:00', '%Y%m%d %H:%M:%S')
Out[14]: time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=-1)
格式化时间 --> 结构化时间:time.strptime

In [16]: time.asctime(time.localtime(1500000000))
Out[16]: 'Fri Jul 14 10:40:00 2017'
结构化时间 --> %a %b %d %H:%M:%S %Y串:time.asctime
In [17]: time.ctime(1500000000)
Out[17]: 'Fri Jul 14 10:40:00 2017'
时间戳 --> %a %b %d %H:%M:%S %Y串: time.ctime

 

作业:

  计算2008-1-1 00:00:00 到现在过去了几年几月几日几时几分几秒

复制代码
import time

true_time = time.strptime('2008-1-1 00:00:00', '%Y-%m-%d %H:%M:%S')
now_time = time.localtime(time.time())
print('2008-现在过去了%d年%d月%d日%d时%d分%d秒' % (now_time.tm_year - true_time.tm_year,
                                        now_time.tm_mon - true_time.tm_mon,
                                        now_time.tm_mday - true_time.tm_mday,
                                        now_time.tm_hour - true_time.tm_hour,
                                        now_time.tm_min - true_time.tm_min,
                                        now_time.tm_sec - true_time.tm_sec))
time模块作业
复制代码

 

 随机模块:random模块

 

1
2
3
4
5
6
# 随机小数
In [2]: random.random()
Out[2]: 0.2835506853671552  # 大于0且小于1之间的小数
 
In [3]: random.uniform(1,3) # 大于1小于3的小数
Out[3]: 2.6577326276294753

 

1
2
3
4
5
6
# 随机整数
In [4]: random.randint(1,5) # 大于等于1且小于等于5之间的整数
Out[4]: 2
 
In [5]: random.randrange(1, 10, 2# 大于等于1且小于10之间的奇数
Out[5]: 9

 

1
2
3
4
5
6
7
# 随机选择一个返回
In [6]: random.choice([1, '23', [4,5]]) # 1或者23或者[4,5]
Out[6]: [4, 5]
 
# 随机选择多个返回,返回的个数为函数的第二个参数
In [7]: random.sample([1, '23', [4,5]],2)   # 列表元素任意2个组合
Out[7]: [[4, 5], 1]

 

1
2
3
4
5
6
7
8
9
10
11
12
# 打乱列表顺序
In [9]: item = [1, 3, 5, 7, 9]
 
In [10]: random.shuffle(item)   # 打乱次序
 
In [11]: item
Out[11]: [3, 9, 1, 5, 7]
 
In [12]: random.shuffle(item)
 
In [13]: item
Out[13]: [9, 5, 1, 3, 7]

 

作业:

  随机生成验证码。

复制代码
import random

def v_code():
    code = ''
    for i in range(5):
        num = random.randint(0,9)
        alf = chr(random.randint(65, 90))
        add = random.choice([num, alf])
        code += str(add)
        # code = ''.join([code, str(add)])
    return code

print(v_code())
随机验证码作业
复制代码

 

 

操作系统相关模块:os模块

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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.stat('path/filename')  获取文件/目录信息 的结构说明

复制代码
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)是创建时间(详细信息参见平台的文档)。
stat 结构
复制代码

 

 

os模块的属性

1
2
3
4
os.sep    输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep    输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'

 

python解释器环境相关:sys模块

 

sys模块是与python解释器交互的一个接口

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

 

本文作者:hukey

本文链接:https://www.cnblogs.com/hukey/p/9782489.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   hukey  阅读(220)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 彩虹 Jay
彩虹 - Jay
00:00 / 00:00
An audio error has occurred.

彩虹 + 轨迹 (Live) - 周杰伦 (Jay Chou)

彩虹

词:周杰伦

曲:周杰伦

哪里有彩虹告诉我

哪里有彩虹告诉我

能不能把我的愿望还给我

能不能把我的愿望还给我

为什么天这么安静

为什么天这么安静

所有的云都跑到我这里

有没有口罩一个给我

有没有口罩一个给我

释怀说了太多就成真不了

释怀说了太多就成真不了

也许时间是一种解药

也许时间是一种解药

也是我现在正服下的毒药

也是我现在正服下的毒药

看不见你的笑 我怎么睡得着

看不见你的笑 我怎么睡得着

你的声音这么近我却抱不到

你的声音这么近我却抱不到

没有地球太阳还是会绕

没有地球太阳还是会绕

没有理由我也能自己走

没有理由我也能自己走

你要离开 我知道很简单

你要离开 我知道很简单

你说依赖 是我们的阻碍

你说依赖 是我们的阻碍

就算放开 但能不能别没收我的爱

就算放开 但能不能别没收我的爱

当作我最后才明白

当作我最后才明白

看不见你的笑 要我怎么睡得着

看不见你的笑 要我怎么睡得着

你的声音这么近我却抱不到

没有地球太阳还是会绕 会绕

没有理由我也能自己走掉

释怀说了太多就成真不了

也许时间是一种解药 解药

也是我现在正服下的毒药

轨迹

词:黄俊郎

曲:周杰伦

我会发着呆然后忘记你

接着紧紧闭上眼

想着哪一天 会有人代替

想着哪一天 会有人代替

让我不再想念你

我会发着呆 然后微微笑

我会发着呆 然后微微笑

接着紧紧闭上眼

又想了一遍 你温柔的脸

又想了一遍 你温柔的脸

在我忘记之前