# 闭包函数 ''' 闭包: 内函数使用了外函数的局部变量, 并且外函数把内函数返回出来的过程是闭包 这个内函数叫做闭包函数; ''' # (1) 基本语法 def outer(): a = 5 b = 6 # inner 是闭包函数 def inner(): print(a,b) return inner res = outer() # res = inner print(res) res() # res() = inner() # 获取闭包函数使用的变量 __closure__ , cell_contents (了解) tup = res.__closure__ print("<==1==>") print(tup) # 获取元组里面第一个元素 obj = tup[0] print(obj) # 使用cell_contents来获取单元对象当中的值 res = obj.cell_contents print(res) obj2 = tup[1] res2 = obj2.cell_contents print(res2) print("<==2==>") # 闭包的特点: """ 内函数使用了外函数的局部变量,外函数的局部变量与内函数发生绑定,延长该变量的生命周期 (实际内存给它存储了这个值,暂时不释放) """ # (2) 闭包函数特点 def majunqiang_family(): dajie = "马蓉" erjie = "马冬梅" kuang = "金矿" # money 局部变量因为在闭包函数中使用,于是发生绑定,延长该变量的生命周期 money = 1000 def dajie_hobby(): nonlocal money money -= 900 print("大姐喜欢花钱,喜欢买兰博基尼,喜欢买比基尼,喜欢买channel,家里钱还剩下%d" % (money)) def erjie_hobby(): nonlocal money money += 500 print("二姐马冬梅喜欢赚钱,喜欢上长春扎疫苗,因为假疫苗能赔偿,喜欢卖血,5块钱一瓶,家里钱赚了%d" % (money)) def master(): # 返回一个元组,元组里面的每一个元素是函数 return (dajie_hobby,erjie_hobby) return master func = majunqiang_family() tup = func() print(tup) # 大姐函数 dajie = tup[0] dajie() # 二姐函数 erjie = tup[1] erjie()