美文网首页
python闭包

python闭包

作者: 吱吱菌啦啦 | 来源:发表于2022-04-14 18:17 被阅读0次
    先理解一下函数的引用与调用
    # 先定义一个函数cc
    def cc():
        print("测试一下")
    
    # 函数调用,打印的是内存地址
    print(cc)
    
    # 函数赋值,把函数cc对象赋值给变量zz,此时打印变量,打印的是内存
    zz = cc
    print(zz)
    # 再赋值一次,此时打印变量,依然打印的是内存
    jj = cc
    print(jj)
    
    # 引用函数,打印的是函数cc()的结果
    jj()
    

    打印结果:

    <function cc at 0x10cf58160>
    <function cc at 0x10cf58160>
    <function cc at 0x10cf58160>
    测试一下
    
    闭包
    • 函数套函数,内部函数对外部函数的引用
    • 无法对外部函数的局部变量进行修改
    # 外函数
    def grade(grade):
      # 内函数
        def output_students(name, gender):
            print(f"姓名{name}, 性别{gender},年级{grade}")
        # 闭包概念内部调用外部,如果不return,内部函数output_students无法调用;这里return 的是函数output_students()的内存地址
        return output_students 
    
    # 调用外层函数,grade()指向output_students
    info = grade("一年级") 
    # 这里打印的是内函数的内存地址
    print(info) 
    # 引用grade()函数,打印结果
    info("zz", "女") 
    # 引用grade()函数,打印结果
    info("cc", "男") 
    

    打印结果

    <function grade.<locals>.output_students at 0x103567e50>
    姓名zz, 性别女,年级一年级
    姓名cc, 性别男,年级一年级
    

    题目:求这段代码的输出结果

    def adder(x):
        def wrapper(y):
            return x + y
        return wrapper
    adder5 = adder(5)
    print(adder5(adder5(6)))
    

    解析:
    闭包过程:
    1.一个函数(外函数)内部定义了一个函数(内函数)
    2.内函数调用了外函数的变量
    3.并且外函数的返回值是内函数的引用
    所以,adder5=adder(5),x=5,adder返回值为wrapper
    adder5(6),此时wrapper(6),y=6,所以值为11
    adder5(adder5(6)),同理,adder5(adder5(6))变成了adder5(11),y=11,所以值为11+5=16

    相关文章

      网友评论

          本文标题:python闭包

          本文链接:https://www.haomeiwen.com/subject/wpxxertx.html