除非必須使用from版的import命令储耐,否則應(yīng)堅持使用常規(guī)版import命令。
e.g., from cmath import sqrt
這樣就無法使用math中的sqrt了刻撒。
PS:cmath是處理復(fù)數(shù)的模塊
__future__模塊
==用來檢查兩個對象是否相等,is用來檢查兩個對象是否為同一個(id是否相同)耿导;不要將id用于數(shù)字和字符串等不可變的基本值声怔,結(jié)果是未定義的。
e.g.,
>>> x = y = [1, 2]
>>> z = [1, 2]
>>> x == z? # True
>>> x is z? ? # False
from module import * 不會導(dǎo)入以下劃線打頭的名稱碎节,e.g.捧搞,如果定義了__all__公有接口,from copy import *導(dǎo)入的只有copy.__all__中的Error狮荔,copy和deepcopy胎撇,其他的模塊如PyStringMap需要顯式導(dǎo)入和使用。
源碼路徑
模塊的__file__指向代碼所在(python實現(xiàn)的才有)
>>> import copy
>>> print(copy.__file__)? # 打印出來的路徑即copy代碼文件所在
子類構(gòu)造函數(shù)與super()
子類重寫構(gòu)造函數(shù)時殖氏,需要調(diào)用超類的構(gòu)造函數(shù)晚树,以確保初始化基類所有的屬性。有兩種方法:調(diào)用未關(guān)聯(lián)的超類構(gòu)造函數(shù)雅采;使用super函數(shù)爵憎,后者更推薦,因為即使有多個超類也只要調(diào)用一次super就可以了婚瓜。
class Bird:
? ? def __init__(self):
? ? ? ? self.hungry = True
class SongBird(Bird):
? ? def __init__(self):
? ? ? ? Bird.__init__(self) # 方法一
? ? ? ? super().__init__()? # 方法二宝鼓,推薦
? ? ? ? self.sound = 'Squawk!'
property類
class Rectangle:
? ? def __init__(self):
? ? ? ? self.width = 0
? ? ? ? self.height = 0
? ? def get_size(self):
? ? ? ? ? retun self.width, self.height
? ? def set_size(self, size):
? ? ? ? ? self.width, self.height = size
? ? size = property(get_size, set_size)
? ? # 上一行創(chuàng)建了一個特性,并將名稱size關(guān)聯(lián)到這個特性巴刻。
>>> r = Rectangle()
>>> r.width = 10
>>> r.height = 5
>>> r.size? # 看起來就像普通屬性一樣
>>> r.size = 150, 100
pprint—比print打印效果可閱讀行強
>>> import sys, pprint
>>> pprint.pprint(sys.path)
推薦模塊放在site-packages目錄下愚铡。
告訴解釋器到哪里去查找模塊,辦法之一是直接修改sys.path胡陪,更標準的做法是將模塊所在目錄包含在環(huán)境變量PYTHONPATH中沥寥,如linux中在.bashrc中加入:
export PYTHONPATH=$PYTHONPATH:自定義目錄
包package
包含__init__.py和各個模塊文件(可以包含其他包)。
堆特征
堆中元素排列不是嚴格排序的柠座,但:位置i處的位置總是大于位置i // 2處的元素邑雅。heappop彈出最小的元素始終是索引為0的元素,并確保剩余元素中最小的那個位于索引0處(保持堆特征)妈经。
把普通列表變成heap使用heapify函數(shù)淮野。
雙端隊列
deque.rotate(n)? 默認n為1捧书,既執(zhí)行一次把最左邊的元素移到右邊,n>1則重復(fù)操作n次(并不是一次移動n個元素)骤星;n<0執(zhí)行方向變?yōu)閺挠疫呉苿幼筮叀?/p>
shelve
將數(shù)據(jù)存儲到文件中鳄厌,可以像字典一樣操作(key必須是字符串)。
存儲陷阱:
>>> s = sheve.open("test.dat")
>>> s['x'] = ['a', 'b', 'c']
>>> s['x'].append('d')? # 操作和返回的都是副本妈踊,所以'd'并未存儲到s['x']中。
解決方法:將副本賦給一個臨時list變量泪漂,修改臨時變量后再次存儲廊营。
>>> tmp = s['x']
>>> tmp.append('d')
>>> s['x'] = tmp
? ? ? ?