python學習-day10(閉包)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章