一. 模块的简单认识

模块就是我们把装有特定功能的代码进行归类的结果.从代码编写的单位来看我们的程序,从小到大的顺序:一条代码 < 语句块 < 代码块(函数,类) < 模块,我们目前写的所有的py文件都是模块,引入模块的方式:

  1.import模块

  2.from xxx import 模块

二. collections模块

  collections模块主要封装了一些关于集合类的相关操作.比如,terable,Iterator等等.除了这些意外,collections还提供了一些除了基本数据类型以外的数据集合类型.Counter,deque,OrderDict,defaultdict以及namedtuple

1. Counter

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

from collections import Counter

print(Counter("哈哈哈你还好啊"))  # 计算一个字符串中字符出现的个数 Counter({'哈': 3, '你': 1, '还': 1, '好': 1, '啊': 1})
lst = ["jay","jay","jay","哈哈","你好"]
dic = {"a":"你好","b":"你好","c":"真的好"} l = Counter(lst)
c = Counter(dic.values()) print(l) # Counter({'jay': 3, '哈哈': 1, '你好': 1})
print(c) # Counter({'你好': 2, '真的好': 1})

  

2. deque 双向队列

1.先介绍两种数据结构 1.栈 2.队列

  1.栈: FILO. 先进后出

  2.队列:FIFO.先进先出

python中并没有给出Stack模块,所以我们写一个大概意思(这个版本有非常严重的并发问题,仅供粗略观看)

栈:

class StackFullException(Exception):
pass
class StackEmptyExcepiton(Exception):
pass class Stack:
def __init__(self,size):
self.size = size
self.lst = []
self.top = 0 # 栈顶指针 def push(self,el): # 入栈
if self.top >= self.size:
raise StackFullException("栈已放满")
self.lst.insert(self.top,el)
self.top +=1 def pop(self): #出栈
if self.top == 0:
raise StackEmptyExcepiton("栈已放空")
self.top -= 1
el = self.lst[self.top]
return el
s = Stack(6)
s.push("1")
s.push("2")
s.push("3")
s.push("4")
s.push("5")
s.push("6") print(s.pop()) #6
print(s.pop()) #5
print(s.pop()) #4
print(s.pop()) #3
print(s.pop()) #2
print(s.pop()) #1

 

deque: 双向队列

from collections import deque
d = deque() # 创建双向队列
d.append("1") # 在右侧添加
d.append("2")
d.append("3") # deque(['1', '2', '3']) d.appendleft("0") # 在左侧添加 deque(['0', '1', '2', '3']) print(d.pop()) # 从右边拿数据 3
print(d.popleft()) # 从左边拿数据 0

  

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

  

3. orderdict 有序字典  ,  defaultdict默认值字典

  字典的key是默认无序的在python3.3以前体现的很明显,时常打印出的字典顺序混乱,orderdict是有序的

from collections import OrderedDict
dic = OrderedDict()
dic["a"] = "你好"
dic["b"] = "哈哈" print(dic) # OrderedDict([('a', '你好'), ('b', '哈哈')])
print(dic.get("a")) # 你好
print(dic.values()) # odict_values(['你好', '哈哈'])
print(dic["a"]) # 你好

  

4. defaultdict:

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

from collections import defaultdict

dd = defaultdict(list)
print(dd["哇哈哈"]) # []
print(dd) # defaultdict(<class 'list'>, {'哇哈哈': []}) dd2 = defaultdict(lambda : 0) # callable 可调用的,字典是空的
print(dd2["优乐美"]) # 0
print(dd2) # defaultdict(<function <lambda> at 0x000001ECF0571E18>, {'优乐美': 0})

  

三. time时间模块

时间有三种:

  结构化时间:  gmtime()     localtime()

  时间戳: time.time()  time.mktime()

  格式化时间:  time.strftime()  time.strptime()

时间转化的思路:

  数字 - > 字符串

  struct_time = time.localtime(数字)

  str = time.strftime("格式",struct_time)

  

  字符串 - > 数字

  struct_time = time.strptime(字符串,"格式")

  num = time.mktime(struct_time)

