zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    HTML的基本骨架
    2017.7.27
    2017.7.26
    2017.7.25
    2017.7.24
    2017.7.22
    2017.7.21
    Javascript Step by Step
    Javascript Step by Step
    Javascript Step by Step
  • 原文地址:https://www.cnblogs.com/hz2lxt/p/12531808.html
Copyright © 2011-2022 走看看