Python嵌套函数\闭包

Python中一个与众不同的语法就是可以嵌套函数,所谓嵌套,并不像其他语言中的在一个函数中调用另一个函数,而是在定义一个函数的时候,函数体里还能定义另一个函数。
内函数可以访问外函数的作用域,这就是《Python基础教程》P105里“它带着它的环境(和相关的局部变量)”及“由于Python的嵌套作用域,来自外部作用域的这个变量,稍后会被内层函数访问”。但是外部函数不能访问内部函数的作用域。

下面用编程实例来详细说明:
#在func_1()中定义了func_2(),func_2()中又定义了func_3()
def func_1():
    x1 = "func_1"
    #print("x1 = %s,x2 = %s,x3 = %s" % (x1,x2,x3))运行此句出现错误
    print("In func_1: x1 = %s" % x1)
    
    def func_2():
        x1 = "func_1_redefined"
        #将X2声明为全局变量,这样才可以在其外层函数func_1()中使用
        global x2 
        x2 = "func_2"
        print("In func_2: x1 = %s,x2 = %s" % (x1,x2))

        def func_3():
            x3 = "func_3"
            print("In func_3: x1 = %s,x2 = %s,x3 = %s" % (x1,x2,x3))

        return func_3()
    
    #调用func_2()使global x2被定义使用
    func_2()
    print("In func_1,again: x1 = %s,x2 = %s" % (x1,x2))

下面是运行结果(环境是Python 3.3.0): Python征途_第2记——嵌套函数/嵌套作用域/闭包(closure)

程序分析:
1)1只能访问自己定义的变量,2可以访问1和2中定义的变量但不能访问3中的变量,3可以访问所有变量;所以内部函数可以访问其外部函数的作用域,但是外部函数不能访问内部函数的作用域。
2)如果2中的变量被1访问到,可以用gloabl对其声明,但在使用前必须调用2。
3)若1,2中都有x1,则3中访问到的是2中的x1(离它最近的作用域中的x1),1中的x1不变(不被重新赋值)。

我的总结:
当函数实现的功能比较复杂,代码量比较大时,可以对函数进行分片,在这个函数的内部定义实现某一功能的函数,这样做的好处是代码易懂,并且可以对一部分变量封装,避免对变量的误操作。
书上说“存储子封闭作用域的行为叫做闭包”。

转载地址:http://blog.sina.com.cn/s/blog_4a8fa26101019fny.html


Python,函数嵌套,到底是个什么东东?

很少有人用,但是,有时确实会用:

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. def multiplier(factor):  
  2.     def multiplyByFactor(number):  
  3.           return number*factor  
  4.     return multiplyByFactor  

python 程序,一个函数在另外一个函数的里面,外层的函数返回的是里层函数。也就是函数本身被返回了,返回的是函数(听起来和C语言的一些东东相似)。

注意,返回的函数还可以访问它的定义所在的作用域,也就是它带着它的环境信息奥。


看看下面的用法,就会有被水浇的感觉了:

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. >>>double = multiplier(2)  
  2. >>>double(5)  
  3. 10  
  4.   
  5. >>>triple=multiplier(3)  
  6. >>>triple(3)  
  7. 9  
  8.   
  9. >>>multiplier(5)(4)  
  10. >>>20  

每次调用外层函数,它内部的函数都会被重新绑定,factor变量每次都有一个新的值。


以上内容摘抄自《python基础教程》

转载地址:http://blog.csdn.net/shanzhizi/article/details/46385601


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值