day16 函数对象与闭包函数

一、函数对象

函数对象的精髓就是函数可以当做变量去使用

1.1函数可以被引用

注意赋值函数不能加括号

加括号是函数的调用,不加括号是函数体内函数体代码的内存地址

def func():
    print("func 函数")
f1 = func
f1()
>>>func 函数

1.2函数可以作为容器类型的元素

用这种方法也可以去优化我们多个函数的选择调用

一个函数:

def func():
    print("func 函数")
dict1= {"func":func}
dict1["func"]()
>>>func 函数

多个函数:

#功能函数
def func1():
    print("登录")
def func2():
    print("注册")
def func3():
    print("检查")
#存放功能函数的字典
func_dict = {
        "0":["退出",exit],
        "1":["注册",func1],
        "2":["登录",func2],
        "3":["检查",func3]}
while True:
    for key in func_dict:
        print(key,func_dict[key][0])
    cmd = input("请输入指令>")
    if  not cmd.isdigit():
        print("请输入数字")
        continue
    elif cmd in func_dict:
        func_dict[cmd][1]()
    else:
        print("不存在该指令")

1.3函数可以作为参数传入另外一个函数

def func(x):
    x()
def foo():
    print("函数 foo")
func(foo)
>>>函数 foo

1.4函数的返回值可以是一个函数

def foo():
    print("函数 foo")
def func():
    return foo
res = func()
res()
>>>函数 foo

二、闭包函数

前提:

闭包函数=函数空间与作用域+函数嵌套+函数对象

核心点:名字的查找关系是以函数定义阶段为准

1 什么是闭包函数

“闭”函数:指的是该函数的内嵌函数

def foo():
    def bar():
        pass
#在这个场景下bar就是闭函数

“包”函数:指的是函数包含对外层函数作用域名字的引用(不是对全局作用域)

闭包函数:名称空间和作用域的应用+函数嵌套

def foo():
    x=123123
    def bar():
        print(x)
#在这个例子里bar包含对外层函数foo内作用域里名字x的引用
#所以此时bar是闭包函数

2 闭包函数的用法

def foo():
    x=123
    def bar():
        print(x)
    return bar #foo函数的返回值是bar函数的内存地址
f = foo()#将foo函数的返回值赋值给f
f()#此时调用f函数等于在调用闭包函数bar
>>>123

此时通过引入闭包函数的概念,我们知道了两种函数体传参的方式

方式一:直接把函数体需要的参数定义成形参

def foo(x):
    print(x)
foo(1)

方式二:通过闭包函数的外层函数作用域里的变量传值

def foo():
    x=123
    def bar():
        print(x)
    return bar
bar = foo()
bar()
>>>123
#上面的方式传值x固定是123,当然也可以通过传参的方式自定义传值
def f1(x):
    def f2():
        return x*2
    return f2
f2 = f1(2)
print(f2())
>>>4
原文地址:https://www.cnblogs.com/hz2lxt/p/12531808.html