zoukankan      html  css  js  c++  java
  • 函数对象,名称空间,作用域,闭包函数

    """
    函数嵌套:
    嵌套是一个物体里套着另一个物体,函数嵌套就是一个函数中还有另一个函数
    嵌套调用
    指的是,在函数的执行过程中调用了另一个函数
    其好处是,可以简化外层大函数的代码,使得结构更清晰,
    可以将一个大的复杂的功能拆分为多个简单的小功能

    嵌套定义
    指的是,在函数的函数体中定义了另一个函数
    需要注意的是:内部定义的函数,只能在内部使用,外界无法直接访问
    唯一的使用场景就是闭包函数,除此之外不要这么写

    名称空间
    名称空间就是存放名称的内存空间,namespace
    名称空间的分类
    内置名称空间:存的是解释器内置的名称空间,例如len,print等,在解释器启动的时候,就启动了。
    特点:在解释器启动就一直有效。
    生命周期:解释器启动就有效,解释器关闭无效。
    全局名称空间:存的是文件里顶端的名称,顶端就是没有缩进的名称,例如定义x=10之类的,
    要注意的是,如果if,while,with前面没有缩进的话,那么它们里的也是全局名称。
    特点:在文件运行时一直有效
    生命周期:文件程序运行时开始生效,结束时无效。
    局部名称空间:存放的是函数内定义的名称。
    特点:仅在调用函数时生效
    生命周期:调用函数时生效,调用结束后失效。
    名称空间的加载顺序:内置-->全局-->局部
    名字的查找顺序:局部-->全局-->内置/全局-->内置

    作用域
    域是范围,区域,作用域就是作用的范围,区域。就是名字的有效范围.
    作用域分为两种:
    全局作用域:
    在内置名称空间与全局名称空间内的名字,能被所有位置访问,根据访问位置就称之为全局作用域。
    全局作用域包含内置名称空间与全局名称空间
    局部作用域:
    局部名称空间的名字只能在当前的函数中访问,所以它单独划到一个范围中,
    这个范围称之为局部作用范围即局部作用域

    global(全局) 与 nonlocal(不使用本地) 关键字
    global是将局部作用域的名字定义更改到全局中
    nonlocal是将当前层函数的名字定义到上一层函数体中去,不能定义到全局。

    函数对象
    没有新技术点
    目的是为了让你知道 函数都可以怎么来使用

    函数是第一类对象:
    1.可以被调用
    2.可以当成容器类的元素使用
    3.可以当函数的参数
    4.可以当函数的返回值
    函数名除了可以调用之外与一个变量名,没有本质区别,变量能怎么用函数名就能怎么用

    闭包函数:
    闭包函数就是将一个函数关闭,包装起来。一个函数被另一个函数包裹
    闭包函数也是一种函数。
    特点:
    1.该函数是定义在另一个函数的中的
    2.该函数包含了对外层函数中名字的引用,无论在任何位置使用这个函数,其都包含了外部名字引用
    满足以上两条 就称之为闭包函数

    需要注意的是:名字所在的作用域 在函数定义阶段就已经固定了,与调用位置无关

    现阶段 可以将闭包理解为 另一种为函数体传值的方式
    之前只能通过参数给函数传值
    现在可以通过闭包的方式

    """

    #函数嵌套的代码使用:
    def f1():
    def f2():
    pass
    f1()
    f2()#会报错,不能直接访问到嵌套的函数,需要通过返回值来访问

    #名称空间
    print(len)#内置名称空间
    x=10#全局名称空间
    def f1():
    x=10#局部名称空间


    #作用域 global(全局) 与 nonlocal(不使用本地) 关键字
    a=100
    def func():
    global a
    a=10
    func()
    print(a) # a=10

    a=100
    def func():
    a=500
    def func1():
    nonlocal a
    a=250
    func1()
    print(a) #a=250
    func()
    print(a) #a=100



    #闭包函数
    def func():
    def func1():
    print(1+1)
    return func1
    res=func()
    print(res) #<function func.<locals>.func1 at 0x000001C68CA928C8>
    res() #2
  • 相关阅读:
    Asp.net2.0页面执行顺序 朱燚:
    通过对比学Python(2):集合对象 朱燚:
    通过比较学python(3):字典类,字符串 朱燚:
    [模版项目]怎样用企业服务实现跨进程缓存 朱燚:
    [轻松一下]世界上至少有10種東西是你不知道的 朱燚:
    评:我从编程中悟出八个字(不算原创,不过希望让大家能看看) 朱燚:
    从追MM谈Java的23种设计模式 朱燚:
    学习笔记_Redis 数据类型02
    MongoDB.Driver 中通过管道(Aggregate)实现分组功能查询出符合条件的数据
    MongoDB.Driver 中实现参数动态查询
  • 原文地址:https://www.cnblogs.com/xiezuodd/p/10268259.html
Copyright © 2011-2022 走看看