网站首页 > 文章中心 > 其它

python作用域函数

作者:小编 更新时间:2023-09-05 18:31:05 浏览量:276人看过

Python中的作用域规则:LGB规则

Global),再次之内置的(Built-in)——在名字被发现的第一个位置处停止.

用域中生成或改变它,除非在该函数已对它进行了全局声明.

是一个模块的名字空间.

python里面变量作用域是什么?

变量作用域:python可以直接查找名称到对象的映射(命名空间)的部分.

python有built–in、global、enclosing、local这四种作用域

built–in:内建作用域,包含了内建的变量和关键字.

python作用域函数-图1

global:全局作用域,定义在所有函数外,当前模块(.py源文件)的全局变量.

enclosing:闭包函数外的函数(非局部也非全局),比如有一个函数a,a里有另一个函数b,对于b里的变量来说,a中的作用域就是enclosing.

local:局部作用域,脚本最内层,比如函数里.

Python语言中作用域怎么理解?

命名空间 是从命名到对象的映射.当前命名空间主要是通过 Python 字典实现的,不过通常不关心具体的实现方式(除非出于性能考虑),以后也有可能会改变其实现方式.以下有一些命名空间的例子:内置命名(像 abs() 这样的函数,以及内置异常名)集,模块中的全局命名,函数调用中的局部命名.某种意义上讲对象的属性集也是一个命名空间.关于命名空间需要了解的一件很重要的事就是不同命名空间中的命名没有任何联系,例如两个不同的模块可能都会定义一个名为 maximize 的函数而不会发生混淆-用户必须以模块名为前缀来引用它们.

顺便提一句,我称 Python 中任何一个"."之后的命名为 属性 --例如,表达式 z.real 中的 real 是对象 z 的一个属性.严格来讲,从模块中引用命名是引用属性:表达式 modname.funcname 中,modname 是一个模块对象,funcname 是它的一个属性.所以呢,模块的属性和模块中的全局命名有直接的映射关系:它们共享同一命名空间![1]

python作用域函数-图2

不同的命名空间在不同的时刻创建,有不同的生存期.包含内置命名的命名空间在 Python 解释器启动时创建,会一直保留,不被删除.模块的全局命名空间在模块定义被读入时创建,通常,模块命名空间也会一直保存到解释器退出.由解释器在最高层调用执行的语句,不管它是从脚本文件中读入还是来自交互式输入,都是 __main__ 模块的一部分,所以它们也拥有自己的命名空间(内置命名也同样被包含在一个模块中,它被称作 builtins ).

当调用函数时,就会为它创建一个局部命名空间,并且在函数返回或抛出一个并没有在函数内部处理的异常时被删除.(实际上,用遗忘来形容到底发生了什么更为贴切.)当然,每个递归调用都有自己的局部命名空间.

作用域 就是一个 Python 程序可以直接访问命名空间的正文区域.这里的直接访问意思是一个对名称的错误引用会尝试在命名空间内查找.尽管作用域是静态定义,在使用时他们都是动态的.每次执行时,至少有三个命名空间可以直接访问的作用域嵌套在一起:

Python其实很简单 第十二章 函数与变量的作用域

在前面已经多次提到函数这个概念,之所以没有解释什么是函数,是因为程序中的函数和数学中的函数差不多,如input()、range()等都是函数,这些都是Python的标准函数,直接使用就可以了.根据需要,用户也可以自定义函数.

函数的结构:

def 函数名(参数):

函数体

return 返回值

def f(x):

return(y)

下面给出完整的程序代码:

print(res)

运行结果:11

上例中的y是函数f(x)的返回值.并不是所有的函数都有参数和返回值.如下面的函数:

def func():

print('此为无参数传递、无返回值的函数')

func()

输出结果:此为无参数传递、无返回值的函数

可以看出,该函数func()无参数,故调用时不用赋给参数值.

def f(x,y):

return z

也可以通过直接给参数列表中的参数赋值的方法,为参数添加默认值,如果用户赋予参数值,则按照用户赋值执行,否则使用默认值.例如:

回调函数,又称函数回调,是将函数作为另一函数的参数.

例如:

def func(fun,m,n):

fun(m,n)

def f_add(m,n):

print('m+n=',m+n)

def f_mult(m,n):

print('m*n=',m*n)

输出结果:

