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)
#是闭包

 

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