學習視頻: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)
#是閉包