Python_常用模块

模块

什么是模块:

  一个模块就是一个包含了 python 定义和声明的文件,文件名就是模块名加上.py的后缀。

  但其实 import 加载的模块分为四个通用类别:

    1、使用 python 编写的代码(.py文件)

    2、已被编译为共享库或 DLL 的 C 或 C++ 扩展

    3、包好一组模块的包

    4、使用 C 编写并链接到 python 解释器的内置模块

为何要使用模块:

  如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。

  随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用。

 常用模块

collections 模块

  在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。

1、namedtuple: 生成可以使用名字来访问元素内容的tuple

2、deque: 双端队列,可以快速的从另外一侧追加和推出对象

3、Counter: 计数器,主要用来计数

4、OrderedDict: 有序字典

5、defaultdict: 带有默认值的字典

namedtuple:

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y', 'z'])
p1 = Point(1, 2, 3)
p2 = Point('a', 'b', 'c')
print(p1.x)
print(p1.y)
print(p1.z)
print(p1.x, p1.y)
print(p1.x, p1.y, p1.z)
print(p1, p2)

1
2
3
1 2
1 2 3
Point(x=1, y=2, z=3) Point(x='a', y='b', z='c')

deque

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

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

import queue
q = queue.Queue()
q.put('x')
q.put([1, 2, 3])
q.put(5)
q.put(6)
q.put(7)
print(q)
print(q.get())
print(q.get())
print(q.get())
print(q.get())   # 阻塞
print(q.qsize())

x
[1, 2, 3]
5
6
1
from collections import deque
deq = deque([1, 2])    # [1, 2]
deq.append('a')        # [1, 2, 'a']
deq.appendleft('b')    # ['b', 1, 2, 'a']
deq.insert(1, 5)       # ['b', 5, 1, 2, 'a']
print(deq.pop())
print(deq.pop())
print(deq.popleft())
print(deq)

a
2
b
deque([5, 1])

OrderedDict

使用 dict 时,key 是无序的。在对 dict 做迭代时,我们无法确定 key 的顺序。

如果要保持 key 的顺序,可以用 OrderedDict:

from collections import OrderedDict
od = OrderedDict([['b', 2], ['a', 1], ['c', 3]])
# od = OrderedDict([('b', 2), ('a', 1), ('c', 3)]) # 效果一样
print(od)
print(od['a'])
for k in od:
    print(k)

OrderedDict([('b', 2), ('a', 1), ('c', 3)])
1
b
a
c

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>66:
        if my_dict.has_key('k1'):
            my_dict['k1'].append(value)
        else:
            my_dict['k1'] = [value]
    else:
        if my_dict.has_key('k2'):
            my_dict['k2'].append(value)
        else:
            my_dict['k2'] = [value]
正常做法
from collections import defaultdict
values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
my_dict = defaultdict(list)
for value in values:
    if value > 66:
        my_dict['k1'].append(value)
    else:
        my_dict['k2'].append(value)
print(my_dict)

defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]})
defaultdict方法

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

from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
dd['key2']  # key2不存在,返回默认值
print(dd)

defaultdict(<function <lambda> at 0x0000000001080BF8>, {'key2': 'N/A', 'key1': 'abc'})

counter

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

from collections import Counter
c = Counter('abcdeabcdabcaba')
print(c)

Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})

时间模块

常用方法:

1.time.sleep(secs)
(线程)推迟指定的时间运行。单位为秒。
2.time.time()
获取当前时间戳

表示时间的三种方法

在Python中,通常有这三种方式来表示时间:时间戳、元组(struct_time)、格式化的时间字符串:

(1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。

(2)格式化的时间字符串(Format String): ‘1999-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个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)

索引(Index)属性(Attribute)值(Values)
0 tm_year(年) 比如2011
1 tm_mon(月) 1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(时) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 60
6 tm_wday(weekday) 0 - 6(0表示周一)
7 tm_yday(一年中的第几天) 1 - 366
8 tm_isdst(是否是夏令时) 默认为0

 导入time模块,python中表示时间的几种格式:

import time
# 时间戳
print(time.time())
# 时间字符串
print(time.strftime('%Y-%m-%d %X'))
print(time.strftime('%Y-%m-%d %H-%M-%S'))
# 时间元组:localtime将一个时间戳转换为当前时区的 struct_time
print(time.localtime())

1515584319.132047
2018-01-10 19:38:39
2018-01-10 19-38-39
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=10, 
tm_hour=19, tm_min=38, tm_sec=39,
tm_wday=2, tm_yday=10, tm_isdst=0)

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

几种格式之间的转换

 

时间戳(timestamp)---> 结构化时间(struct time)

 

posted @ 2018-01-14 22:42  Demonic_Survival  阅读(117)  评论(0)    收藏  举报