学习视频:https://www.bilibili.com/video/BV1SE411N7Hi?p=63
理论概念:https://guobaoyuan.gitee.io/new_book/Python/13-2%20%E9%97%AD%E5%8C%85.html
以下内容仅供个人学习使用,侵删
#!/usr/bin/env python
# -*- coding:utf-8 -*-
'''
闭包:函数的嵌套
闭包:不使用全局变量,(且不是本层变量)就是闭包
为什么学习:闭包的作用就是能够保护数据的安全性及干净性
闭包怎么用:
闭包的应用场景: 装饰器;保护数据的安全性
'''
def foo():
lst=[]#保证不会被其他人定义的同一变量名的变量修改内容,从而保证安全性
def func(money):
lst.append(money)#变量提升,自由变量
print(sum(lst)/len(lst))
return func
func=foo()
func(150000)#第一天
func(250000)#第二天
func(300000)#第三天
func(150000)#第四天
lst=[12,3,4,5,6]
print(sum(lst)/len(lst))#此处的lst不会影响上面的lst
def foo1():
a=[]
def func(num):
a.append(num)
print(a)
return func
ret=foo1()
ret(1)#[1]
ret(2)#[1,2]
ret(3)#[1,2,3]
#----------
foo1()(1)#[1]
foo1()(2)#[2]
#----------
#注意与下面函数的区别
def foo(num):
a=[]
def func(num):
a.append(num)
func(num)
print(a)
foo(1)#[1]
foo(2)#[2]
foo(3)#[3]
#判断以下内容是不是闭包
def foo(a):
def func(a):
print(a)#此处a使用的是本层的
print(func.__closure__)#查看是否为闭包,None,不是闭包
return func
a=10
ret=foo(a)#ret=func
ret(a)#func(10)
# 不是闭包
#修改后,是闭包
def foo(a):
def func():
print(a)
print(func.__closure__)#有内容,则为闭包,(<cell at 0x0000021639E537F8: int object at 0x0000000071E661C0>,)
return func
a=10
ret=foo(a)#ret=func
ret()#func(10)
#---练习----
#肉眼验证是否为闭包 三要素:
# 1.最里层的函数有没有形参
# 2.最里层的函数有没有定义变量
# 3.全局空间有没有这个变量
# 例一:
def wrapper():
a = 1
def inner():
print(a)
return inner
ret = wrapper()
#是闭包
#----------------------
def wrapper():
a = 1
def foo():
def inner():
print(a)
return inner
return foo
ret = wrapper()
#是闭包
# 例二:
a = 2
def wrapper():
def inner():
print(a)
print(inner.__closure__)#none
return inner
ret = wrapper()
#不是闭包,用的全局变量
# 例三:
def wrapper(a,b):#传参,隐形赋值,用的不是全局的
def inner():#从加载顺序看,在inner找a,b,再在wrapper找a,b,找到了,没有使用全局的a,b
print(a)
print(b)
print(inner.__closure__)
return inner
a = 2
b = 3
ret = wrapper(a,b)
#是闭包