zoukankan      html  css  js  c++  java
  • day11 闭包函数和装饰器

    1.函数不是新知识点 主要是学习函数的用法

    在面向对象编程中,一切皆对象,函数也不例外

    具体的表现

    1.函数可以引用

    2.函数可以作为函数的参数

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

    4.可以被存储到容器类型中

    def func1():

      pass

    a=func() 

    def func(func):

      func()

    func2(func1)

    def func3():

      return func1

    def fun5():

      print('func5 run')

    li2 = [func5]

    li2[2]()

    2.函数的嵌套

    1.定义的嵌套,在一个函数的定义内再定义函数

    def f1():

      print('f1')

      def f2():

        print('f2') 

      f2()

    f1()

    2.嵌套的调用,先定义好函数,在其他函数体内调用

    def f1():

      print('f1')

    def f2():

      print('f2')

      f1()

    f2()

    名称空间就是一个字典,专门存储名称的空间,不仅存储名字,还要知道内存地址

    名称空间分类

    1.内置名称空间,存储解释器的一些名称与值的对应关系

    (python 解释器启动时创建,所有代码全部执行完毕,关闭解释器时销毁)

    2.全局名称空间  文件级别的名称,只要你的名字的定义是顶着最左边写的就是全局空间

    (执行py文件时创建全局名称空间,所有文件中的代码全部执行完毕,关闭解释器时销毁)

    除了内置和函数内,都在全局名称空间中

    3.局部名称空间:只要是在函数内的名称都是局部的

    (调用函数时创建,函数执行完毕就销毁)

    名称空间的加载顺序

    内置-》全局-》局部

    名称的查找顺序

    局部-》全局-》内置的

    3.作用域

    域就是范围的意思

    全局名称空间和内置名称空间,在使用上没有区别

    局部的和全局/内置的就有区别了:局部定义的只能在局部使用

    给三个空间划分范围

    全局的内置的可以划分为同一个范围

    global表示全局范围,就是所谓的全局作用域

    局部的单独划分为一个范围

    local局部作用域

    查看全局作用域的内容globals()

    查看局部作用域的内容 注意,你在全局作用域使用locals看到的就是全局的内容,域glaobals没有区别

    函数locals()

    a = 'aasdasd'

    print()

    查看全局作用域中的内容

    print(dir(globals()["__builtins__"]))

    查看局部作用域中的内容 注意 你在全局中使用locals 看到的就是全局的内容,与globals没有区别

    关键字

    global #声明要使用全局中的变量名

    nonlocal #明确声明 要使用上一层的a,如果上一层没有,则找上上层,但是注意,不能找全局中的

    age=18

    def func2():

      #明确声明 要使用全局中的age

      global age

      age = 19

      print(age)

    fun2()

    print(age) #因为局部名称空间中用了global,所以直接用的全局变量age,直接被修改了

    def f1():

      #age = 19

      def f2():

        nonlocal age #会报错,因为往上层找没有找到age

        print(age)

      f2()

    f1()

    print(age)

    4.闭包函数

    如下就是一个闭包函数

    def fun1():

      age = 18

      def inner():

        print('hello')

        print(age)

      在返回这个内部的函数时 不是单纯的返回函数 还把函数中访问的局部名称一起打包了

      相当于将内部函数域访问的数据打包在一起了 闭包这个名字就是这么得来的

      return inner

    f=fun1()

     函数的作用域在定义时就固定了,与调用的位置没有关系

    闭包函数的模版

    def fun2():

      a = 1

      b=10

      def inner():

        print(a)

        print(b)

        print(c)

      return inner

    f = fun2()

    #__closure__用于访问闭包函数 打包的数据

    什么是闭包函数

    1.定义在另一个函数内的函数

    2.内部的函数访问了外部的名称(数据) 注意 不包含全局的

    5.装饰器

    什么是装饰 给一个已有的对象(一个函数)添加新的功能

    为什么要装饰:为了 增强功能

    器:指一个工具,在python中,值得是具备某个功能的函数

    简单的说:装饰器是一个用于其他函数增加功能的函数

    开闭原则

    指的是对扩展开放,对修改封闭(可以添加新功能,但不能修改原代码和代码的调用方式)

    用户程序的用户

    用框架的用户

    print(time.time())返回一个时间戳,指的是1970年1月1日(unix元年)到现在一共经过的秒数

    mac是Linux 内核,linux是unix的一个分支

    装饰器和闭包函数的关系:装饰器是一种设计代码的套路(不修改源代码和调用方式的情况下,增加功能)

    要完成装饰器就需要使用闭包函数

    装饰器不是闭包,闭包也不是装饰器,只是通过闭包函数完成装饰器的设计

    把旧功能的函数传进闭包函数,加好新功能,返回闭包函数,这样在下次调用时,其实是在调用改版的旧函数

    装饰模式

    def otter(func):

      def inner():

        在调用原始函数前,添加新功能  

        func()

      return inner

    download = otter(download)

    download()

    既遵守了开闭原则,又添加了新功能

  • 相关阅读:
    Python之路【第八篇】(一)python基础 之计算机操作系统发展史
    Python之路【第六篇】python基础 之异常处理
    Python之路【第七篇】python基础 之socket网络编程
    Python之路【第六篇】python基础 之面向对象进阶
    Python之路【第六篇】python基础 之面向对象(一)
    Fastdfs 部署干货
    Mysql 优化配置2
    Elk 进阶部署
    Elk
    python pickle
  • 原文地址:https://www.cnblogs.com/shanau2/p/10034624.html
Copyright © 2011-2022 走看看