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)