Python-16 函数:内嵌函数和闭包
2017-07-28 20:08
344 查看
1、global关键字
全局变量的作用域是整个模块(也就是整个代码段),也就是代码段内的所有函数内部都可以访问到全局变量。但注意,在函数内部仅仅去访问全局变量就好,不要试图去修改它。因为那样的话,Python会使用屏蔽(shadowing)的方式“保护”全局变量:一旦函数内部试图修改全局变量,Python就会在函数内部自动创建一个名字一模一样的局部变量,这样子修改的结果只会修改到局部变量,而不会影响到全局变量。
>>> count = 5 >>> def MyFun(): count = 10 print(count) >>> MyFun() 10 >>> print(count) 5 >>>
如果要在函数中修改全局变量,使用关键字global
>>> def MyFun(): global count count = 10 print(count) >>> MyFun() 10 >>> print(count) 10 >>>
2、内嵌函数
Python的函数定义可以嵌套的,也就是允许在函数内部创建另一个函数,这样的函数叫做内嵌函数或者内部函数。>>> def fun1(): print('fun1正在被调用...') def fun2(): print('fun2正在被调用...') fun2() >>> fun1() fun1正在被调用... fun2正在被调用... >>>
3、闭包
闭包(closure)是函数式编程的一个重要语法结构,函数式编程是一种编程范式,著名的函数编程语言就是LISP语言(主要用于绘图,AI)不同的编程语言实现闭包的方式不同,Python中闭包从表现上定义为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
>>> def FunX(x): def FunY(y): return x*y return FunY >>> i = FunX(8) >>> i <function FunX.<locals>.FunY at 0x024EE390> >>> type(i) <class 'function'> >>> i(5) 40 >>> FunX(8)(5) 40 >>>内部函数FunY()就是闭包。
在外部调用FunY()是不允许的:
>>> FunY(5) Traceback (most recent call last): File "<pyshell#34>", line 1, in <module> FunY(5) NameError: name 'FunY' is not defined >>>
闭包函数调用外部作用域但不是全部变量x,报错“局部变量x,不能在定义之前被使用”
>>> def Fun1(): x = 5 def Fun2(): x*=x return x return Fun2() >>> Fun1() Traceback (most recent call last): File "<pyshell#42>", line 1, in <module> Fun1() File "<pyshell#41>", line 6, in Fun1 return Fun2() File "<pyshell#41>", line 4, in Fun2 x*=x UnboundLocalError: local variable 'x' referenced before assignment
可以进行如下改造,x变为一个列表,因为列表不是存在栈里面
>>> def Fun1(): x = [5] def Fun2(): x[0]*=x[0] return x[0] return Fun2() >>> Fun1() 25
(1)、关键字 nonlocal
还可以使用关键字nonlocal,把x强制声明为非局部变量。>>> def Fun1(): x = 5 def Fun2(): nonlocal x x*=x return x return Fun2() >>> Fun1() 25
相关文章推荐
- 函数:内嵌函数和闭包 - 零基础入门学习Python020
- 学习笔记-小甲鱼Python3学习第二十讲:函数:内嵌函数和闭包
- Python自学之函数内嵌和闭包
- python-内嵌函数和闭包
- python函数的闭包问题(内部函数与外部函数详述)
- python中对 函数 闭包 的理解
- Python返回函数_函数闭包_lambda匿名函数
- FishC笔记—20 讲 函数:内嵌函数和闭包
- python学习返回函数(闭包)
- 原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念
- 流程的Python 第七章:函数装饰器和闭包
- Python 3从入门到精通16-常用函数
- Python函数作用域和闭包
- python基础学习之函数(2)-内嵌函数和闭包
- 【转】python 函数闭包
- 原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念
- Python函数的作用域、闭包、装饰器
- python函数中的内嵌函数如何调用?
- Python中的函数对象与闭包
- python 闭包,函数,装饰器,语法糖