先理解一下函数的引用与调用
# 先定义一个函数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
网友评论