zoukankan      html  css  js  c++  java
  • 20 闭包、nonlocal

    闭包的概念

    闭包就是能够读取其他函数内部变量的函数。

    从模块级别调用函数内部的局部变量。

    闭包 = 函数+环境变量(函数外部的变量)

    闭包存在的条件

    • 闭包必须返回一个函数
    • 被返回的函数必须调用环境变量(上一层方法中的局部变量)

    python里一切皆对象,你甚至可以返回一个函数,把函数赋值给一个变量等。。。

    来看看这个闭包

    例子:

    def curve_pre():
        a = 25 # 此为环境变量,它在被返回的函数的外面
        def cureve(x):
            return a*x
        return cureve
    f = curve_pre() # 此时调用curve_pre返回的是一个闭包(函数+环境变量)
    print(f(2))
    结果:
    50

    闭包的相关方法 

    __closure__闭包方法:返回当前对象的函数的闭包对象:

    print(curve_pre().__closure__)或print(f.__closure__)
    结果:
    (<cell at 0x0000000000A73078: int object at 0x000000005273D1F0>,)

      

    打印闭包中的环境变量(外层函数的局部变量)

    print(f.__closure__[0].cell_contents)
    结果:
    25
    只有内部函数才能调用此方法,外层函数调用会报错

      

    闭包的意义

    闭包保存的是一个函数现场,它返回的不止是函数,还返回了该函数使用需要的环境变量。

    使用闭包可以尽可能少的不适用全局变量,使得功能的独立性得到保证。

     

    闭包中的nonlocal关键字

    nonlocal关键字声明的变量,它的值为环境变量的值(上一层函数的同名局部变量),但它并不是环境变量。

    改变它也不会改变环境变量。

    但它也区别于局部变量:它拥有记忆功能,它的值不会自动清零

  • 相关阅读:
    js/jsp常用记录(一)
    Oracle 存储过程的基本语法 及注意事项
    PL/SQL Developer使用技巧、快捷键
    Zookeeper的功能以及工作原理
    牛客网PAT练兵场-德才论
    牛客网PAT练习场-数素数
    牛客网PAT练兵场-D进制的A+B
    牛客网PAT练习场-个位数的统计
    牛客网PAT练习场-数字分类
    牛客网PAT练习场-A+B和C
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/11783024.html
Copyright © 2011-2022 走看看