檢查列表是否為空的最好方法 ?
a = [ ] # 如何檢查 a 是空列表良蒸?
if not a: # 用隱藏的空列表的布爾值才是最Pythonic的方法.
print ("List is empty")
if __name__ == "__main__":
是干嘛的?
有時(shí)你需要你寫的模塊既可以直接的執(zhí)行,還可以被當(dāng)做模塊導(dǎo)入到其他模塊中去.通過檢查是不是主函數(shù),可以讓你的代碼只在它作為主程序運(yùn)行時(shí)執(zhí)行,而當(dāng)其他人調(diào)用你的模塊中的函數(shù)的時(shí)候不必執(zhí)行.
在循環(huán)中獲取索引(數(shù)組下標(biāo))
ints = [8, 23, 45, 12, 78] # 如何獲取該列表的索引值喷斋?
最好的選擇就是用內(nèi)建函數(shù)enumerate
for idx, val in enumerate(ints):
print ( idx, val )
Python中的 appen 和 extend 區(qū)別此改?
x = [1, 2, 3]
x.append([4, 5])
print (x) # 輸出:[1, 2, 3, [4, 5]]
x = [1, 2, 3]
x.extend([4, 5])
print (x) # 輸出:[1, 2, 3, 4, 5]
extend
接受一個(gè)參數(shù)患久,這個(gè)參數(shù)總是一個(gè) list元咙,并且把這個(gè) list 中的每個(gè)元素添加到原 list 中另萤。
append
接受一個(gè)參數(shù)湃密,這個(gè)參數(shù)可以是任何數(shù)據(jù)類型,并且簡(jiǎn)單地追加到 list 的尾部四敞。
當(dāng)一個(gè)字典被創(chuàng)建了,能不能在字典里添加元素?好像沒有.add()
的方法.
In [28]: a = {'a':1}
In [29]: a['b'] = 1 # 只能賦值泛源,簡(jiǎn)單粗暴
In [30]: a
Out[30]: {'a': 1, 'b': 1}
在一行里獲取多個(gè)異常?
try:
# 可能錯(cuò)的地方
except (IDontLIkeYouException, YouAreBeingMeanException) as e:
pass # 用括號(hào)擴(kuò)起來(lái)
如何移除換行符?
試試rstrip
方法:
>>> 'test string\n'.rstrip() # 必須 \n 在最后
'test string'
同樣也有lstrip
和strip
方法:
>>> s = " \n abc def "
>>> s.strip()
'abc def'
>>> s.rstrip()
' \n abc def'
>>> s.lstrip()
'abc def '
鴨子類型
“當(dāng)看到一只鳥走起來(lái)像鴨子、游泳起來(lái)像鴨子忿危、叫起來(lái)也像鴨子达箍,那么這只鳥就可以被稱為鴨子∑坛”
我們并不關(guān)心對(duì)象是什么類型缎玫,到底是不是鴨子硬纤,只關(guān)心行為。
比如在python中赃磨,有很多file-like
的東西筝家,比如StringIO
,GzipFile
,socket
。它們有很多相同的方法邻辉,我們把它們當(dāng)作文件使用溪王。
又比如list.extend()
方法中,我們并不關(guān)心它的參數(shù)是不是list,只要它是可迭代的,所以它的參數(shù)可以是list
/tuple
/dict
/字符串/生成器等.
鴨子類型在動(dòng)態(tài)語(yǔ)言中經(jīng)常使用,非常靈活值骇,使得python不想java那樣專門去弄一大堆的設(shè)計(jì)模式莹菱。
為什么 Python 不支持函數(shù)重載?
在靜態(tài)語(yǔ)言中吱瘩,方法重載是希望類可以以統(tǒng)一的方式處理不同類型的數(shù)據(jù)提供了可能道伟。多個(gè)同名函數(shù)同時(shí)存在,具有不同的參數(shù)個(gè)數(shù)/類型搅裙,重載是一個(gè)類中多態(tài)性的一種表現(xiàn)皱卓。
而在動(dòng)態(tài)語(yǔ)言中,有鴨子類型部逮,如果走起路來(lái)像鴨子娜汁,叫起來(lái)也像鴨子,那么它就是鴨子兄朋。一個(gè)對(duì)象的特征不是由它的類型決定掐禁,而是通過對(duì)象中的方法決定,所以函數(shù)重載在動(dòng)態(tài)語(yǔ)言中就顯得沒有意義了颅和,因?yàn)楹瘮?shù)可以通過鴨子類型來(lái)處理不同類型的對(duì)象傅事,鴨子類型也是多態(tài)性的一種表現(xiàn)。
所以峡扩,并不太需要蹭越。
數(shù)據(jù)庫(kù)索引 (難)
聚集索引,非聚集索引,B-Tree,B+Tree,最左前綴原理
推薦: http://tech.meituan.com/mysql-index.html
MySQL索引背后的數(shù)據(jù)結(jié)構(gòu)及算法原理
Redis原理
Redis是什么?
- 是一個(gè)完全開源免費(fèi)的
key-value
內(nèi)存數(shù)據(jù)庫(kù) - 通常被認(rèn)為是一個(gè)數(shù)據(jù)結(jié)構(gòu)服務(wù)器教届,主要是因?yàn)槠溆兄S富的數(shù)據(jù)結(jié)構(gòu)
strings
响鹃、map
、list
案训、sets
买置、sorted sets
Redis數(shù)據(jù)庫(kù)
通常局限點(diǎn)來(lái)說,Redis也以消息隊(duì)列的形式存在强霎,作為內(nèi)嵌的
List
存在忿项,滿足實(shí)時(shí)的高并發(fā)需求。在使用緩存的時(shí)候,redis
比memcached
具有更多的優(yōu)勢(shì)轩触,并且支持更多的數(shù)據(jù)類型寞酿,把redis
當(dāng)作一個(gè)中間存儲(chǔ)系統(tǒng),用來(lái)處理高并發(fā)的數(shù)據(jù)庫(kù)操作
Redis 優(yōu)點(diǎn)
- 速度快:使用標(biāo)準(zhǔn)C寫怕膛,所有數(shù)據(jù)都在內(nèi)存中完成熟嫩,讀寫速度分別達(dá)到10萬(wàn)/20萬(wàn)
- 持久化:對(duì)數(shù)據(jù)的更新采用Copy-on-write技術(shù),可以異步地保存到磁盤上褐捻,主要有兩種策略掸茅,一是根據(jù)時(shí)間,更新次數(shù)的快照(save 300 10 )二是基于語(yǔ)句追加方式(Append-only file柠逞,aof)
- 自動(dòng)操作:對(duì)不同數(shù)據(jù)類型的操作都是自動(dòng)的昧狮,很安全
- 快速的主--從復(fù)制,官方提供了一個(gè)數(shù)據(jù)板壮,Slave在21秒即完成了對(duì)Amazon網(wǎng)站10G key set的復(fù)制逗鸣。
- Sharding技術(shù): 很容易將數(shù)據(jù)分布到多個(gè)Redis實(shí)例中,數(shù)據(jù)庫(kù)的擴(kuò)展是個(gè)永恒的話題绰精,在關(guān)系型數(shù)據(jù)庫(kù)中撒璧,主要是以添加硬件、以分區(qū)為主要技術(shù)形式的縱向擴(kuò)展解決了很多的應(yīng)用場(chǎng)景笨使,但隨著web2.0卿樱、移動(dòng)互聯(lián)網(wǎng)、云計(jì)算等應(yīng)用的興起硫椰,這種擴(kuò)展模式已經(jīng)不太適合了繁调,所以近年來(lái),像采用主從配置靶草、數(shù)據(jù)庫(kù)復(fù)制形式的蹄胰,Sharding這種技術(shù)把負(fù)載分布到多個(gè)特理節(jié)點(diǎn)上去的橫向擴(kuò)展方式用處越來(lái)越多。
Redis缺點(diǎn)
- 是數(shù)據(jù)庫(kù)容量受到物理內(nèi)存的限制,不能用作海量數(shù)據(jù)的高性能讀寫,因此Redis適合的場(chǎng)景主要局限在較小數(shù)據(jù)量的高性能操作和運(yùn)算上奕翔。
- Redis較難支持在線擴(kuò)容裕寨,在集群容量達(dá)到上限時(shí)在線擴(kuò)容會(huì)變得很復(fù)雜。為避免這一問題派继,運(yùn)維人員在系統(tǒng)上線時(shí)必須確保有足夠的空間帮坚,這對(duì)資源造成了很大的浪費(fèi)。
數(shù)據(jù)庫(kù)鎖機(jī)制 - 樂觀鎖與悲觀鎖
悲觀鎖:假定會(huì)發(fā)生并發(fā)沖突互艾,屏蔽一切可能違反數(shù)據(jù)完整性的操作
樂觀鎖:假設(shè)不會(huì)發(fā)生并發(fā)沖突,只在提交操作時(shí)檢查是否違反數(shù)據(jù)完整性讯泣。
參考文章