Python函数作用域和闭包

1.函数作用域:
函数内部的局部变量只在函数内部生效;
全局变量可以在函数内部访问,但若试图在函数内部修改全局变量,则Python会创建一个同名的局部变量代替;
若一定要在函数内部修改全局变量的值,可以使用global关键字。
>>>var = 'Hello'
>>> def fun2():
     global var
     var = 'Baby'
     print var
>>> fun2()
Baby
>>> print var
Baby

2.内嵌函数作用域:
python函数可以嵌套,但该内部函数除了其外部函数外,在外边或其它函数体都不能对其进行调用;
下面这样写会报错
def outside():
         print ('I am outside!')
         def inside():
                   print ('I am inside!')
inside()

正确的应该是:
def outside():
         print ('I am outside!')
         def inside():
                   print ('I am inside!')
         inside()
outside()
执行结果:
I am outside!
I am inside!

在嵌套函数中,若希望在内部函数修改外部函数的局部变量,在python3中可以使用nonlocal关键字;
def outside():
         var = 5
         def inside():
                   nonlocal var
                   var *= var
                   return var
         return inside()
>>>outside()
25

3.内嵌函数调用
不带参数内嵌函数:
访问inside()函数,写法一
def outside():
         def inside():
                   print ('*******')
         return inside()
直接调用outside()即可
写法二:
def outside():
         def inside():
                   print ('*******')
         return inside
需要用outside()()进行访问
------------------------------------
内嵌函数修改外部函数局部变量,python3写法:
def funX():
    x = 5
    def funY():
         nonlocal x
         x += 1
         return x
    return funY
a = funX()
print (a())      ->6
print (a())      ->7

python2写法:
def funX():
   x = [5]
    def funY():
         x[0] += 1
         return x[0]
    return funY
a = funX()
print (a())
print (a())

带参数内嵌函数(闭包):
def funX(x):
    def funY(y,z):
        return x*y*z
    return funY

print(funX(5)(8,2))
------------------------------------
def hellocounter(name):
    count = [0]
    def counter():
        count[0] += 1    # nonlocal count
        print 'Hello,'+name+','+str(count[0])+' access!'
    return counter
hello = hellocounter('rita')
hello()
hello()
hello()
hellocounter('rita')()
hellocounter('rita')()
hellocounter('rita')()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值