python模块-logging和collections以及random模块

主要内容:

1.logging高级

2.collections 模块

3.random模块

 

 

1.logging高级

logging基本的示例如下:

import logging
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(filename)s (line:%(lineno)d) %(levelname)s %(message)s',filename="log.log",filemode= "w")

try:
    s = input(">>>>>>>")
    p = int(s)
except ValueError as e:
    logging.debug(e)
    logging.info(e)
    logging.warning(e)
    logging.error(e)
    logging.critical(e)

低级的有个问题,就是不能同时屏幕和文件同时输出.

高级是支持的.示例如下:

import logging
logger = logging.getLogger()   # 创建logger对象.
logger.setLevel(logging.DEBUG)

fh = logging.FileHandler("test1.log",encoding="utf-8")  #创建文件句柄
ch = logging.StreamHandler()  #产生了一个屏幕句柄

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)   # 设置文件的格式  (这两个按照需求可以单独设置)
ch.setFormatter(formatter)    # 设置屏幕格式
logger .addHandler(fh)    #  添加文件句柄
logger.addHandler(ch)    #添加屏幕句柄
fh.setLevel(logging.INFO)
ch.setLevel(logging.INFO)    #如果你对logger对象设置日志等级.那么文件和屏幕都设置了.
# #总开关 默认从warning开始,如果想设置分开关:必须要从他更高级:(ERROR,critical)从这来个开始.
#

 

 

 

2.collections 模块

collections 模块给你提供的就是一些特殊的数据类型.

 

 namedtuple  

namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。

这样一来,我们用namedtuple可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便

示例:

from collections import namedtuple
point = namedtuple("Point",["x","y"])
p = point(1,2)
print(p.x)

deque  双向队列

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

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

from collections import deque
q = deque([1,2,3])
q.append("天气")
q.appendleft("不好")
q.pop()
q.popleft()
print(q)

 

defaultdict   

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

注意默认值是调用函数返回的(这里是必须的),而函数在创建defaultdict对象时传入。

除了在Key不存在时返回默认值,defaultdict的其他行为跟dict是完全一样的。

 

lst = [11,22,33,44,55,66,77,88,99,90]
from collections import defaultdict
dic = defaultdict(list)
for i in lst:
    if i > 66:
        dic["k1"].append(i)
    else:
        dic["k2"].append(i)
print(dic)

以及如下示例:

from collections import defaultdict
dic = defaultdict(lambda : 5)
# for i in lst:
#     if i > 66:
#         dic["k1"].append(i)
#     else:
#         dic["k2"].append(i)
# print(dic)

for i in range(1,21):
    dic[i] = 5
print(dic)

 

 

Counter  统计每个元素出现的次数

如下示例:

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

"""
运行结果如下:
Counter({'a': 6, 'b': 4, 'd': 4, 'c': 3, 'f': 2, 'k': 2, 'j': 2, 'l': 2, 'e': 1, 's': 1})
"""

OrderedDict

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

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

from collections import OrderedDict
dic = OrderedDict()
dic["a"] =1
dic["b"] = 2
dic["c"] = 3
print(dic.keys())

 

 

3.random 模块

 

import random
print(random.random())   # 0~1 之间的小数
print(random.uniform(1,6))  #  1~3小数
print(random.randint(1,10)) # 1<=x<=10  整数
print(random.randrange(1,10,2))     # 1<=x<10 的奇数 顾首不顾尾
print(random.choice([1,"好人",[1,2,3]])) # 任选择一个,常用 ,这个里面的变量是可索引的变量,比如列表,元组,或者字符
print(random.sample([1,"好人",[1,2,3]],2)) #任选择两个
item = [i for i in range(1,14)]
print(item)
random.shuffle(item)   #打乱顺序,注意这里是打乱原有列表,不是返回值是打乱的.返回为none
print(item)

 

两个小作业

# 1题:4位,全数字的随机验证码
# 2题:4位,数字与字母(不区分)相结合的随机验证码.

 

个解决思路如下:

p = random.random()
s = str(p)
m = s[2:6]
print(m)

lst = [i for i in range(10) ]
s = [chr(i)  for i in range(65,91)]
lst.extend(s)
lst_tmp =[]
for i in range(4):
    lst_tmp.append(random.choice(lst))
print(lst_tmp)

 

posted @ 2018-07-09 21:28  auxiaoliu  阅读(182)  评论(0编辑  收藏  举报