在f_add(m,n)和f_mult(m,n)被定义前,func(fun,m,n)中的fun(m,n)就已经调用了这两个函数,即"先调用后定义",这也是回调函数的特点.

如果无法预知参数的个数,可以在参数前面加上*号,这种参数实际上对应元组类型.譬如,参会的人数事先不能确定,只能根据与会人员名单输入:

def func(*names):

print('今天与会人员有:')

for name in names:

print(name)

func('张小兵','陈晓梅','李大海','王长江')

运行后,输出结果为:

今天与会人员有:

张小兵

陈晓梅

李大海

王长江

参数为字典类型,需要在参数前面加上**号.

def func(**kwargs):

for i in kwargs:

print(i,kwargs[i])

func(a='a1',b='b1',c='c1')

输出结果为:

a a1

b b1

c c1

一个有趣的实例:

def func(x,y,z,*args,**kwargs):

print(x,y,z)

print(args)

print(kwargs)

func('a','b','c','Python','is easy',py='python',j='java',ph='php')

a b c # 前三个实参赋给前三个形参

('Python', 'is easy') # *args接收元组数据

{'py': 'python', 'j': 'java', 'ph': 'php'} # **kwargs接收字典数据

变量的作用域即变量的有效范围,可分为全局变量和局部变量.

局部变量

在函数中定义的变量就是局部变量,局部变量的作用域仅限于函数内部使用.

全局变量

在主程序中定义的变量就是全局变量,但在函数中用关键字global修饰的变量也可以当做全局变量来使用.

全局变量的作用域是整个程序,也就是说,全局变量可以在整个程序中可以访问.

下面通过实例去讨论:

程序1:

a=1 # a为全局变量

def a_add():

print('a的初值:',a) # 在函数中读取a的值

a_add() # 调用函数a_add()

a+=1 # 主程序语句,a增加1

print('a现在的值是:',a) # 主程序语句,读取a的值

运行结果:

a的初值: 1

这个结果和我们想象的一样,全局变量a既可以在主程序中读取,也可以在子程序(函数)中读取.

a=1

a+=1

print('a的初值:',a)

a_add()

print('a现在的值是:',a)

运行程序1时出现如下错误提示:

UnboundLocalError: local variable 'a' referenced before assignment

意思是:局部变量'a'在赋值之前被引用.

怎样解决这个问题?

def a_add(x):

x+=1

return x

a=a_add(a)

结果的确是正确的,但在函数a_add(x)中没有调用变量a(没有出现变量a).

def a_add(a):

return a

global a

虽然使用global可使变量使用起来非常方便,但也容易引起混淆,故在使用过程中还是谨慎为好.

递归,就是函数调用它自身.递归必须设置停止条件,否则函数将无法终止,形成死循环.

以计算阶乘为例:

def func(n):

if n==1:

return 1

else:

return n*func(n-1) #func( )调用func( )

嵌套,指在函数中调用另外的函数.这是程序中常见的一种结构,在此不再赘述.

匿名函数

Python中可以在参数前加上关键字lambda定义一个匿名函数,这样的函数一般都属于"一次性"的.

程序1:这是一个常规的函数定义和调用.

def f_add(x,y):

return x+y

f_add=lambda x,y:x+y

python中函数变量作用域和类变量作用域怎么搞都错,烦躁中?

python中,变量的作用域要弄清楚.只有module、class、def、lambda才会引入作用域,其他的代码块是不会引入作用域的.

图一中,你在函数中声明了d为全局变量,但这样是无效的,程序运行结果,已经说明这一点.

global这个关键字,是用来"在函数中修改全局变量值"的声明,而不是"在局部函数中定义一个全局变量"的声明.这里要注意一下.

你可以再局部函数外面声明变量d,再加上你原先的函数,就可以修改、访问这个变量了.

在类中函数的变量,作用域只在函数中.图二中,jian这个变量分别在yu(),yu1()两个函数中,是处于不同的定义域中的,是不能相互访问的.

所以,在各自函数中,只有先定义了jian变量,才能再使用.

如果想在yu1()中访问yu()中的jian变量,就需要将jian变量变成全局变量,即在class中定义一个全局变量jian,这样yu1(),yu()函数都可以访问了

python 函数作用域问题,

类在定义的时候是有作用域的,这个作用域内的变量只能在 class 块内访问,而不能在类的方法(函数)中访问.

以上就是土嘎嘎小编为大家整理的python作用域函数相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章