1. 程式人生 > 實用技巧 >函數語言程式設計——閉包與裝飾器

函數語言程式設計——閉包與裝飾器

閉包延伸了作用域的函式。

需求:

假如有個名為avg的函式,它的作用是計算不斷增加的系列值的均值;

使用類實現:

class Averager():
    def __init__(self):
        self.series=[]
    def __call__(self,new_value):
        self.series.append(new_value)
        total=sum(self.seires)
        return total/len(self.series)

>>>avg=Averager()
>>>avg(10)
10.0 >>>avg(11) 10.5 >>>avg(12) 11.0

函式式實現:

def make_averager():
    series=[]
    def averager(new_value):
        series.append(new_value)
        total=sum(series)
        return total/len(series)
    
    return averager
>>>avg=make_averager()
>>>avg(10)
10.0
>>>avg(11)
10.5

這種方法,需要將所有值儲存在一個列表中,然後每次呼叫的時候使用sum,更好的實現方式是隻儲存目前的總值和元素的個數。

def make_averager():
    count=0
    total=0

    def averager(new_value):
        nonlocal count,total
        count+=1
        total+=new_value
        return total/count