Python学习(21):Python函数(5):变量作用域与闭包
2017-03-29 20:24
711 查看
转自 http://www.cnblogs.com/BeginMan/p/3179040.html
一、全局变量与局部变量
一个模块中,最高级别的变量有全局作用域。
全局变量一个特征就是:除非被删除,否则他们存活到脚本运行结束,且对于所有的函数都可访问。
当搜索一个标识符(也称变量、名字等),Python是先从局部作用域开始搜索,如果局部作用域内没有找到那个名字,那么就在全局域找,如果还没有则抛出一个NameError异常。
一个变量的作用域和它寄存的名称空间相关,注意,局部变量会覆盖全局变量。如:
global语句:
为了明确地引用一个已命名的全局变量,必须使用global语句,语法如下:
global var1[,val2...]
下面的例子更为详细:
嵌套函数作用域:
二、闭包
如果在一个内部函数里,对在外部函数内(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
定义在外部函数内但由内部函数引用或者使用的变量称为自由变量。
闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability)。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。
不同的语言实现闭包的方式不同。Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看到Python使用对象来实现一些特殊的语法)。Python一切皆对象,函数这一语法结构也是一个对象。在函数对象中,我们像使用一个普通对象一样使用函数对象,比如更改函数对象的名字,或者将函数对象作为参数进行传递。
参考:http://www.cnblogs.com/vamei/archive/2012/12/15/2772451.html
如实现一个计数的闭包例子:
闭包的作用:
推荐阅读:Python深入04 闭包
一、全局变量与局部变量
一个模块中,最高级别的变量有全局作用域。
全局变量一个特征就是:除非被删除,否则他们存活到脚本运行结束,且对于所有的函数都可访问。
当搜索一个标识符(也称变量、名字等),Python是先从局部作用域开始搜索,如果局部作用域内没有找到那个名字,那么就在全局域找,如果还没有则抛出一个NameError异常。
一个变量的作用域和它寄存的名称空间相关,注意,局部变量会覆盖全局变量。如:
bar = 10 def foo(): bar = 100 return bar print foo() #100
global语句:
为了明确地引用一个已命名的全局变量,必须使用global语句,语法如下:
global var1[,val2...]
bar = 10 def foo(): global bar return bar bar = 10000 print foo() #10000
下面的例子更为详细:
bar = 10 #声明一个全局变量bar def foo(): global bar #指定bar是全局变量,谁都不能替换!但是能修改原值! bar2 = 0.1 #声明一个局部变量bar2 bar = 0.0001 #是对全局变量bar的修改,而不是在又声明一个局部变量将全局变量覆盖。 return bar+bar2 bar = 10000 #又对全局变量bar进行修改,但是为时已晚了,因为在foo函数里已经 return bar+bar2了 print foo() #综上,输出:0.1001
嵌套函数作用域:
def foo(): m = 1 def bar(): n = 2 return m+n # m +=n #NameError: global name 'n' is not defined return bar() print foo() #3
二、闭包
如果在一个内部函数里,对在外部函数内(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
定义在外部函数内但由内部函数引用或者使用的变量称为自由变量。
闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability)。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。
不同的语言实现闭包的方式不同。Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看到Python使用对象来实现一些特殊的语法)。Python一切皆对象,函数这一语法结构也是一个对象。在函数对象中,我们像使用一个普通对象一样使用函数对象,比如更改函数对象的名字,或者将函数对象作为参数进行传递。
参考:http://www.cnblogs.com/vamei/archive/2012/12/15/2772451.html
如实现一个计数的闭包例子:
def counter(start_at=0): count = [start_at] #内部函数incr()实现计数 def incr(): #定义一个内部函数,在内部使用变量count,创建一个闭包 count[0]+=1 return count[0] return incr #返回一个可调用的函数对象 #看起来和实例化一个counter对象并执行这个实例是多么相似 count = counter(5) for i in range(10): print count(), #6 7 8 9 10 11 12 13 14 15 count = counter(100) print count() #101
闭包的作用:
推荐阅读:Python深入04 闭包
相关文章推荐
- python学习笔记11(函数二): 参数的传递、变量的作用域
- 王亟亟的Python学习之路(10)-函数对象的作用域,函数作为返回值,闭包
- python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数
- python[变量作用域-函数-闭包-装饰器-生成器]
- python学习笔记三:函数及变量作用域
- python函数学习与变量作用域
- python 学习笔记 ---返回值为函数 闭包
- Python教程学习简记9--Python 返回函数 闭包
- JavaScript高级程序设计(第2版) 学习笔记:(二)js函数作用域与闭包
- linux shell学习笔记二---自定义函数(定义、返回值、变量作用域)介绍
- Python基础:11变量作用域和闭包
- Python学习笔记-1(变量、类型、函数、类、作用域)
- Learn Python The Hard Way学习(21) - 函数可以返回信息
- Coffee script 学习笔记I --函数及变量作用域
- python学习笔记6-函数变量
- (原创)c#学习笔记06--函数02--变量的作用域02--参数和返回值与全局数据
- 函数:内嵌函数和闭包 - 零基础入门学习Python020
- Learn Python The Hard Way学习(18) - 命名,变量,代码,函数
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- python 函数 本地变量 函数的命名空间 变量的作用域