一、函数对象

  1、定义:把函数当作变量使用时,函数可以称为函数对象。

  2、赋值:可以把函数对象作为值赋值给变量名。

def f1():
    print('f1的功能')
f2 = f1  # 把 f1 的功能作为值对象赋值给 f2
f2()  # 通过执行 f2 而执行 f1 的功能

  3、传参:可以把函数对象作为实参传给另一个函数的形参。

def f1():
    print('f1的功能')
def f2(a):
    a()  # f2 的功能是执行 形参 a 接收的实参的功能
f2(f1)  # 把 f1 作为实参传给 f2,即 执行 f2 即执行了 实参 f1 的功能

  4、返回值:在传参的基础上延申的用法,即可以把函数对象作为实参传给另外一个函数的形参后,可以作为该函数的返回值被提取。

def f1():
    print('f1的功能')
def f2(a):
  return a  # f2 的功能是把形参接收的实参作为返回值
f3 = f2(f1)  # 把 f1 作为实参传给 f2,执行 f2 并把 f2 的返回值,即 f1 赋值给 f3
f3()  # 通过执行 f3 而执行 f1 的功能

  5、容器的元素:可以把函数对象作为容器类型变量的一个元素。

def f1():
    print('f1的功能')
l=[f1,]  # f1 作为了列表 l 的 0 号索引的元素
l[0]()  # 通过列表索引执行 f1 的功能

二、函数嵌套

  1、函数调用的嵌套:在调用一个函数时,该函数体内又调用了另外一个函数。

def f1():
    print('f1的功能')
def f2():
    f1()  # f2 的函数体内有执行 f1
f2()  # 通过执行 f2 而执行 f1 的功能

  2、函数定义的嵌套:一个函数体内包含了定义另外一个函数。

def f1():
    def f2():
        pass
# 执行 f1 才会执行 f1 函数体内的定义 f2 功能

三、闭包函数

  1、特点:是前置知识,名称空间与作用域,函数对象,函数嵌套的三者综合应用产生的概念,核心原则即,名字的查找是以函数定义阶段为准。

  2、定义:“闭函数”是指一个函数内嵌套定义的函数。“包函数”则是该函数的外层函数。

  3、简述:当“闭函数”内需要引用某名字的值,若其函数体内没有该名字,会向外层寻找,且“包函数”的函数体内恰有此名字时,“闭函数”会以此值为准。此时,“闭函数”的执行结果只受“包函数”影响,不会再随更外层空间改变而变化。

def f1():
    x = 1
    def f2():
        x = 2
        def f3():
            print(x)
        f3()
    f2()
x = 4
f1()  # 结果为 2
# '闭函数' f3 的'包函数'是 f2,所以 f3 内需要引用 x 的值时,会向 f2 查找,的到结果 x = 2,其他区域 x 的值都不会对其有影响。

  4、闭包函数结合函数对象:

def f1():
    x = 1
    def f2():
        print(x)
    return f2
f3 = f1()  # 执行'包函数' f1 则返回'闭函数' f2 并赋值给 f3
f3()  # 通过执行 f3 而执行了 f2 的功能

  5、闭包函数与传参:

def f1(x):
    def f2():
        print(x)  # '闭函数' f2 需要引用的 x 的值来源于'包函数' f1 的形参 x 所接受的 实参值
    f2()
f1(1)  # 给 f1 传值 1 等于把 1 传递给了 f2 使用

 

posted on 2020-01-03 10:01  焚音留香  阅读(229)  评论(0编辑  收藏  举报