首页 > 编程语言 > 详细

python语法基础-常用模块-长期维护-20191217

时间:2019-12-18 16:56:19      阅读:98      评论:0      收藏:0      [点我收藏+]

###############      collections模块   ################

# collections模块,
# 在内置数据类型的基础上,collections提供了几个额外的数据类型
# 1.namedtuple: 生成可以使用名字来访问元素内容的tuple
# 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
# 3.Counter: 计数器,主要用来计数
# 4.OrderedDict: 有序字典
# 5.defaultdict: 带有默认值的字典

from collections import namedtuple
# 这个实现就是面向对象的思想实现的,
point = namedtuple(point,[x,y])  # 这是定义了一个类,有一个类名,两个属性
p=point(1,2)  # 这是类的实例化
print(p.x)
print(p.y)

# 队列,
# 在任何语言里面,队列都是一个非常有地位的数据类型,就像排队买票,
# 特点就是先进先出,和列表不一样,列表是随意拿里面的元素,
import queue
# 栈,
# 对应的是栈,先进后出,就像电梯,
# 双端队列
# 可以从两端存取,这个不常用,但是队列是非常常用的,
from collections import deque
dq = deque()
dq.append(1)
dq.append(2)
dq.append(3)
print(dq.pop())  # 取出来之后,队列里面就没有了,
print(dq.popleft())
dq.appendleft(4)
dq.appendleft(5)
print(dq)


# 有序字典
from collections import OrderedDict

d = dict([(a, 1), (b, 2), (c, 3)])
print(d)  # 这是无序的
od = OrderedDict([(a, 1), (b, 2), (c, 3)])
print(od)  # 这是有序的

# 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],
# 将所有大于 66 的值保存至字典的第一个key中,
# 将小于 66 的值保存至第二个key的值中。
# : {‘k1‘: 大于66 , ‘k2‘: 小于66}
list1 =[11,22,33,44,55,66,77,88,99,90]
dict1 = {k1:[],k2:[]}
for i in list1:
    if i > 66:
        dict1[k1].append(i)
    elif i < 66:
        dict1[k2].append(i)
# print(dict1)

# 使用带有默认值的字典来解决上面的问题,
from collections import defaultdict
dict2 = defaultdict(list)  # 这是给里面的每一个key,创建一个列表,这里面还可以是集合等其他的类型
for i in list1:
    if i > 66:
        dict2[k1].append(i)
    elif i < 66:
        dict2[k2].append(i)
print(dict2)


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

 

###############      时间模块   ################

# time 模块
# 在python中是经常使用到这个模块的,
# 比如记录程序执行的时间
# 让程序停留一段时间sleep
# 记住三种时间,时间戳时间,格式化时间,结构化时间,还有一个sleep,
import time
print(time.time())  # 这是获取当前的时间戳,#计算时间差使用,
# time.sleep(3)
print(time.strftime(%Y-%m-%d %H:%M:%S))  # 字符串格式时间,给人看的,
print(time.localtime())  # 结构化时间,这是格式化时间的基础,比如计算年和年的差,月和月的差,


# 把2019-12-18转化成时间戳时间
# 先转成结构化时间,必须要这一步,不能直接格式化时间转换成时间戳时间,
p=time.strptime(2019-12-17, %Y-%m-%d)
print(p)
# 然后转换成时间戳时间
print(time.mktime(p))
# 计算从这个时间到现在过了多少秒了
print(time.time()-time.mktime(p))

# 把1500000000转成成格式化时间,
# 先把时间戳时间转换成结构化时间,
p = time.localtime(1500000000)
print(p)
# 把结构化时间转化成格式化时间
print(time.strftime(%Y-%m-%d %H:%M:%S,p))


# 时间戳转换成格式化时间,只有一种格式
print(time.strftime(%c))
print(time.ctime(150000000))  # 为什么是ctime就是因为只能转换成%c的格式,
ret = time.localtime(150000000)
print(time.asctime(ret))  # asctime()必须传递一个元组,


