函数进阶-01闭包函数

  • 函数对象:能够将定义在函数内的函数返回到全局使用,从而打破函数的层级限制。
  • 名称空间与做用域:做用域关系在函数定义阶段时就已经固定死了,与调用位置无关,即在任意位置调用函数都须要跑到定义函数时找到做用域关系。
def f1():
    x = 1

    def inner():
        print(x)
    return inner

func = f1()
x = 2

def f2():
    x = 3
    func()

f2()

1
一丶什么是闭包
闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部做用域而非全局做用域的变量的引用)。闭包指的是:函数内部函数对外部做用域而非全局做用域的引用。
提示:以前咱们都是经过参数将外部的值传给函数,闭包提供了另一种思路,包起来喽,包起呦,包起来哇。python

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)

1 1 1函数

为函数传参的方式二:包给函数url

def outter(x):
    x = 1

    def inner():
        print(x)
    return inner


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

1 1 1 f.__closure__[0].cell_contents: 1code


二丶闭包函数的应用

闭包的意义:返回的函数对象,不单单是一个函数对象,在该函数外还包裹了一层做用域,这使得,该函数不管在何处调用,优先使用本身外层包裹的做用域。对象

应用领域:延迟计算(原来咱们是传参,如今咱们是包起来)、爬虫领域。
不用闭包的繁琐代码:blog

import requests


def get(url):
    response = requests.get(url)
    print(f"done: {url}")
    
get('https://www.baidu.com')
get('https://www.baidu.com')
get('https://www.baidu.com')


get('https://www.cnblogs.com/linhaifeng')
get('https://www.cnblogs.com/linhaifeng')
get('https://www.cnblogs.com/linhaifeng')

done: https://www.baidu.com done: https://www.baidu.com done: https://www.baidu.com done: https://www.cnblogs.com/linhaifeng done: https://www.cnblogs.com/linhaifeng done: https://www.cnblogs.com/linhaifeng
上面的方式是极其复杂的,咱们若是使用默认参数也只能解决一个网址,所以咱们能够考虑使用闭包的方式。作用域

import requests


def outter(url):
    def get():
        response = requests.get(url)
        print(f"done: {url}")
    return get

baidu=outter('https://www.baidu.com')
python = outter('https://www.python.org')

baidu()
baidu()

python()
python()

done: https://www.baidu.com done: https://www.baidu.com done: https://www.python.org done: https://www.python.orgget

相关文章
相关标签/搜索