python闭包

2022-04-14  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读