• PYTHON-函数对象,嵌套,名称空间与作用域,闭包函数



    一 函数是第一类对象,即函数可以当作数据传递
    1 可以被引用
    2 可以当作参数传递
    3 返回值可以是函数
    3 可以当作容器类型的元素

    def foo():
    return len

    f = foo
    print(foo)
    [foo, ]

    函数嵌套(把大问题细分成小问题,把小问题平道一起解决)
    函数的嵌套定义: 在函数内部又定义了其他函数
    函数的嵌套调用:在一个函数内部又调用其他函数


    2.名称空间与作用域:
    什么是名称空间?
    名称空间:存放名字的地方,三种名称空间,
    (之前遗留的问题x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方)

    名称空间Namespaces:指的就是存放名字与内存地址绑定关系的地方(内存空间)

    名称空间分为三大类
    内置名称空间: 存放的是python解释器自带的名字
    产生:python解释器的启动则产生
    销毁:python解释器关闭则销毁

    全局名称空间: 在顶级定义的名字
    产生:执行python程序时产生
    销毁:python程序执行完毕后则销毁

    局部名称空间: 在函数内定义的名字
    产生: 在函数调用时临时产生
    销毁: 在函数调用完毕后则销毁

    三种名称空间的产生的先后顺序: 内置->全局->局部

    查找名字的顺序:从当前位置往外一层一层查找
    如果当前在局部名称空间: 局部->全局->内置
    如果当前在全局名称空间: 全局->内置

    需要注意的是:在全局无法查看局部的,在局部可以查看全局的,如下示例
    # max=1
    def f1():
    # max=2
    def f2():
    # max=3
    print(max)
    f2()
    f1()
    print(max)

    作用域:
    #1、作用域即作用范围
    - 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效
      - 局部范围(局部名称空间属于该范围):临时存活,局部有效

    全局作用域:包含内置与全局名称空间的名字
    特点:全局存活,全局有效
    局部作用域:包含局部名称空间的名字
    特点:临时存活,局部有效

    #2、!!!!!作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关,如下
    x=1
    def f1():
    def f2():
    print(x)
    return f2
    x=100
    def f3(func):
    x=2
    func()
    x=10000
    f3(f1())

    #3、查看作用域:globals(),locals()
    locals 是函数内的名字空间,包括局部变量和形参
    globals 全局变量,函数定义所在模块的名字空间


    global与nonlocal关键字
    global 适用于函数内部修改全局变量的值
    nonlocal 适用于嵌套函数中内部函数修改外部变量的值
    如果没有使用以上关键字,对全局变量或者外部变量进行修改,python会默认将全局变量隐藏起来




    4.闭包函数 = 函数对象 + 函数嵌套定义 + 作用域
    闭包函数指的是定义在函数内部的函数,
    并且该内部函数包含对外层函数作用域名字的引用
    def outter(x):
    def inner():
    print(x)
    return inner

    f = outter(10)


    #闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,
    这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
    #应用领域:延迟计算(原来我们是传参,现在我们是包起来)
    from urllib.request import urlopen

    def index(url):
    def get():
    return urlopen(url).read()
    return get

    baidu=index('http://www.baidu.com')
    print(baidu().decode('utf-8'))
  • 相关阅读:
    由wifi吞吐量问题联想到的分治思维
    总结----调试问题套路(经验)
    常用指令备忘录----持续更新
    【mark】OS是否使用svc方式分开系统空间和用户空间的优劣
    转载----五种开源协议(GPL,LGPL,BSD,MIT,Apache)
    rt-thread 动态装载实现、优化
    转:嵌入式: jffs2,yaffs2,logfs,ubifs文件系统性能分析
    gcc ld 链接器相关知识,调试指令(程序员的自我修养----链接、装载与库)
    HTML5与CSS3经典代码
    jquery mobile上传图片完整例子(包含ios图片横向问题处理和C#后台图片压缩)
  • 原文地址:https://www.cnblogs.com/du-jun/p/9767710.html
Copyright © 2020-2023  润新知