函数的嵌套与global和nonlacal

一. 函数的嵌套

  1. 只要遇见了()就是函数的调用. 如果没有()就不是函数的调用
  2. 函数的执行顺序
def fun1():   
    print(111)  
def fun2():   
    print(222)   
    fun1()   
fun2()
print(111)

1548388589142

def fun2():   
    print(222)   
    def fun3():       
        print(666)   
    print(444)   
    fun3()   
    print(888)
print(33)
fun2()
print(555)

1548388743478

# 函数中套函数
def func():
    a = 1
    def foo():
        b = 2
        print(b)  # 2
        print(a)  # 1
        def f1():
            print(b) # 2
        return f1()
    return foo()
print(func())
------------------------------------
# 函数嵌套调用
def func():
    a = 1
    foo()
    print(a)

def foo():
    b = 2
    print(b)
func()
-------------------------------------
# 函数嵌套参数的传递
def func(a):
    foo(a) #10

def foo(e):
    b(e) # return 10

def b(c):
    print(c)
    return 10

print(func(5))
-------------------------------------
# 函数嵌套返回值的传递
def func(a):
    foo(a) #10
	return 10
def foo(e):
    b(e)  
	return 10
def b(c):
    print(c)
    return 10

print(func(5))

二 .gloabal、nonlocal

首先我们写这样一个代码, 首先在全局声明一个变量, 然后再局部调用这个变量, 并改变这 个变量的值

a = 100
def func():   
    global a    # 加了个global表示不再局部创建这个变量了. 而是直接使用全局的a   
    a = 28   
print(a)
func()
print(a)

global表示. 不再使用局部作用域中的内容了. 而改用全局作用域中的变量

global 宗旨

在函数内部修改全局的变量,如果全局中不存在就创建一个变量

lst = ["麻花藤", "刘嘉玲", "詹姆斯"]
def func():   
    lst.append("⻢云")   
    # 对于可变数据类型可以直接进⾏访问
   print(lst)
func()
print(lst)

nonlocal宗旨

nonlocal 只修改上一层变量,如果上一层中没有变量就往上找一层,只会找到函数的最外层,不会找到全局进行修改

a = 10
def func1():   
    a = 20   
    def func2():
        nonlocal a       
        a = 30       
        print(a)  
    func2()   
    print(a)
func1()


结果:
加了nonlocal
30
30

不加nonlocal
30
20

再看, 如果嵌套了很多层, 会是一种什么效果:

a = 1
def fun_1():   
    a = 2   
    def fun_2():       
        nonlocal a       
        a = 3       
        def fun_3():           
            a = 4           
            print(a)       
        print(a)       
        fun_3()       
        print(a)   
    print(a)   
    fun_2()   
    print(a)
print(a)
fun_1()
print(a)

这样的程序如果能分析明白. 那么作用域, global, nonlocal就没问题了

posted @ 2019-10-03 16:54  luckinlee  阅读(202)  评论(0编辑  收藏  举报