一个简单Python例子理解闭包

理解了函数也可以返回以后,再来理解闭包会好些。 闭包就是绑定了变量的函数。如何理解这句话,老方法,我们通过一个课程讨论区答疑的例子来说明。

假设我们需要一个加法,它可以累加,就像统计网站的访问人数num。或者帖子评价的分数rate。不过分数是返回平均数,而访问人数是返回次数num,我们可以用一个参数isAvg来选择返回平均数还是返回次数。


# -*- coding: utf-8 -*-
#copyRight by heibanke
def accu_sum(**kwargs):
    if None is kwargs.get('rate'):
        raise ValueError('must need rate param')
    if None is kwargs.get('isAvg'):
        raise ValueError('must need isAvg param')
    if None is kwargs.get('num'):
        raise ValueError('must need num param')

    def sum(*args):
        ax = kwargs['rate']
        for n in args:
            ax = ax + n
            kwargs['num']+=1

        kwargs['rate'] = ax
        if kwargs['isAvg']:
            return ax/kwargs['num']
        else:
            return kwargs['num']
    return sum

if __name__=='__main__':
    favg = accu_sum(num=0, rate=0, isAvg=1)
    fnum = accu_sum(num=0, rate=0, isAvg=0)

    print favg(1, 2, 3, 4, 2)
    print favg(5, 4, 5, 4, 5)

    print fnum(1, 2, 3, 4, 2)
    print fnum(5, 4, 5, 4, 5)

大家不执行程序,看看能否推算出上面的程序会输出什么?