python 函数嵌套 报错_python基础-方法嵌套、就近原则、global、nonlocal、函数即变量...

方法嵌套

#函数的嵌套定义

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值