时间模块是我们日常使用中经常用到的模块.

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

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

  3.结构化时间(strct_time).这个时间主要可以把时间进行分类划分.比如.1970年01月01日 00点00分00秒 这个时间可以被细分为年,月,日...一大堆东西

时间戳我们已经见过了就是time.time().一般,我们不会把这样的时间展示给客户,所以,我们要对时间进行格式化操作

import time

s = time.strftime("%Y-%m-%d %H:%M:%S")
print(s)

日期格式化的标准:

%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中识别的时间)

import time
t = time.localtime(1488484848)
s = time.strftime("%Y-%m-%d %H:%M:%S") print(t)
#结果(结构化时间):
# time.struct_time(tm_year=2017, tm_mon=3, tm_mday=3, tm_hour=4, tm_min=0, tm_sec=48, tm_wday=4, tm_yday=62, tm_isdst=0) print(s)
# 2018-12-26 21:14:55

如果让用户输入一个时间,我们来把它转化为我们数据库存储的时间戳,就要用到结构化时间,流程为

# 数据库里存储一个数字. 把它还原成我们的格式化时间
a = 0
# 先把这个时间戳转化成python中的结构化时间
# t = time.localtime(a) # 本地化的东八区的时间
t = time.gmtime(a) # 格林尼治时间
# 把一个结构化时间转化成格式化时间
s = time.strftime("%Y-%m-%d %H:%M:%S", t)
print(s)

现在我们举个例子用一下

s = "2018-12-26 21:16:33"
t = time.strptime(s,"%Y-%m-%d %H:%M:%S") # 转化为结构时间
print(time.mktime(t)) # 转化为时间戳 

计算时间差

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-12 11:00:00','%Y-%m-%d %H:%M:%S'))
dif_time=time_now-true_time
struct_time=time.localtime(dif_time)
print(struct_time)
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,
struct_time.tm_min,struct_time.tm_sec))

 

四.  functools

1.wraps

装饰器装饰的函数名字会变为inner,为了让装饰的函数名还原,我们用到了@wraps,这样打印出的函数名就还是原来的函数名了

from functools import wraps # 可以改变一个函数的名字, 注释...

def wrapper(fn):
@wraps(fn) # 把inner的名字改变成原来的func
def inner(*args, **kwargs):
print("前")
ret = fn(*args, **kwargs)
print("后")
return ret return inner @wrapper # func = wrapper(func)
def func():
print('哈哈哈') print(func.__name__) # func

  

2.  reduce 归纳.

# map 映射 reduce 归纳
print(list(map(lambda x: x**2, [i for i in range(10)]))) from functools import reduce def func(a, b):
return a + b # 0+1 +4 +7+2+5+8+3+6+9 # 累加 # 会把我们每一个数据交给func去执行, 把默认值作为第一个参数传递给函数
# 第二个参数就是你这个序列中的第一个数据
# 接下来. 把刚才返回的结果作为第一个参数传递个a
# 继续吧刚才的结果给第一个参数. 把第三个数据传递给b
ret = reduce(func, [1,4,7,2,5,8,3,6,9])
# 工作流程
func(func(func(0, 1),4),7)
print(ret) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
print(reduce(lambda x, y:x + y, [i for i in range(101)]))

  

3. partial 偏函数

固定函数中某些参数的值

from functools import partial

def chi(zhushi, fushi):
print(zhushi, fushi) # 固定函数中某些参数的值
chi = partial(chi, fushi="辣鸡爪")
chi("大米饭") # 大米饭 辣鸡爪 #坑
chi("大米饭","烤猪蹄") # 如果填入第二个参数就会报错, TypeError: chi() got multiple values for argument 'fushi'
chi("大米饭",fushi = "烤猪蹄")  # 大米饭 烤猪蹄  如果第二个参数这样赋值,就可以把值传进去

  

 

