Python:函数3——内嵌函数和闭包

一、内嵌函数

在函数内部创建另一个函数,也叫作内部函数。

>>> def func1():
...     print("func1() ing....")
...     def func2():
...             print("func2 ing...")
...     func2()
... 
>>> func1()
func1() ing....
func2 ing...

注意:内部函数的整个作用域都在外部函数之内!即上边的函数中,只可以在func1内调用func2,不能再func1的外边调用func2,因为看不到!尤其是:x *= x

在内部函数的变量相对于外部函数的关系,相当于局部变量和全局变量的关系,内部函数中只能对外部函数的变量进行访问,但不能对他修改。解决办法:

>>> def func1():
...     x = 5
...     def func2():
...             x *= x
...             return x
...     return func2()
... 
>>> func1()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in func1
  File "<stdin>", line 4, in func2
UnboundLocalError: local variable 'x' referenced before assignment	#未定以前不能引用

python3之前通过容器(因为容器类型不是全放在函数的栈里边,所以不会被屏蔽调):

>>> def func1():
...     x = [5]
...     def func2():
...             x[0] *= x[0]
...             return x[0]
...     return func2()
... 
>>> func1()
25

python3之后:有了nonlocal关键字

>>> def func1():
...     x = [5]
...     def func2():
...             nonlocal x     
...             x *= x
...             return x[0]
...     return func2()
... 
>>> func1()
25

二、闭包

闭包是函数式编程的一个重要的语法结构。是一种编程方式(面向对象、面向过程)。不同的编程语言实现闭包的方式不同,python如下:

(表现形式上)如果在一个内部函数里对外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包

>>> def funcX(x):
...     def funcY(y):
...             return x*y
...     return funcY		#因为所有东西都是对象,所以可以把函数对象funcY返回
... 
>>> i = funcX(8)
>>> i
<function funcX.<locals>.funcY at 0x7feed39a5e18>
>>> i(5)
40
>>> funcX(8)(5)
40

解释:(对于funcx,funcy就是他的一个内部函数,funy的外部作用域就是funcx整个函数空间)funcy引用了funcx的变量x

使用闭包注意:闭包是由内部函数演变得来,所以不可以在外部函数的外边对内部函数进行调用;变量也是这样;



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值