目录
第八章、函数进阶之闭包函数01
回顾:
函数对象:可以将定义在函数内的函数返回到全局使用,打破了函数的层级限制
名称空间与作用域:作用域关系在函数定义阶段就已经固定死了,与调用位置无关,在任意位置调用函数都需要跑到定义函数时找到作用域关系
def f1(): x = 1 def inner(): print(x) return innerfunc = f1()func()x = 2def f2(): x = 3 func()f2()
11
一、什么是闭包
闭包:函数内部函数对外部作用域而非全局作用域的引用
def outter(): x = 1 def inner(): print(x) return innerf = 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 innerf = 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 requestsdef func(url): def get_res(): responce=requests.get(url) print(responce.content) print(responce.text) return get_resbaidu_spider=func("http://www.baidu.com")baidu_spider()baidu_spider()