04_04、函数对象与闭包

一、函数对象

  简单来说,函数对象其实就是函数名,函数名具体有4中用法

  注意:函数名后面跟括号,表示函数被调用

  用法一

    函数名可以当成变量赋值

def index():
    print('from index')


a = index  # 把函数名index赋值给a
a()        # a +()代表函数自定义函数已被调用
print(a)  # 函数名就是内存地址

 

  用法二

    函数名可以当成函数的参数

复制代码
def index():
    print('from index')


def func(a):
    a()
    print('from func')


# 把函数名index作为函数func的参数
func(index)  
复制代码

  用法三

    函数名也可以当成函数的返回值

复制代码
def index():
    print('from index')


def func():
    print('from func')
    return index  # 函数名index作为函数func的返回值


res = func()
res()
复制代码

  用法四

    函数名也可以当成容器(可以存放多个元素)类型的元素

def index():
    print('from index')


l = [1, 2, 3, index]
# 函数名index当成列表l的一个元素
print(l)

二、函数的嵌套

  1、函数的嵌套调用

    所谓的函数嵌套调用,简单来说就是函数里面调用另一个函数

复制代码
def index():
    print('from index')


def func():
    index()  # 在函数func里调用函数index
    print('from func')


func()
复制代码

    应用案例1:

# 1.比较两个数的大小
def my_max(a, b):
    if a > b:
        return a
    return b


# my_max(1, 2)

    应用案例2:

复制代码
# 2. 比较4个数的大小
def many_max(a, b, c, d):
    # 先两两比较,a,b
    res = my_max(a, b)
    res1 = my_max(res, c)
    res2 = my_max(res1, d)
    return res2

print(many_max(1,2,3,4))
复制代码

  2、函数的嵌套定义    

    函数的嵌套定义是指在函数里面再定义另一个函数

    其中一个用途是把复杂的功能隐藏起来,方便操作

复制代码
def all_func(type):
    def register():
        print('注册')

    def login():
        print('登录')

    def transfer():
        print('转账')

    def withdraw():
        print('提现')

    if type == 1:
        register()
    elif type == 2:
        login()
    elif type == 3:
        transfer()
    elif type == 4:
        withdraw()
    else:
        print('好好输入')


all_func(1)
# all_func(2)
复制代码

三、闭包函数

  1、闭包函数定义

    所谓闭是——定义在函数内部的函数(函数至少要有两层)

    所谓包是——内部函数必须使用外部函数的数据

    闭包函数就是同时满足“闭”和“包”两个条件的函数

复制代码
# 闭:两个函数a和b
# 包:函数b中x,需要从函数a中调用
# 这就是一个闭包函数
def a():
    x = 1

    def b():
        print(x)
    b()


a()
复制代码

  2、闭包函数的用途

    函数传参的基本方式是通过写入实参向形参赋值

复制代码
# my_max是一个比较a,b大小的函数
def my_max(a, b):
    if a > b:
        return a
    return b


print(my_max(1, 2))
# 直接写入实参传给形参
复制代码

    闭包函数则提供了第二种传参的方式

    这种传参方式的底层方式依然是实参向形参传输

    不同点在于实参不直接向功能函数传参,而是向外层空间函数传参

    优点是可以不改变原有代码和调用方式

复制代码
def outer(a, b):
    def my_max():
        if a > b:
            return a
        return b

    return my_max


res = outer(2, 20)  # 此时outer()的返回值是my_max
print(my_max())  # my_max()是函数名my_max的值,并赋给res
复制代码

 

 

 

posted @   三三得九86  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示