# 现在要解决一个问题,就是如何把时间间隔,转换成年月日,比如你入职多久这样的,
# 比如从1992-08-16 到今天过了多少年,多少月,多少日,多少时,多少分,多少秒了
# 思路:
import time
def time_dif(oldtime,newtime):
    timestamp1 = time.strptime(oldtime,%Y-%m-%d %H:%M:%S)  # strptime 把格式化时间转化成结构化时间
    timestamp2 = time.strptime(newtime,%Y-%m-%d %H:%M:%S)
    ti = time.localtime(time.mktime(timestamp2)-time.mktime(timestamp1))  # mktime 把结构化时间时间转化成时间戳时间  localtime 把时间戳时间转换成结构化时间
    print(ti)
    return 时间差是%s年,%s月,%s日,%s时,%s分,%s秒%(ti.tm_year-1970,ti.tm_mon-1,ti.tm_mday-1,ti.tm_hour,ti.tm_min,ti.tm_sec)
#   时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量


print(time_dif(1992-8-16 0:0:0,2019-8-18 11:07:3))

 

###############      random模块   ################

# random模块
import random
r = random.random()  # 生成一个0-1之间的小数
r = random.uniform(1,4)  # 生成一个1-4之间的小数 ,这个从来没有用过
r = random.randint(50,100)  # 生成一个50-100的整数,用的最多
r = random.randrange(1,20,2) # 1-20之间的奇数,
print(r)

 

###############      os模块   ################

 

 

###############      sys模块   ################

# sys模块
# 这个是和python解释器打交道的,

import sys
print(sys.version)  # 取Python解释程序的版本信息
print(sys.platform)  # 返回操作系统平台名称
print(sys.path)  # 返回模块的搜索路径
print(sys.argv)  # 返回一个列表,列表的第一项是
print(**6)
sys.exit()  # 退出程序,
print(-*6)  # 下面的是不会打印执行的,
# 这个模块完全没有应用场景!学了和没学一样,

 

###############     序列化模块   ################

 

 

###############     re模块   ################

 

 

###############     hashlib模块   ################

import hashlib

# 不加盐
md5 = hashlib.md5()  # 创建一个md5算法的对象
md5.update(123456.encode(utf-8))
print(md5.hexdigest())  # 这个值永远不会变,容易被人暴力破解,要加盐

# 固定加盐
md5 = hashlib.md5(SOS.encode(utf-8))  # 固定的盐还是可以破解的,
md5.update(123456.encode(utf-8))
print(md5.hexdigest())

# 动态加盐
user = sos
print(user[1::-1])
md5 = hashlib.md5(user[1::-1].encode(utf-8))
md5.update(123456.encode(utf-8))
print(md5.hexdigest())

# sha算法,和md5的用法一样,不过常用的还是md5,sha算法会慢一点
sha1 = hashlib.sha1(SOS.encode(utf-8))
sha1.update(123456.encode(utf-8))
print(sha1.hexdigest())

# 文件一致性校验
def md5file(file):
    md5=hashlib.md5()  # 做文件一致性校验不需要加盐
    with open(file,rb) as f:
        # text = f.read()
        # md5.update(text)
        # 对于大文件,不能一次性读取,
        while True:
            text = f.read(1024)  # 每次读取1024字节
            if text:
                md5.update(text)
            else:
                break

    return md5.hexdigest()  # 一次性读取和循环读取的结果是一样的


print(* * 50)
print(md5file(test.txt))
print(md5file(text2.txt))

 

###############     configparser模块   ################

# 配置文件,
# python中ini结尾,django中使用py文件来用,学习这个ini模式,保证别人用的时候你能看懂,
# 在配置文件中必须要有分组,
# 组名可以随便取,也可以是DEFAULT,DEFAULT有特殊的意义
# 每一组是一个小节,section,小节里面的每一项,叫做option,

# 使用python创建一个配置文件
import configparser
config = configparser.ConfigParser()
config["DEFAULT"] = {ServerAliveInterval: 45,
                      Compression: yes,
                     CompressionLevel: 9,
                     ForwardX11:yes
                     }
