Python函数作用域和闭包

来源:互联网 发布:手机短信软件哪个好 编辑:程序博客网 时间:2024/06/08 17:14
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
原创粉丝点击