一. 函数的嵌套

  1. 只要遇见了()就是函数的调用. 如果没有()就不是函数的调用
  2. 函数的执行顺序
def fun1():
    print(111)
def fun2():
    print(222)
    fun1()
fun2()
print(111)
def fun2():
    print(222)
    def fun3():
        print(666)
    print(444)
    fun3()
    print(888)
print(33)
fun2()
print(555)
# 函数中套函数
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就没问题了

02-13 08:18
查看更多