zoukankan      html  css  js  c++  java
  • 函数对象、函数嵌套、名称空间与作用域、闭包函数、装饰器

    一.函数对象(把函数的内存地址当作变量值去使用)

    函数是第一类对象,函数可以当作数据传递,函数名对应的是函数的内存地址

    1.函数可以被引用

    2.函数可以作为参数传给另外的函数

    3.函数可以作为函数的返回值

              应用场景:1,2,3综合在一起的应用场景就是闭包函数

    4.函数可以作为容器类型的元素

              应用场景:当存在许多功能时,我们可以把每个函数作为一个字典当中的value值,当调用函数时,直接从字典当中去相应的函数即可。

    二.函数嵌套

    1.函数嵌套调用:在函数内又调用了其他函数

    2.函数嵌套定义:在函数内又定义了其他函数(只能在其函数内部调用,在其函数外部访问不到)

    三.名称空间

    名称空间:是用来存放名字与值绑定关系的地方

    分为三类:

    1.内置名称空间:python解释器自带的空间

    特点:在解释器启动时就生效,解释器关闭时失效

    2.全局名称空间:存放文件级别(顶头写的)的名字的地方,换句话说就是不在函数内的名字都存放在全局名称空间

    特点:在执行文件时生效,在文件结束或在文件执行期间被删除则失效

    3.局部名称空间:用来存放函数内定义的名字的地方

    特点:在调用函数时临时生效,函数结束则失效

     总结:

            1.加载顺序:内置名称空间-->全局名称空间-->局部名称空间

            2.查找名字的顺序是从当前位置往外查找,当前位置有可能在全局名称空间,也有可能在局部名称空间

            3.名称空间的嵌套关系是在函数定义阶段就固定死了,与调用位置无关

    四.作用域

    1.全局作用域:包含的是内置名称空间和全局名称空间的名字

    特点:在任何位置都能访问到,伴随程序的整个生命周期

    2.局部作用域:包含的是局部名称空间的名字

    特点:1.只能在函数内使用,2.调用函数时生效,函数结束时失效

    3.global与nonlocal:

      global:明确声明要使用全局作用域的名字

      nonlocal:明确声明要使用外层函数局部作用域中的名字

    五.闭包函数

    闭:指的是定义在函数内部的函数

    包:该内部函数包含对外层函数作用域名字的引用

    闭包函数:定义在函数内部的函数,并且该函数包含对外部函数作用域中名字的引用(打破了层级的限制)

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

    注意:作用域关系:在函数定义阶段就规定死了,与调用位置无关

    def outter():

        x=1

        def inner():

            print(x)

        return inner

    f=outter()

    f()

    六.装饰器

    1.什么是装饰器

    装饰器指的是为被装饰对象添加新功能的工具

    装饰器本身可以是任意可调用对象

    被装饰对象也可以是任意可调用对象

    2.为何要用装饰器

    软件一但上线,就必须遵循开放封闭的原则

    开放封闭原则:对修改封闭,对扩展的功能开放

    装饰器实现的原则:

         1.不能修改被装饰对象的源代码

         2.不能修改被装饰对象的调用方式

    装饰器的目的:在遵循1、2的前提下,为被装饰对象添加新的功能

    3.装饰器语法糖

    在被装饰对象的正上方,单独一行,用@加上装饰器的名称,就可以为被装饰对象加上装饰器,相当于把被装饰对象的函数名作为参数传给装饰器,然后装饰器的返回值再赋值给被装饰对象的函数名。

    def outter(func):

        def inner(*args,**kwargs):
             代码块

             res=func(*args,**kwargs)

             return res

    return inner

    @outter

    def index():

         代码块

    index()

  • 相关阅读:
    Java实现 N的阶乘
    Java实现 N的阶乘
    Java实现 N的阶乘
    Java实现 N的阶乘
    Java实现 洛谷 P1015 回文数(N进制回文数)
    Java实现 洛谷 P1015 回文数(N进制回文数)
    Java实现 洛谷 P1015 回文数(N进制回文数)
    Java实现 洛谷 P1015 回文数(N进制回文数)
    Java实现 洛谷 P1015 回文数(N进制回文数)
    Windows线程生灭(图文并茂)
  • 原文地址:https://www.cnblogs.com/wangke0917/p/10034508.html
Copyright © 2011-2022 走看看