1. 程式人生 > >python3 defaultdict使用方法與實現原理

python3 defaultdict使用方法與實現原理

轉自: https://www.cnblogs.com/jidongdeatao/p/6930325.html

defaultdict類就好像是一個dict,但是它是使用一個型別來初始化的:

>>> from collections import defaultdict
>>> dd = defaultdict(list)
>>> dd
defaultdict(<type 'list'>, {})

defaultdict類的初始化函式接受一個型別作為引數,當所訪問的鍵不存在的時候,可以例項化一個值作為預設值:

>>> dd['foo']
[]
>>> dd
defaultdict(<type 'list'>, {'foo': []})
>>> dd['bar'].append('quux')
>>> dd
defaultdict(<type 'list'>, {'foo': [], 'bar': ['quux']})

需要注意的是,這種形式的預設值只有在通過dict.__getitem__(key)訪問的時候才有效,這其中的原因在下文會介紹。

>>> from collections import defaultdict
>>> dd = defaultdict(list)
>>> 'something' in dd
False
>>> dd.pop('something')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'pop(): dictionary is empty'
>>> dd.get('something')
>>> dd['something']
[]

defaultdict類除了接受型別名稱作為初始化函式的引數之外,還可以使用任何不帶引數的可呼叫函式,到時該函式的返回結果作為預設值,這樣使得預設值的取值更加靈活。下面用一個例子來說明,如何用自定義的不帶引數的函式zero()作為defaultdict類的初始化函式的引數:

>>> from collections import defaultdict
>>> def zero():
...     return 0
...
>>> dd = defaultdict(zero)
>>> dd
defaultdict(<function zero at 0xb7ed2684>, {})
>>> dd['foo']
0
>>> dd
defaultdict(<function zero at 0xb7ed2684>, {'foo': 0})

利用from collections import defaultdict strings = ('puppy', 'kitten', 'puppy', 'puppy','weasel', 'puppy', 'kitten', 'puppy') counts = defaultdict(lambda: 0) # 使用lambda來定義簡單的函式 for s in strings: counts[s] += 1

defaultdict類是如何實現的

通過上面的內容,想必大家已經瞭解了defaultdict類的用法,那麼在defaultdict類中又是如何來實現預設值的功能呢?這其中的關鍵是使用了看>>> from collections import defaultdict >>> printdefaultdict.__missing__.__doc__ __missing__(key) # Called by __getitem__ for missing key; pseudo-code: if self.default_factory is None: raise KeyError(key) self[key] =value = self.default_factory() return value

