Fluent Python —— Data Model初探
本系列旨在記錄自己在閱讀Fluent Python一書(shū)過(guò)程中的問(wèn)題和思考。

什么是Data Model?
數(shù)據(jù)模型,其實(shí)是對(duì)Python自身框架的描述,它規(guī)范了這門(mén)語(yǔ)言構(gòu)建自身模塊的接口。
比如構(gòu)建上下文管理器,會(huì)涉及到__enter__和__exit__方法,構(gòu)建一個(gè)可變序列時(shí),
會(huì)涉及到__setitem__,__delitem__,__iadd__等方法。它們一步一步逐層抽象,最后
變成我們更為熟知,同時(shí)使用起來(lái)也更方便的如len()、abs()等方法。

內(nèi)置序列類型概覽
按容納類型:
容器序列
list、tuple、collections.deque,這些序列能存放不同類型的數(shù)據(jù)。
容器序列中存放的實(shí)際上是任意類型的引用。
扁平序列
str、bytes、bytearray、memoryview和array.array等,這些只能容納一種類型。
扁平序列中存放的是值,其實(shí)它是一片連續(xù)的內(nèi)存空間,因此也就顯得更加緊湊。
按是否可修改:
可變序列和不可變序列。顧名思義,不再贅述。

Listcomps & Genexps
這倆可以說(shuō)是非常Pythonic風(fēng)格的“黑魔法”。在日常寫(xiě)代碼的時(shí)候,如果多用列表推導(dǎo)式和
生成器表達(dá)式,那么將會(huì)大大提高代碼的可讀性,并且也能提高運(yùn)行速度。
以下示例摘自Fluent Python:
如果用 listcomps的風(fēng)格,一行代碼搞定!

Genexps的語(yǔ)法和Listcomps的語(yǔ)法很類似,區(qū)別在于一個(gè)是中括號(hào),一個(gè)是小括號(hào)。
但是這二者來(lái)說(shuō),Genexps要更優(yōu)于Listcomps,因?yàn)樯善鞅磉_(dá)式遵循迭代器協(xié)議,
它可以逐個(gè)產(chǎn)出元素,而不是:先建立一個(gè)列表,再將這個(gè)列表傳遞到某個(gè)構(gòu)造函數(shù)里。
顯然,前者更節(jié)省內(nèi)存。

下期,繼續(xù)探究?jī)?nèi)置序列類型——元組