第八章、函数进阶之闭包函数01

第八章、函数进阶之闭包函数01

回顾

函数对象:可以将定义在函数内的函数返回到全局使用,打破了函数的层级限制

名称空间与作用域:作用域关系在函数定义阶段就已经固定死了,与调用位置无关,在任意位置调用函数都需要跑到定义函数时找到作用域关系

def f1():
    x = 1
    def inner():
        print(x)
    return inner

func = f1()
func()
x = 2


def f2():
    x = 3
    func()


f2()
1
1

一、什么是闭包

闭包:函数内部函数对外部作用域而非全局作用域的引用

def outter():
    x = 1

    def inner():
        print(x)
    return inner


f = outter()


def f2():
    x = 2
    f()


f2()

1.1 两种为函数传值的方式

为函数传值的方式一:使用参数的形式

def func(x):
    print(x)


func(1)
func(1)
func(1)

为函数传值的方式二:包给函数

def outter():
    def inner():
        print(x)
    return inner

f = outter(1)
f()
f()
f()
# 查看闭包的元素
print(F"f.__closure__[0].cell_contents: {f.__closure__[0].cell_contents}")

二、闭包函数的应用

闭包的意义:返回的函数对象,不仅仅是一个函数对象,还在函数外包裹了一层作用域,这就使得这个函数无论在哪调用,都优先使用自己外层包裹的作用域。

应用领域:延迟计算、爬虫

def get_res(url):
        responce=requests.get(url)
        print(responce.content)
        print(responce.text)
get_res("http://www.baidu.com")
get_res("http://www.baidu.com")

闭包可以简化代码

import requests
def func(url):
    def get_res():
        responce=requests.get(url)
        print(responce.content)
        print(responce.text)
    return get_res

baidu_spider=func("http://www.baidu.com")
baidu_spider()
baidu_spider()
posted @ 2019-08-12 15:12  得淼  阅读(134)  评论(0编辑  收藏  举报