python--内置常用模块(一) collections 队列 time模块 functiontools的更多相关文章

  1. python内置常用高阶函数(列出了5个常用的)

    原文使用的是python2,现修改为python3,全部都实际输出过,可以运行. 引用自:http://www.cnblogs.com/duyaya/p/8562898.html https://bl ...

  2. python 内置常用函数

    import os def set(o): return set(o) # =={o} def reverseObject(it): it.reverse() return it def sortOb ...

  3. python内置常用内置方法详解

    # print(locals()) # print(globals()) def func(): x = 1 y = 1 print(locals()) # 函数内部的变量 print(globals ...

  4. Python内置标准模块

    time 模块 1 >>> import time 2 >>> time.time() 3 1491064723.808669 4 >>> # t ...

  5. day05 模块以及内置常用模块用法

    内置常用模块详解: 1 time 2 datetime 3 random   4 os 5 sys 6 shutil 7 shelve 8 xml 9 configparser 10 hashlib ...

  6. Python内置的urllib模块不支持https协议的解决办法

    Django站点使用django_cas接入SSO(单点登录系统),配置完成后登录,抛出“urlopen error unknown url type: https”异常.寻根朔源发现是python内 ...

  7. Python内置的操作系统模块(os)与解释器交互模块(sys)

    Python内置的操作系统模块(os)与解释器交互模块(sys) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本片博客只介绍Python调用操作系统的模块即os模块,以及Pyth ...

  8. day25 内置常用模块(四): 模块和包

    阅读目录: 模块 import from xxx import xxx 包 import from xxx import xxx    from xxx  import *    __init__.p ...

  9. Python内置OS模块用法详解

    大家好,从今天起早起Python将持续更新由小甜同学从初学者的角度学习Python的笔记,其特点就是全文大多由新手易理解的代码与注释及动态演示.刚入门的读者千万不要错过! 很多人学习python,不知 ...

随机推荐

  1. Numpy的ndarry:一种多维数组对象

    Numpy的ndarry:一种多维数组对象 Numpy最重要的一个特点就是其N维数组对象(即ndarry),该对象是一个快速而灵活的大数据集容器.你可以利用这种数组对整块数据执行一些数学运算,其语法跟 ...

  2. vs2010 出现“未能将 ProteusDebugEngine 调试器附加到计算机”

    vs2010 打开项目时出现如下图错误,解决方法: 1.查看C:\Progream Files下的Internet Explorer文件夹还在不在,不在则会出现此问题: 2.可以右键项目属性-调试-勾 ...

  3. halcon控制显示精度(精确到小数点后6位,精度足够了)

    实践应用 set_tposition (WindowHandle3,50, 50) write_string (WindowHandle3, '半径 D1=' +Ra[i]$'#f') set_tpo ...

  4. Prism之初识

    首先,简单地介绍说一下单一应用程序与复合应用程序. 一.单一应用程序 看看上面这张图片,假如我们当前的需求是实现主界面如图所示.如果将其构建成具有用户控件的传统 WPF 应用程序,首先应构建一个顶层窗 ...

  5. Golang之strings包

    只列举了部分函数方法的使用: 太多了....... package main import ( "fmt" "strings" ) func main() { ...

  6. rsync同步常用命令[转载]

    转载:http://blog.csdn.net/niushuai666/article/details/16880061 如果你是一位运维工程师,你很可能会面对几十台.几百台甚至上千台服务器,除了批量 ...

  7. qt学习(二) buttong layout spinbox slider 示例

    开启qt5 creator 新建项目 qt widgets 改写main.cpp #include "mainwindow.h" #include <QApplication ...

  8. 使用vim鼠标右键无法粘贴问题解决

    问题: Debian中通过终端使用vim,无法通过鼠标粘贴.这是由于一项默认的鼠标配置导致. 解决方法: vi /usr/share/vim/vim80/defaults.vim 查找set mous ...

  9. 15 Independent Alleles

    Problem Figure 2. The probability of each outcome for the sum of the values on two rolled dice (blac ...

  10. docker-compose up启动又停止,需要加tty为true

    如果docker-compose.yml如下,则用docker-compose up -d启动起来的容器可能会立即停止. version: '2' services: mir-http-repo: i ...