zoukankan      html  css  js  c++  java
  • Day 3-4 函数进阶

    1.名称空间

    定义:Python使用叫做命名空间的东西来记录变量的轨迹。命名空间是一个 字典(dictionary) ,它的键就是变量名,它的值就是那些变量的值。是存放变量和值的内存地址的绑定关系的空间.

    在一个 Python 程序中的任何一个地方,都存在几个可用的命名空间。
         1、每个函数都有着自已的命名空间,叫做局部命名空间,它记录了函数的变量,包括函数的参数和局部定义的变量。
         2、每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
         3、还有就是内置命名空间,任何模块均可访问它,它存放着内置的函数和异常。
    命名空间查找顺序
    当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:
         1、局部命名空间(locals):特指当前函数或类的方法。如果函数定义了一个局部变量 x,或一个参数 x,Python 将使用它,然后停止搜索。
         2、全局命名空间(globals):特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。
         3、内置命名空间(builtins):对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。
         4、如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常,如,NameError: name 'aa' is not defined。
     不同变量的作用域不同就是由这个变量所在的命名空间决定的
    嵌套函数的情况:
         1、先在当前 (嵌套的或 lambda) 函数的命名空间中搜索.(locals)
         2、然后是在父函数的命名空间中搜索(enclosing function)
         3、接着是模块命名空间中搜索(globals)
         4、最后在内置命名空间中搜索(builtins)

    上述的查找顺序就是:locals--->enclosing function--->globals--->builtins

     2.闭包

    定义:函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。

    1 def func1(x):
    2     def func2(y):
    3         print('x', x)
    4         print('y', y)
    5         return x + y
    6     return func2
    7 
    8 f = func1(3)
    9 print(f(88))

    闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域

  • 相关阅读:
    牛客网 剑指Offer JZ16 合并两个排序的链表
    牛客网 剑指Offer JZ15 反转链表
    牛客网 剑指Offer JZ14 链表中倒数最后k个结点
    牛客网 剑指Offer JZ12 数值的整数次方 经典快速幂
    牛客网 剑指offer-JZ10 矩形覆盖
    牛客网 剑指offer-JZ9 跳台阶扩展问题
    牛客网 剑指offer-JZ8 跳台阶
    牛客网 剑指offer-JZ7 斐波那契数列
    牛客网 剑指offer-JZ6 旋转数组的最小数字
    codility_ BinaryGap
  • 原文地址:https://www.cnblogs.com/lovepy3/p/8685717.html
Copyright © 2011-2022 走看看