優化python程式的幾點建議

覆手為雲p發表於2017-07-21

 

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)

 

相關文章