config[bitbucket.org] = {User:hg}
config[topsecret.server.com] = {Host Port:50022,ForwardX11:no}
with open(example.ini, w) as f:
    config.write(f)

# 查找配置文件
import configparser  # 导入模块
config = configparser.ConfigParser()  # 创建一个对象
config.read(example.ini)  # 读取文件
print(config.sections())  # 查找所有的小节,default是不会返回的,
print(bytebong.com in config)  # False # 判断一个小节是否在配置文件中,
print(bitbucket.org in config)  # True
# print(config[‘bitbucket.org‘]["user"])  # hg  # 取配置文件中某一个小节,某一个项的值,字典的操作格式,config[section‘]["option"]
# print(config[‘bitbucket.org‘])          #<Section: bitbucket.org>  这是一个可迭代对象
for key in config[bitbucket.org]:     # 注意,有default会默认default的键,会把default的key也打印出来,
    print(key)
# print(config.options(‘bitbucket.org‘))  # 同for循环,找到‘bitbucket.org‘下所有键
# print(config.items(‘bitbucket.org‘))    #找到‘bitbucket.org‘下所有键值对
# print(config.get(‘bitbucket.org‘,‘compression‘)) # yes
# get方法Section下的key对应的value。但是通过任何一个section都可以去访问default下面的option


# 配置文件的修改,删除,新增
import configparser
config = configparser.ConfigParser()
config.read(example.ini)
config.add_section(yuan)  # 新增一个section,但是记住最后要write,
config.remove_section(bitbucket.org)
config.remove_option(topsecret.server.com,"forwardx11")
config.set(topsecret.server.com,k1,11111)  # K1有值就是修改k1的value值,没有就是添加,
config.set(yuan,k2,22222)
config.write(open(new2.ini, "w"))

 

###############    logging模块   ################

# logging
# 日志,用来保持增删查改的记录,一个记录没有了是没有创建,还是创建了又删除了,需要记录日志
# 有了log,就可以使用这个来替代print来调试程序,线上也需要日志来定位错误,排查问题,这是必须的,
# 这些日志都是程序员写出来的,而且都是要输出到文件的,

# 使用logging日志两种方式
# 1,简单配置,但是受到的局限比较大,
# 2,配置logger对象,
# 这两个是独立的,

# 简单配置
# 默认情况下只显示警告级别及以上信心
import logging
file_handler = logging.FileHandler(filename=x1.log, mode=a, encoding=utf-8,)
logging.basicConfig(
    format=%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s,
    datefmt=%Y-%m-%d %H:%M:%S,
    handlers=[file_handler,], # 这种简单配置有一个大问题就是不能同时输出到文件和屏幕,
    level=logging.DEBUG  # 这样都显示出来了,但是不能只打印某一种信息,只能说是打印这个级别以上的信息
)
logging.debug(debug message)  # 调试模式,这个级别最低,
logging.info(info message)  # 显示正常的信息
logging.warning(warning message)  # 显示警告信息
logging.error(error message)  # 显示错误信息
logging.critical(critical message)  # 显示严重错误信息


# 配置logger对象,这是工作中常用的
import logging
logger = logging.getLogger()  # 实例化一个logger对象
fh = logging.FileHandler(test.log,encoding=utf-8)  # 实例化一个文件句柄,创建一个handler,用于写入日志文件
ch = logging.StreamHandler()  # 再创建一个handler,用于输出到控制台
formatter = logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s)

fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
ch.setFormatter(formatter)
ch.setLevel(logging.INFO)

logger.addHandler(fh)  # logger对象可以添加多个fh和ch对象
logger.addHandler(ch)

logger.debug(logger debug message)
logger.info(logger info message)
logger.warning(logger warning message)
logger.error(logger error message)
logger.critical(logger critical message)

 

 

###############    结束线   ################

python语法基础-常用模块-长期维护-20191217

原文:https://www.cnblogs.com/andy0816/p/12060508.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!