主要内容:
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)