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