内嵌函数和闭包

230 阅读2分钟

1、global关键字

全局变量的作用域是整个文件,不要轻易去修改全局变量,Python就会使用“屏蔽”的方式保护全局变量。Python会在函数内部自动创建一个名字相同的局部变量,修改只会修改到Python内部创造的局部变量而不会影响全局变量。

\

可以使用global关键字定义全局变量。

\

2、内嵌函数

允许在函数内部创建另一个函数的方式就是内嵌函数。

Python支持函数的嵌套的。

\

在fun1()这个函数体里面可以随意调用fun2(),在fun1()函数体外,fun2()就不能被调用了。

\

3、闭包

闭包是函数式编程重要的语法结构。

函数式编程是一种编程范式。例如“面向对象编程、面向过程编程...”,这些都是编程范式。这些编程范式对代码进行抽象提炼概括,使代码重用性可用性变高。著名的函数式编程语言就是lisp语言,主要用于CD绘图和人工智能。不同的编程语言实现闭包的方式不同,Python中闭包从表现形式上定义为:如果在一个内部函数里对外部作用域(但不是在全局作用域的变量进行引用,那么内部函数就会被认为是闭包)。

\

解释下:FunY()构成闭包,FunY()是内部函数,对FunX()整个函数的空间的变量进行引用。达到这两点需求,就是闭包。因为闭包是由内部函数演变而来,注意不能在外部函数外边进行调用,否则会报错。在内部函数中,只能对外部函数的局部变量进行访问,但是不能进行修改。

\

在执行return Fun2()的时候,跑到Fun2()的里面去执行,而Fun2()的整个外部空间,是Fun1()的外部空间。x =5 相当于非全局变量的外部变量,在Fun2()的外部作用域里面。试图修改的时候,外部函数的x就会被屏蔽,这跟我们的全部变量和局部变量的道理相同。试图对没有定义过的数据进行平方操作,那么肯定会被报错。

\

在Python3之前是间接通过容积类型来存放,容积类型是存放在栈里面,x这个变量不会被屏蔽掉,可以修改代码为:

\

Python3用nonlocal关键字,在内部函数修改外部函数的局部变量。

\

\

本文分享自微信公众号 - 清菡软件测试(qinghanTester)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。