Python函数系列之嵌套及闭包(二)

  • 函数的嵌套python

在Python编程语言中,在函数体内建立另一个函数(对象,由于Python一切皆对象,函数其实也是对象)是彻底合法的,这种函数叫作内部/嵌套函数。编程

例子:闭包

# coding : utf-8
def outer():
    def inner():
        print("is Inner Method")
    print("Is outer Method")
    inner()

#调用outer函数
outer()
#调用outer()的内部函数,报错
# inner()

运行结果:编程语言

Is outer Method
is Inner Methodide

    inner()   #调用inner()时,出现以下错误
NameError: name 'inner' is not defined函数

  • 函数的闭包ui

何为闭包?对象

 若是在一个内部函数里,对在外部做用域(不是全局做用域)的变量进行引用,那么内部函数就被认为是闭包(closure)事件

 说的明了一点就是:在内部函数中,引用了外部函数的自由变量
utf-8

闭包的做用:

  • 保存函数的状体信息,使函数的局部变量信息能够保存下来,对于安装计算、隐藏状态是颇有用的

  • 在GUI或者在不少API支持回调函数的事件驱动编程中也有很用处

闭包有两种调用方式:

  1. 在内部直接调用

  2. 返回函数名称

e.g

 1.在内部直接调用

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

def outer(name):
    def inner(name):
        # name = "Mr.Zhang"  #这里的name值会覆盖调用outer函数实参的值,这是涉及变量在函数做用域的范围
        print("sub method :%s" %name)
        # 使用__closuer__内置属性来判断是不是一个闭包,返回地址,则是,返回None,则不是闭包函数
        print(inner.__closure__)
    inner(name)  #在内部直接调用
outer("GuiDo")

运行结果:

sub method :GuiDo
(<cell at 0x000001D2792EF7C8: function object at 0x000001D2793687B8>,)

e.g

2.返回函数名称

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

def sumer(num = 0):
    count = [num]
    def add():
        count[0] += 1
        return count[0]
    return add

f  = sumer(3)
print(f())
print(f())
print(f())

运行结果:

456

相关文章
相关标签/搜索