1、在需要只讀序列時,最好使用元組而非列表;
2、使用生成器yield,而不是建立大的元組和列表並在其上進行迭代處理;
3、儘量使用python內建的資料結構,而不實現自己的自定義結構;
4、從小字串中產生大字串時,不要對小字串進行連線,而是在列表中累積,最後將字串列表結合成一個單獨的字串;
5、如果某個物件需要多次使用屬性訪問,或從某個資料結構中進行訪問,那麼較好的做法是建立並使用一個區域性變數來訪問物件。
6、可使用字典對多個類似的elif分支進行簡化;
functions=dict(a=add,b=edit,l=list)
functions[recieve]() 其中add(),edit(),list()為函式名,recieve為接收的引數;
7、開啟讀寫檔案用上下文管理器with語句;
下面是對python複雜語法的一點補充:
1、動態程式設計與內省函式:
1 __import__() 根據模組名匯入模組; 2 delattr(obj,name) 從物件obj中刪除名為name的屬性; 3 getattr(obj,name,val) 返回物件obj中名為name的屬性值,如果沒有這一屬性,並且給定了val引數,就返回val; 4 setattr(obj,name,val) 將物件obj中名為name的屬性值設定為val,必要時候建立該屬性; 5 hasattr(obj,name) 如果物件obj中有名為name的屬性,就返回True; 6 locals() 返回當前本地上下文的字典; 7 globals() 返回當前全域性上下文的字典; 8 type(obj) 返回物件obj的型別物件; 9 vars(obj) 以字典形式返回物件obj的上下文,如果沒有給定obj,就返回本地上下文;
2、修飾器
修飾器是一個函式,接受一個函式或方法作為其唯一的引數,並返回一個新函式或方法。
一個簡單的修飾器函式:
1 def positieResult(function): 2 def wrapper(*args,**kwargs): 3 result=function(*args,**kwargs) 4 assert result>=0,function.__name__+"()result isn't>=0" 5 return result 6 wrapper.__name__=function.__name__ 7 wrapper.__doc__=function.__doc__ 8 return wrapper
也可用functools模組的wraps函式來取代最後對函式的同步語句:
@functools.wraps(function)
def wrapper(*args,**kwargs):
...
也可在此函式的外國再包一層函式來給修飾器增加可傳遞引數。
3、def a() ->bool:
suite
表示對函式使用時加註釋(3.5後加的新功能)
4、函子另一種包含了特殊方法__call()__的類。它提供的一個關鍵好處就是可以維護一些狀態資訊。
閉包:
def make_strip_function(characters): def strip_function(string): return string.strip(characters) return strip_function
使用方法:
strip_a=make_strip_function(',:;.!?') strip_a('ladys!') #returns:'ladys'
相當於二次傳參,下面的函子具有相同的功能和用法
class Strip: def __init__(self,characters): self.characters=characters def __call__(self,string) return string.strip(self.characters)