通過檢視__getitem__()方法訪問一個不存在的鍵時(dict[key]這種形式實際上是__missing__()方法獲取預設值,並將該鍵新增到字典中去。

關於Mapping Types — dict"一節。

文件中介紹,從2.5版本開始,如果派生自dict的子類定義了__missing__()方法取得預設值。

從中可以看出,雖然dict支援>>> print dict.__missing__.__doc__ Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError:

相關推薦

python3 defaultdict使用方法實現原理

轉自: https://www.cnblogs.com/jidongdeatao/p/6930325.htmldefaultdict類就好像是一個dict,但是它是使用一個型別來初始化的:>>> from collections import default

Spring方法注入的使用實現原理

# 一、前言   這幾天為了更詳細地瞭解``Spring``,我開始閱讀``Spring``的官方文件。說實話,之前很少閱讀官方文件,就算是讀,也是讀別人翻譯好的。但是最近由於準備春招,需要了解很多知識點的細節,網上幾乎搜尋不到,只能硬著頭皮去讀官方文件。雖然我讀的這個``Spring`

jQuery技術內幕:深入解析jQuery架構設計實現原理

源碼 att root 功能 技術內幕 瀏覽器 sel 緩存 callbacks jQuery源碼(jquery-1.7.1.js)的總體結構:(function( window, undefined ) {// 構造jQuery對象 var jQuery = (fun

PHP數組遍歷實現原理

aid undefined 普通 並不是 關聯 off 數組遍歷 按順序 reac 一維數組遍歷(普通) 一、for與foreach遍歷結果順序一致 $arr = array(‘max‘,‘xiaoli‘,‘xiaowang‘,‘laosan‘); //for遍歷 for(

簡單的RPC原型實現原理

存在的問題 客戶端硬編碼服務端的地址 引入註冊中心,方便服務的註冊與發現 註冊中心記錄的資訊:服務地址列表&服務節點權重 Zookeeper節點型別 臨時節點:客戶端。。 服務登出: tomcat關閉:設定伺服器的權重為0,隔絕後續請求 等待30S,處理完請求。。。

Uboot命令實現實現原理

1.實現過程 (1)在./common資料夾下新建cmd_study.c,並在此檔案中新增如下內容 #include<common.h> #include<command.h> int do_study (cmd_tbl_t *cmdtp, int fl

通過自己實現連結串列的增刪改查瞭解連結串列這些方法實現原理

連結串列:     連結串列和陣列都是線性表:         陣列:將元素順序地存放在一塊連續的儲存區內,元素間的順序關係由它們的儲存順序自然表示。      &n

Spring IoC 容器的設計實現原理

上一篇文章講解的是IOC的原理,這一篇文章主要講解Spring IoC 容器的設計與實現原理   1.spring的IOC容器 在 Spring IoC 容器的設計中,容器有兩個系列,可以看成是容器的具體表現形式: BeanFactory 簡單容器:實現了容器的基本

Hadoop技術內幕:深入解析MapReduce架構設計實現原理 (大資料技術叢書).epub

  【下載地址】 《Hadoop技術內幕:深入解析MapReduce架構設計與實現原理》內容簡介:“Hadoop技術內幕”共兩冊,分別從原始碼的角度對“Common+HDFS”和“MapReduce的架構設計和實現原理”進行了極為詳細的分析。《Hadoop技術內幕:深入解析M

Java——Integer類的方法實現,String和int的相互轉換

基本型別和包裝類的對應          以下的封裝類可以用於基本資料型別與字串的轉換                    byte             Byte          short            Short          int         

TiDB EcoSystem Tools 原理解讀(一):TiDB-Binlog 架構演進實現原理

簡介 TiDB-Binlog 元件用於收集 TiDB 的 binlog,並提供實時備份和同步功能。該元件在功能上類似於 MySQL 的主從複製,MySQL 的主從複製依賴於記錄的 binlog 檔案,TiDB-Binlog 元件也是如此,主要的不同點是 TiDB 是分散式的,因此需要收集各個 TiDB 例項產

QT5.5MYSQL5.6資料庫連線的具體方法實現

由於最近工作需要用到QT讀取資料庫中的資料,並將資料儲存至資料庫中。花了一天的時間,總算實現了從QT中讀取資料庫中的資料。網上相關資料很多,但是寫得不是很全,中間出現了一些問題,解決起來比較麻煩。所以本文從MYSQL下載、安裝,QT連線MYSQL儘可能寫詳細,若有不足,還請見

Spring 事務用法示例實現原理

關於事務,簡單來說,就是為了保證資料完整性而存在的一種工具,其主要有四大特性:原子性,一致性,隔離性和永續性。對於Spring事務,其最終還是在資料庫層面實現的,而Spring只是以一種比較優雅的方式對其進行封裝支援。本文首先會通過一個簡單的示例來講解Spring事務是如何

UE4移動元件詳解(一)——移動框架實現原理

前言 關於UE4的移動元件,我寫了一篇非常詳細的分析文件。由於篇幅比較大,我將其拆分成三個部分。分別從移動框架與實現原理,移動的網路同步,移動元件的優化與改造三個方面來寫。這三篇文件中難免有問題和漏洞,所以我也會在發現問題時及時更新和修改,也希望大家能給出一些

bind、call、apply的區別實現原理

const con ons 運行時 模擬實現 原理 支持 包裝 ofo 1、簡單說一下bind、call、apply的區別   三者都是用於改變函數體內this的指向,但是bind與apply和call的最大的區別是:bind不會立即調用,而是返回一個新函數,稱為綁定函數,

Docker 核心技術實現原理

提到虛擬化技術,我們首先想到的一定是 Docker,經過四年的快速發展 Docker 已經成為了很多公司的標配,也不再是一個只能在開發階段使用的玩具了。作為在生產環境中廣泛應用的產品,Docker 有著非常成熟的社群以及大量的使用者,程式碼庫中的內容也變得非常龐

Docker學習總結(29)——Docker核心技術實現原理

提到虛擬化技術,我們首先想到的一定是 Docker,經過四年的快速發展 Docker 已經成為了很多公司的標配,也不再是一個只能在開發階段使用的玩具了。作為在生產環境中廣泛應用的產品,Docker 有著非常成熟的社群以及大量的使用者,程式碼庫中的內容也變得非常龐大。同樣,由於

Docker 核心技術實現原理(轉載)

原文地址:https://draveness.me/docker 提到虛擬化技術,我們首先想到的一定是 Docker,經過四年的快速發展 Docker 已經成為了很多公司的標配,也不再是一個只能在開發階段使用的玩具了。作為在生產環境中廣泛應用的產品,Docker 有著非常成熟的社群以及大量的使用

二十五、併發程式設計之join應用實現原理剖析

1、join有什麼用呢? 當一個執行緒正在進行中的時候,如果我們想呼叫另外一個執行緒的話,這時我們可以使用join。 2、join方法的底層原理,簡單來說就是,join方法能把所呼叫join方法的執行緒進入休眠狀態(wait()),等執行完joinThread執行緒之後,會自動

簡析CAS機制實現原理

在學習CAS的過程中,我百思不得其解的一個問題就是在多cpu併發的環境下,CAS如何保證執行緒的安全性呢?關於這個問題下面的兩篇部落格寫的比較不錯,基本把其中的原理解釋清楚了,這裡我只作一個簡單的闡