python函数篇:名称空间、作用域和函数的嵌套

mac2022-06-30  133

一、名称空间:(有3类)

(1)内置名称空间(全局作用域)

(2)全局名称空间(全局作用域)

(3)局部名称空间(局部作用域)

关于名称空间的查询:

 

x=1 def func(): print('from func') x=2 a=1 b=2 print(globals())#打印全局名称空间 print(locals())#打印局部名称空间 func()

 

  执行结果是:

from func {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000026F9550>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/飞秋/徐圆圆课程视频/Python fullstack s4 基础篇-day21/day21/名称空间的查询.py', '__cached__': None, 'x': 1, 'func': <function func at 0x00000000028BB8C8>} {'b': 2, 'a': 1, 'x': 2}

 

查询名称空间的全局变量:globals() 查询名称空间的局部变量:locals() 查询局部变量,只能在局部使用,在全局使用时,局部变量的查询结果和全局变量的查询结果一致 示例: x=1 def func(): print('from func') x=2 a=1 b=2 print(globals())#在局部打印全局 print(locals())#在局部打印局部 func() a=globals() print(a)#在全局打印全局 b=locals() print(b)#在全局打印局部 print(a == b)#判断在全局打印局部和全局的结果是否一致

执行结果是:(验证了:查询局部变量,只能在局部使用,在全局使用时,局部变量的查询结果和全局变量的查询结果一致)

from func {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000005B9550>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/飞秋/徐圆圆课程视频/Python fullstack s4 基础篇-day21/day21/名称空间的查询.py', '__cached__': None, 'x': 1, 'func': <function func at 0x0000000001EBB8C8>} {'b': 2, 'a': 1, 'x': 2} {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000005B9550>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/飞秋/徐圆圆课程视频/Python fullstack s4 基础篇-day21/day21/名称空间的查询.py', '__cached__': None, 'x': 1, 'func': <function func at 0x0000000001EBB8C8>, 'a': {...}} {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000005B9550>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/飞秋/徐圆圆课程视频/Python fullstack s4 基础篇-day21/day21/名称空间的查询.py', '__cached__': None, 'x': 1, 'func': <function func at 0x0000000001EBB8C8>, 'a': {...}, 'b': {...}} True

  

 

 

全局与局部变量

在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。 当全局变量与局部变量同名时: 在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。     示例: x=1 #x=1为全局作用域 def foo(): x=20 #x=20为局部作用域 print(x) foo() #函数执行时,首先去局部找x的变量值,故打印结果为20 print(x)#输出的x是全局变量内的x,函数内的x与全局的x无关,故打印结果为1

 打印结果是:

20 1

总结:

关于函数的作用域找名称的查询顺序是:

先去局部找,局部没有的话,再去全局查找,全局没有的话,再去内置找(先局部在全局最后内置)

 

 

二、函数的嵌套:(2个方面)

(1)、函数的嵌套调用:(函数内调用之前定义好的函数)

示例:

# 函数的调用: def my_max(x,y): res=x if x>y else y#比较x和y的大小,取较大值 return res def my_max4(a,b,c,d): res1=my_max(a,b)#调用上面的函数,将最大值取出 res2=my_max(res1,c)#调用上面的函数,将最大值取出后和c比较取最大值 res3=my_max(res2,d)#调用上面的函数,将最大值取出后和d比较取最大值 return res3 print(my_max4(1,2,3,4))

 执行结果是:

4

(2)、函数的嵌套定义:(即函数内再定义函数)

示例:

def foo1(): x=1 print("foo1",x) def foo2(): x=2 print("foo2",x) def foo3(): x=3 print("foo3",x) foo3() foo2() foo1()

执行结果是:

foo1 1 foo2 2 foo3 3

  

 

 

 

转载于:https://www.cnblogs.com/xuyuanyuan123/p/6684957.html

相关资源:实例详解python函数的对象、函数嵌套、名称空间和作用域
最新回复(0)