python中函数作用域 python中作用域可分为( 三 )


程序5和程序2相比较,仅仅是在函数中添加了一个定义“global a”,此时的局部变量a就可以当做全局变量使用,由于它和全局变量a同名,自然也就不用区分a究竟是全局变量还是局部变量了,在主程序和该函数内都可以访问、修改变量a的值了 。
虽然使用global可使变量使用起来非常方便,但也容易引起混淆,故在使用过程中还是谨慎为好 。
12.3 函数的递归与嵌套
递归 , 就是函数调用它自身 。递归必须设置停止条件,否则函数将无法终止 , 形成死循环 。
以计算阶乘为例:
def func(n):
if n==1:
return 1
else:
return n*func(n-1) #func( )调用func( )
print(func(5))
运行结果为:120
嵌套,指在函数中调用另外的函数 。这是程序中常见的一种结构,在此不再赘述 。
匿名函数
Python中可以在参数前加上关键字lambda定义一个匿名函数,这样的函数一般都属于“一次性”的 。
例如:
程序1:这是一个常规的函数定义和调用 。
def f_add(x,y):
return x+y
print(f_add(2,3))
输出结果:5
程序2:使用lambda定义匿名函数 。
f_add=lambda x,y:x+y
print(f_add(2,3))
输出结果:5
从上面的代码可以看出 , 使用lambda仅仅减少了一行代码 。f_add=lambda x,y:x+y中的f_add不是变量名,而是函数名 。程序1和程序2的print( )语句中的参数都是一样的——调用函数f_add( ) 。所以 , 匿名函数并没有太多的优点 。
python中函数变量作用域和类变量作用域怎么搞都错,烦躁中?python中,变量的作用域要弄清楚 。只有module、class、def、lambda才会引入作用域,其他的代码块是不会引入作用域的 。
1
图一中,你在函数中声明了d为全局变量 , 但这样是无效的,程序运行结果,已经说明这一点 。
global这个关键字,是用来“在函数中修改全局变量值”的声明,而不是“在局部函数中定义一个全局变量”的声明 。这里要注意一下 。
你可以再局部函数外面声明变量d,再加上你原先的函数 , 就可以修改、访问这个变量了 。
2
在类中函数的变量,作用域只在函数中 。图二中,jian这个变量分别在yu(),yu1()两个函数中,是处于不同的定义域中的,是不能相互访问的 。
所以 , 在各自函数中,只有先定义了jian变量,才能再使用 。
如果想在yu1()中访问yu()中的jian变量,就需要将jian变量变成全局变量,即在class中定义一个全局变量jian,这样yu1(),yu()函数都可以访问了
Python语言中作用域怎么理解?命名空间 是从命名到对象的映射 。当前命名空间主要是通过 Python 字典实现的python中函数作用域,不过通常不关心具体的实现方式(除非出于性能考虑)python中函数作用域,以后也有可能会改变其实现方式 。以下有一些命名空间的例子:内置命名(像 abs() 这样的函数,以及内置异常名)集,模块中的全局命名,函数调用中的局部命名 。某种意义上讲对象的属性集也是一个命名空间 。关于命名空间需要了解的一件很重要的事就是不同命名空间中的命名没有任何联系,例如两个不同的模块可能都会定义一个名为 maximize 的函数而不会发生混淆-用户必须以模块名为前缀来引用它们 。
顺便提一句,python中函数作用域我称 Python 中任何一个“.”之后的命名为 属性 --例如,表达式 z.real 中的 real 是对象 z 的一个属性 。严格来讲,从模块中引用命名是引用属性:表达式 modname.funcname 中,modname 是一个模块对象,funcname 是它的一个属性 。因此,模块的属性和模块中的全局命名有直接的映射关系:它们共享同一命名空间python中函数作用域![1]

推荐阅读