一、函数对象
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 使用