函数的嵌套调用

 



def func():
    print(123)
def func2():
     func()
  print(345)
func2()
#结果:123 345



函数的嵌套定义

 



def func():
    print(123)
 def func2():
    print(234)
func()
#结果:123



无法调用func2而且结果也不会调用func2  外面也无法调用func2因为在func里面
为了保证某些功能特有的函数不被其他人随意调用



def func(a,b,c):
    print(a,b,c)
    def func2(a,b,c):
        print(a,b,c)
    func2(a,b,c)
func(3,2,1)



想要令嵌套的函数可以获取值,需要从主函数里面获取变量值再从子函数里面接收传参
想要传多个参数从主函数到子函数



def func(*args,**kwargs):
    def func2(*args,**kwargs):
        print(args,kwargs)
    func2(*args,**kwargs)
func(1,3,5,5,6,c=1,b=3)



这样可以令里面的子函数获取到主函数接收到的实参

三元计算

 



c =a if a>b else b:



命名空间



a=1
b=0
def name():
def max():



都是全局命名空间   全局命名空间全局都能用
def name(a,b):
ab是局部命名空间
局部命名空间的独立的    只在函数里面用
对于局部来说,自己有的时候用自己的,自己没有再用全局的
内置命名空间
启动python就能用的就在内置命名空间里面
如 print def 等
打开代码先加载内置命名空间,再加载全局命名空间---从上到下顺序加载
调用该函数的时候加载局部命名空间
内置命名空间任意地方都可以用

应用例如:



a=1
def demo1():
    a=3
    def demo2():
        a=2
        print(a)
    demo2()
    print(a)
demo1()
print(a)



进来获取了全局的a=1,然后调用了demo1然后进入函数demo1
定义了a=3不过里面又有了函数demo2里面的a找到函数中的值2
打印2
然后打印了a=3,然后打印全局的1
结果  231

globals()全局里面变量在哪值是什么
locals()查函数自己的变量在哪值什么
global a  这样可以改变全局变量
nonlocal a  改变上一层的变量变成本函数变量

函数的名字  可以当做变量使用  是第一类对象的概念
首先是一个函数的内存地址
可以赋值,可以作为其他列表等容器类型的元素
可以作为函数的参数,返回值
例子1:



def func():
    print(123)
def fun2():
    print(456)
def fun3():
    print(789)
li=[]
a = func
b = fun2
c = fun3
li=[a,b,c]
li[1]()



例子2:



def func():
    print(123)
def func2(aaa):
    aaa()
func2(func)
结果是123
例子3:
def func():
     print(123)
def func2():
    return func
ret = func2()
ret()



闭包

内部函数引用了外部函数的变量,那么这个时候内部的函数叫做闭包



def func():
    name = 'egon'
 def inner():
    print(name)
 print(inner._closure_)
func()



inner是闭包,,closure检查是不是闭包
例子:



def func():
    name='egon'
    def inner():
        print(name)
    return inner
inner = func()
inner()



能把嵌套函数里面的函数调用
闭包的应用
装饰器是闭包的一种应用
闭包的作用:
节省内存
如果不用闭包,每次输出都会创建一个变量并销毁,闭包的话变量只创建一次
节省内存并且不会因为全局变量容易改变而害怕改变