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换成函数)

 

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

  

 

posted @ 2017-08-03 14:08  心有琳系  Views(334)  Comments(0Edit  收藏  举报