返回函数

闭包:
在函数A中又定义了函数B,并且,内部函数B可以引用外部函数A的参数和局部变量,当A返回函数B时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。

利用闭包返回一个计数器函数,每次调用它返回递增整数:

第一种方法:

# -*- coding: utf-8 -*-

def createCounter():
    n=0
    def counter():
        nonlocal n              #必须加nonlocal
        n=n+1
        return n
    return counter

# 测试:
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
    print('测试通过!')
else:
    print('测试失败!'

总结:

这段代码如果不加nonlocal,会报错,这是因为对于createCounter函数,n是局部变量,对于counter函数,n是非全局的外部变量。当在counter中对n进行修改时,会将n视为counter的局部变量,屏蔽掉createCounter中对n的定义;如果仅仅在counter中对n进行读取,则不会出现这个错误。

 

而写成列表则不会报错了, 改变列表L中第一个元素的值,但并没有改变列表L的内存地址。

第二种方法:

def createCounter():
    L=[0]               # 列表L的内存地址在初次调用时已经给定,且L[0]即第一个元素指向整数0
    def counter():      
        L[0]+=1    #改变列表L中第一个元素的值,但并没有改变列表L的内存地址
        return L[0]
    return counter

  

 

 

 

 

转载于:https://www.cnblogs.com/zuxing/p/8971082.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值