python学习之函数3

函数作用域不同:

LEGB--

L-Local:

L(local)局部作用域,作用域为函数内部 
局部变量:包含在def关键字定义的语句块中,即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。

E-Enclosing function locals:作用域为外部嵌套函数  

E(enclosing)嵌套作用域或称为闭包作用域
E也包含在def关键字中,E和L是相对的,E相对于更上层的函数而言也是L。与L的区别在于,对一个函数而言,L是定义在此函数内部的局部作用域,而E是定义在此函数的上一层父级函数的局部作用域。主要是为了实现Python的闭包,而增加的实现。

G-Global:函数定义所在模块的名字空间, 全局变量,定义于函数体外,
即在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明的变量具有全局作用域,从外部开来,模块的全局变量就是一个模块对象的属性。
注意:全局作用域的作用范围仅限于单个模块文件内
B-Builtin:作用域为Python内置模块

B(built-in)内置作用域
系统内固定模块里定义的变量,如预定义在builtin 模块内的变量

函数有其作用域,例如上图当变量处于函数内部,属于局部变量,当变量属于全体时,属于全局变量。于是即使全局变量和局部变量属于一个名字x。当上图定义全局变量x=880,又定义函数内,x=520,此时的x属于局部变量(在函数内部)。于是在访问时,为阻碍同名函数。作用域不同的错误。python为局部变量和全局变量分别设置了不同的储存位置和编码。此时的x虽然同名,但是是分属两个不同变量的。

当我们想用内部函数修改全局变量时。我们可以用global全局变量作为修改即可。但是不建议,代码多了容易出错。

 内部嵌套函数一般不可以修改嵌套上一级函数。同时外部也无法直接调用内部嵌套函数。因此在上图中。当调用funA的时候,把嵌套funcB也调用出来了。但直接调用funB则会报错。同时funB也没修改fun A的X。也是同时创建了一个同名的两个不同变量x。

当我们想要修改嵌套函数外层函数变量,通过内层函数修改的话。我们可以用nonlocal这个变量。在内层函数里面定义外层函数变量作用域。于是x统一了。因为L是定义函数内部的局部作用域。因此外层函数相对于内层函数定义域来说是E。内层是L。因此nonlocal将内层函数作用域扩大到外层的E(L)。

另外最后build in 函数作用域为内置函数的作用域。 例如str()函数,作用域为函数内部。

但是build in 的优先级最低,很容易被覆盖。因此在自定义函数时 尽量避免使用内置函数做函数名,避免将内置函数覆盖,从而出现问题。

 

这里讲嵌套作用域。首先看我们知道当一个函数定义了参数,这个参数是局部变量,只能由这个函数调用。如上图。x=520.我们直接调用便报错了。

同时下面嵌套函数funB直接调用也是错误的。我们不能直接调用嵌套内层函数。同时局部变量调用一次后,便消亡。 

对于嵌套函数来说 外层函数作用域会保存下来,不会像局部作用域一样用完即消失。

于是我们通过重新定义一次funny=funA()

实现了再次将外层函数作用域保存下来。

于是针对这个特性,加上我们之前学的。在内层函数修改外层函数参数作用域的操作。

便实现了可以一直将外层函数参数关系利用。实现了闭包操作。

即利用嵌套函数外层函数作用域具有记忆功能这个特点,将数据保存到外层函数的参数或者变量关系中。将内层函数作为返回值给予返回。

如上图中power()函数。外层的参数作用域一直保存。即exp这个参数一直保存。所以

当我们输入实参,square ,exp=2,cube exp=3.时依旧可以使用外部函数调用。

如上图中outer()函数。初始参数为实际参数 x=0 y=0.但我们在内部嵌套函数中使用nonlocal修改它。得 x=x+x1 y = y+y1。再输出现在的x 和y。所以使用move(1,2)。这里(1,2)其实指代的x1,y1的形式参数。于是由嵌套函数关系得 x = 0+1,y= 0+2,输出新的x=1 y=2。此时外层嵌套函数参数变为实参1,2。再次输入Move(-2,2)。新的就为-1,4了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值