闭包函数

闭包函数

一、理解闭包须知

1、闭包函数=名称空间与作用域+函数嵌套+函数对象

2、核心点:名字的查找关系是以函数定义阶段为准

二、什么是闭包函数

“ 闭”的概念:闭函数指的是该函数是内嵌函数;打个比方:笼子内放一个小白鼠,小白鼠就是相对于笼子的比函数。

“包的概念:”包函数指的是该函数包含对外层函数作用域名字的引用(注意:不是对全局的作用域,只是局部的作用域):打个比方:笼子的小白鼠要吃东西,只能在笼子找。

闭包函数:名称空间于作用域的应用+函数的嵌套

def f2():
    x = 11111

    def f1():
        print(x)

    f1()
#f2与f1就是闭包函数,借上述的比喻,f1是相对于f2的闭函数相当于
#笼子的小白鼠,f2是相对于f1的包函数相当于笼子,f1名称的查找只会去
#f2函数体内查找,于其他任何函数定义于调用无关,因为它们都不是f1函数的
#包

x = 22222


def f3():
    x = 33333
    f2()


def f4():
    x = 44444
    f3()


f4()  #打印1111

三、闭包函数:函数对象

def f1():
    x = 33333333333333333333
    def f2():
        print('函数f2:',x)
    return f2

f=f1()
print(f)

x=4444
f()
def foo():
    x=5555
    f()

foo()

三:为何要有闭包函数=》闭包函数的应用

两种为函数体传参的方式

方式一

直接把函数体需要的参数定义成形参

def f2(x):
    print(x)

f2(1)
f2(2)
f2(3)

方式二

def f1(x): # x=3
    x=3
    def f2():
        print(x)
    return f2

x=f1(3)
print(x)

x()  #间接对闭包函数进行传参

四、

获取网站内存对应上述原理的两种传承方式

方式一

如果多次只需要获得一个网站的内容时,需要重复的将网址传入形参。

import requests


def get(url):
    response = requests.get(url)
    print(len(response.text))


get('https://www.baidu.com')
get('https://www.cnblogs.com/zhangtieshan/')
get('https://zhuanlan.zhihu.com/p/109056932')

方式二

如果多次只需要获得一个网站的内容时,不需要重复的将网址传入形参,将闭包函数的调用赋值给一个变量后,每次调用时,在变量后加括号就行,省去了重复传入网址的操作。

import requests


def outter(url):
    url = 'https://www.baidu.com'

    def get():
        response = requests.get(url)
        print(len(response.text))

    return get


baidu = outter('https://www.baidu.com')
baidu()
baidu()
baidu()
baidu()
baidu()
posted @ 2020-03-20 23:36  风起千寻  阅读(460)  评论(0编辑  收藏  举报