python内部函数的定义跟闭包的定义

 

内部函数

在函数内部声明的函数就是内部函数

  1. 内部函数的本质就是局部变量(函数就是一个变量)
  2. 内部函数在函数外部不可以直接调用
  3. 内部函数可以在函数内部调用(必须要定义内部函数之后才能使用)

 

格式:

def 函数名():
    局部变量...
    def 内部函数名():
        Python功能代码...

#########################################


示例:

def funName():
    name = 'dragon'
    #定义一个内部函数
    def inner():
        print('我是内部函数')

 

 

 

闭包

使用特定或特殊的方式,将局部函数(局部变量)引入到全局环境中使用,这就是闭包操作

 

闭包的优缺点

优点:

  1. 可以方便的进行函数式编程,组织程序代码
  2. 使内部函数和局部变量在外部可以访问

缺点:

  1. 闭包操作会导致整个函数的内部环境,被长期占用保存,占用大量内存

 

闭包环境查看

__closure__

用于查询当前闭包操作所使用的环境中的变量和内部函数信息

二个下划线closure二个下划线

print(asno.__closure__)

 

声明闭包的二种方式

闭包方式1:

def 函数名():
    局部变量...
    def 内部函数名():
        pass
    return (局部变量,内部函数...)

 

闭包方式2:

def 函数名():
    局部变量
    def 内部函数名():
        pass
    #获取所有需要进行闭包操作的函数和变量
    defall():
        return(局部变量,内部函数...)
    return all

 

实例:

内部局部调用法

实例:
def home():
    mo = "身上一共1024现金"
    mi = "手中有一部手机"
    def so():
        print('开着一辆车')
    def sm():
        print('带着一个背包')
    def www():
        print('我想来一场说走就走的旅行')
        return (so,sm,mi,mo)
    return www
qn = home()
qs = qn()
soq = qs[0]
smq = qs[1]
moq = qs[2]
miq = qs[3]
soq()
smq()
print(moq)
print(miq)

结果:
我想来一场说走就走的旅行
开着一辆车
带着一个背包
手中有一部手机
身上一共1024现金

 

局部变量global调用法

实例:

so = 0

def ss():
    global so
    mi = 1024
    mo = 520
    def df():
        print(1314)
    def de():
        print(88888)
    so = (mi,mo,df,de)
ss()
print(so)
miq = so[0]
moq = so[1]
dfq = so[2]
deq = so[3]
print(miq)
print(moq)
dfq()
deq()

结果:

(1024, 520, .df at 0x014DA4B0>, .de at 0x014DA4F8>)
1024
520
1314
88888

 

nonlocal关键字

nonlocal关键字的意义,不是局部变量,当然他也不是全局变量,通常用于内部函数中使用外部函数的局部变量

  1. 如果内部函数想使用全局变量,那么应该使用global声明(函数最外层的全局变量)
  2. 如果内部函数使用的是外部函数的局部变量,那么应该使用nonlocal声明(内部函数的外层,外部函数的局部变量)
#声明一个外部函数
def outer():
    #声明一个变量(肯定不是全局变量)
    x = 5
    #声明一个内部函数
    def inner():
        nonlocal x  #声明x不是局部变量
        x += 9
        print(x)
    #调用函数
    inner()
#调用outer
outer()

 闭包简单来说,就是把函数中的变量,变成这个函数中的上一级函数的变量,适用于多层函数中

 

 

 

转载请注明原文链接:python内部函数的定义跟闭包的定义

发表评论:

共有 0 条评论

 Top