"""
今日内容：
    1、函数对象
    2、函数嵌套
    3、闭包函数=名称空间与作用域+函数嵌套+函数对象
        核心点：名字的查找关系是以函数定义阶段为准的
"""
# 精髓：可以把函数当成变量去用
# func=内存地址
def func():
    print('from func')

# 1、可以赋值
f=func
# 2、可以当作函数的参数传入
def foo(x):
    print(x)
foo(func)

#3、函数可以当作另外一个函数的返回值
def foo(x):
    return x
print(foo(func))

#4、可以当作容器类型的一个元素
dict={'k1':foo}
print(dict)

# 函数嵌套调用和嵌套定义
# 1、在调用一个函数的过程中又调用其他函数
# 2、函数的嵌套定义：在函数内定义函数
def f1():
    def f2():
        pass
# 闭包函数：
# "闭"函数指的是该函数是内嵌函数
# "包"函数指的该函数包含对外层函数作用域名字的引用（不是对全局作用域）
def f2():
    def f1():
        pass
#为何要有闭包函数？
# 两种为函数传参的方式
# 方式一：直接把函数体需要的参数定义成形参
# def f3(x):
#     print(x)
# f3(1)
# f3(2)
# # 方式二:
# def f4(x):
#     def f2():
#         print(x)
#     return f2
# x=f4(3)
# print(x)
# x()

