zoukankan      html  css  js  c++  java
  • python3闭包

    一、函数的基本概念

      def  func_name():

      输出变量:a = '2'

           print(a)

      输出函数:print func_name()    在这块函数输出一定要加上()

        函数都有显性返回值,保证代码的完整性和可维护性,一定要返回一下。

      一、函数作用域的LEGB:L>E>G>B

      L(local):函数内部作用域。

      E(enclosing):函数内部与内嵌函数之间,主要是内嵌函数对内部函数变量的引用,这时候就成为闭包。

      G(global):全局作用域,所定义的全局变量就作用于全局作用域。

      B(build-in):python默认导入的一些变量,如list,tuple,max等等。

      LEGB的原则:L>E>G>B  

      二、闭包(closure)的概念

      closure:内部函数中对enclosing作用域的变量进行引用,内部函数就称作闭包。

      函数实质与属性:

      1、函数是一个对象,这个对象在内存中有存储空间。

      2、函数执行完成后内部变量被python解释器回收,如果中间产生变量并且这个变量返回,则这个变量不被回收。

      代码一(python中一切都是对象,我们可以直接把函数返回):

     1 #coding:utf-8
     2 passline = 60
     3 def func(val):
     4     passline = 90
     5     if val >= passline:
     6         print("pass")
     7     else:
     8         print("failed")
     9     def in_func():
    10         print(val)
    11     in_func()
    12     return in_func
    13 
    14 f = func(89) #f用来接收返回值
    15 f()#in_func
    16 
    17 运行结果:
    18 failed
    19 89

       代码二: 

     1 #coding:utf-8
     2 def func_150(val):
     3     passline = 90
     4     if val >= passline:
     5         print("pass")
     6     else:
     7         print("failed")
     8 def func_100(val):
     9     passline = 60
    10     if val >= passline:
    11         print("pass")
    12     else:
    13         print("failed")
    14         
    15 func_150(89)
    16 func_100(89)
    17 
    18 运行结果:
    19 failed
    20 pass

       代码三(同代码二): 内部函数引用了外部函数的passline,这就是闭包。f_100用来接收set_passline的返回值,(type(f_100)) 的返回值是function类型,所以还需要对(type(f_100)) 进行调用。也可以直接通过set_passline(60)(89)进行调用。

     1 #coding:utf-8
     2 def set_passline(passline):
     3     def cmp(val):
     4         if val >= passline:
     5             print("pass")
     6         else:
     7             print("failed")
     8     return cmp #返回的是一个函数        
     9         
    10 f_100 = set_passline(60)
      print(type(f_100))
    11 f_150 = set_passline(90) 12 f_100(89) 13 f_150(89) 14 15 运行结果:
      <class 'function'>
    16 pass 
    17 failed

       闭包的作用:

      1、封装

      2、代码复用

      代码四(将代码三中的passline换成函数)

      代码五(将判断的部分抽象出归为一类,下面使用闭包的方式完成)

      

  • 相关阅读:
    mysql 权限问题
    触发器作用
    带有循环功能的存储过程
    带有条件判断的存储过程
    数据存储 三大范式-----------待续
    存储过程自 带条件判断的存储过程
    线程异步更新UI
    TextBox只能输入数字
    C#中无边框窗体移动或拖控件移动窗体
    classloader原理
  • 原文地址:https://www.cnblogs.com/wxlblogs/p/7279407.html
Copyright © 2011-2022 走看看