方法嵌套
#函数的嵌套定义
def func():
def qqxing():
print('我是qqxing')
qqxing()
func()
输出如下:
我是qqxing
方法覆盖
def method1():
print("ssss")
def method1():
print("tttt")
method1()
输出如下:
tttt
就近原则
def method2():
n = 3
m = 7
def method():
n = 2
print(n)
print(m)
method()
method2()
输出如下:
2
7
globals\locals
globals() #保存了在全局作用域中的名字和值
locals() #中的内容会根据执行的位置来决定作用域中的内容
如果在全局执行
globals和locals打印的结果是一致的
n = 1
m =2
def method6():
a = 10
b = 11
#globals方法保存了全局的变量
print(globals())
#在全局环境执行是全局的
print(locals())
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/test.py
{'__name__': '__main__', '__doc__': '\n全局作用域\n\n局部作用域\n', '__package__': None, '__loader__': <_frozen_importlib_external.sourcefileloader object at>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'E:/python/py_pro/test.py', '__cached__': None, 'n': 1, 'm': 2, 'method6': }
{'__name__': '__main__', '__doc__': '\n全局作用域\n\n局部作用域\n', '__package__': None, '__loader__': <_frozen_importlib_external.sourcefileloader object at>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'E:/python/py_pro/test.py', '__cached__': None, 'n': 1, 'm': 2, 'method6': }
我们看如下的方法中的locals\globals
#放在方法里面
a = 1
def methon11():
a = 15
b = 11
print(locals())
print(globals())
methon11()
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/test.py
{'b': 11, 'a': 15}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.sourcefileloader object at>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'E:/python/py_pro/test.py', '__cached__': None, 'a': 1, 'methon11': }
global
globals和locals方法
小范围可以使用大范围的,但不能修改
如果想要修改全局的:使用global关键字 —— 尽量避免
如果想要修改最近拥有该变量的外层函数的:使用nonlocal ——不影响全局
如下的代码就是因为没有声明global而报错
n = 1
def func():
n = n+1
func()
print(n)
报错内容如下:
E:\python\python_sdk\python.exe E:/python/py_pro/4函数的命名空间.py
Traceback (most recent call last):
File "E:/python/py_pro/4函数的命名空间.py", line 7, in
func()
File "E:/python/py_pro/4函数的命名空间.py", line 5, in func
n = n+1
UnboundLocalError: local variable 'n' referenced before assignment
我们进行修改如下:
n = 1
def func():
global n
n = n+1
func()
print(n)
输出如下:
2
nonlocal
如果想要修改最近拥有该变量的外层函数的:使用nonlocal ——不影响全局
n = 0
def func():
n = 1
def func2():
def func3():
nonlocal n
n+=1
func3()
print(n)
func2()
print(n)
func()
print(n)
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/4函数的命名空间.py
2
2
0
我们将上面的代码修改如下:
n = 0
def func():
n = 1
def func2():
n = 2
def func3():
nonlocal n
n+=1
func3()
print(n)
func2()
print(n)
func()
pri::::
t(n)
输出如下:
3
1
0
函数变量
第一类对象的概念:
函数名可以赋值
可以作为一个数据结构的元素
可以作为一个函数的参数
可以作为一个函数的返回值
#函数的名字
def func():
print('in func')
return 10
def func2():
print('in func2')
return 20
#打印方法的内存地址值
print(func)
#方法赋值变量
t = func
print(t)
print(t())
print("---------")
#方法变量存放列表
l = [func,func2]
for i in l:
i()
def func():
print('in func')
return 10
def func2(arg):
arg()
return arg
print("--------")
f = func2(func)
f()
print(f())
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/5函数的名字.py
in func
10 ---------
in func
in func2 --------
in func
in func
in func
10
Process finished with exit code 0