摘要:總結以上這些在日常使用的時候如果不了解,很少會去用到,但如果想寫出優雅,簡潔的代碼,這些概念會起到一定的幫助作用參考
collections 數據類型
collections 數據類型主要是為了彌補 list /tuple / dict 的額外數據類型
ChainMap代碼:
import collections ## 賦值,合并字典的作用 a = {"a":"A"} b = {"b":"B"} m = collections.ChainMap(a,b) for k,v in m.items(): print("key: {} | value:{}".format(k,v)) print(m)
如果字典中有重復的key值
a = {"a":"A","b":"B"} b = {"b":"C"} m2 = collections.ChainMap(a,b) print(m2) for k,v in m2.items(): print("key: {} | value:{}".format(k,v))
輸出:
ChainMap({"a": "A", "b": "B"}, {"b": "C"}) key: a | value:A key: b | value:B
結論:
結果是沒有合并,如果只是合并字典的值,還是直接使用update即可, 這個模塊不怎么會用到,了解即可
Counter 顧名思義,就是計算總數的意思,可以計算出一個序列中每個元素的個數,一個簡單的例子
>>> import collections >>> collections.Counter("Hello World") Counter({"l": 3, "o": 2, "H": 1, "e": 1, " ": 1, "W": 1, "r": 1, "d": 1})
可以使用如下的寫法,來得到自己想要的元素的個數
>>> a = collections.Counter("Hello World") >>> a["W"] 1
除此之外,Counter對象還支持直接運算
import collections c1 = collections.Counter("Hello World") c2 = collections.Counter("Hello Python") print("c1 + c2 =",c1 + c2) print("c1 - c2 = ",c1 - c2) print("c1 | c2 = ",c1 | c2) print("c1 & c2 = ",c1 & c2)
輸出:
c1 + c2 = Counter({"l": 5, "o": 4, "H": 2, "e": 2, " ": 2, "W": 1, "r": 1, "d": 1, "P": 1, "y": 1, "t": 1, "h": 1, "n": 1}) c1 - c2 = Counter({"l": 1, "W": 1, "r": 1, "d": 1}) c1 | c2 = Counter({"l": 3, "o": 2, "H": 1, "e": 1, " ": 1, "W": 1, "r": 1, "d": 1, "P": 1, "y": 1, "t": 1, "h": 1, "n": 1}) c1 & c2 = Counter({"l": 2, "o": 2, "H": 1, "e": 1, " ": 1})defaultdict
眾所周知,當需要獲取一個字典的值,可以使用 xx[key] 這樣的形式去獲取,如果key值不存在,那么就會拋出一個錯誤,所以大部分推薦的做法是,使用 get 方法來獲取字典的值,比如:
test = {"a":"b"} test.get("a") # 如果獲取一個不存在的 key 值 test.get("b") # 返回None # 但是通過get 可以指定一個 key 值 test.get("b","this is b") # 返回 this is b
defaultdict 也差不多是這樣的道理,當你獲取一個不存在的 key 值的時候,返回默認值
import collections def default_value(): return "Default value" m = collections.defaultdict(default_value,foo="aaa") print(m["fxx"]) # 返回 Default valuedeque
雙端隊列,元素可以從兩端彈出,插入和刪除操作限定在隊列的兩邊進行
from collections import deque d = deque("abcdefg") print(d) # deque(["a", "b", "c", "d", "e", "f", "g"]) d.remove("c") print(d) # deque(["a", "b", "d", "e", "f", "g"]) d.append("h") print(d) #deque(["a", "b", "d", "e", "f", "g", "h"]) d.appendleft("1") print(d) #deque(["1", "a", "b", "d", "e", "f", "g", "h"]) # 使用pop 獲取隊列中的值 d.pop() print(d) # deque(["1", "a", "b", "d", "e", "f", "g"]) d.popleft() print(d) # deque(["a", "b", "d", "e", "f", "g"])
也可以使用線程來消費雙端隊列
from collections import deque import time import threading # deque 也可以用線程通信 d1 = deque(range(1000)) def task(direction,i,nextSource): while True: try: item = nextSource() print("方向:{} 線程: {} 正在處理: {} ".format(direction,i,item)) except IndexError as e: break else: time.sleep(1) right_ts = [threading.Thread(target=task,args=("right",i,d1.pop))for i in range(10)] left_ts = [threading.Thread(target=task,args=("left",i,d1.popleft)) for i in range(10)] for tl in left_ts: tl.start() for tr in right_ts: tr.start() for tl in left_ts: tl.join() for tr in right_ts: tr.join()OrderedDict
使用字典的時候,其輸出時,不一定按照當時添加的順序輸出,例如:
d = {} d["a"]= "A" d["b"] = 3 d["c"]= 1 d["d"]="B" d["c"]="C" for k,v in d.items(): print(k,"=>",v)
輸出:
a => A b => 3 c => C d => B
但是 OrderedDict 會
d = OrderedDict() d["a"]= "A" d["b"] = 3 d["s"]= 1 d["d"]="B" d["c"]="C" for k,v in d.items(): print(k,"=>",v)
輸出:
a => A b => 3 s => 1 d => B c => C
當需要使用dict 來作為運算和存儲的時候,這就是一個比較有用的特點了。
總結以上這些在日常使用的時候如果不了解,很少會去用到,但如果想寫出優雅,簡潔的代碼,這些概念會起到一定的幫助作用
參考《The Python3 Standard Library By Example》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42978.html
摘要:原生的也可以從頭部添加和取出對象就像這樣但是值得注意的是,對象的這兩種用法的時間復雜度是,也就是說隨著元素數量的增加耗時呈線性上升。 基本介紹 Python擁有一些內置的數據類型,比如str, int, list, tuple, dict等, collections模塊在這些內置數據類型的基礎上,提供了幾個額外的數據類型: namedtuple(): 生成可以使用名字來訪問元素內容的...
摘要:接下去完成與本機上數據庫的連接,這是一個異步函數,當連接完成之后,觸發執行其回調函數,參數指代這個數據庫本身。同樣是在完成數據庫連接的回調函數當中對這個對象進行操作。當完成修改操作之后觸發執行其回調函數,表示對修改結果的反饋。 一、node.js對于mongodb的基本操作 1、數據庫的開機 首先我們要先對數據庫進行開機的操作,建立一個文件夾用于存放數據庫文檔。如D:mongo,接下去...
摘要:以為例構造函數的內容構造函數的內部一般會做以下幾個操作各種給內部對象設置屬性。為什么呢源碼做出了解釋。在里面會調用用戶傳入的回調函數并觸發事件表示已經同步了。整個的源碼事實上就是這兩組東西。 1. 開場 強烈建議一邊看著源碼一邊讀本文章,本文不貼大段代碼。源碼地址。在寫backbone應用的時候,說實話,大部分的時間都是在寫這三個模塊的內容。關于這三個模塊的分析網上隨隨便便就能找到一堆...
摘要:掛機科了次使用這個結構,匿名函數就有了自己的執行環境或閉包,然后我們立即執行。注意,匿名函數的圓括號是必需的,因為以關鍵字開頭的語句通常被認為是函數聲明請記住,中不能使用未命名的函數聲明。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 20 篇。 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 如果你錯過了前面的章節,可以在這里找到它們: ...
閱讀 2830·2021-09-10 10:50
閱讀 2192·2019-08-29 16:06
閱讀 3196·2019-08-29 11:02
閱讀 1093·2019-08-26 14:04
閱讀 2803·2019-08-26 13:24
閱讀 2301·2019-08-26 12:16
閱讀 550·2019-08-26 10:29
閱讀 3094·2019-08-23 18:33