Python函数对象与闭包函数

发布时间 2023-12-11 16:11:38作者: Fredette

【一】函数对象

  • 函数对象指的是函数可以被当做 数据 来处理,具体可以分为四个方面的使用

【1】函数可以被引用

def add(x,y):
    return x + y

func = add
res = func(1,2)
print(res)

【2】函数可以作为容器类型的元素

def add(x,y):
    return x + y

dic = {'add':add,'max':max}
print(dic)

res = dic['add'](1, 2)
print(res)  # 3

【3】函数可以作为参数传入另外一个参数

def add(x,y):
    return x + y
 
 def foo(x,y,func):
     return func(x,y)
 
 res = foo(1,2,add)
print(res)

【4】函数的返回值可以是一个函数

def add(x,y):
    return x + y

def bar():
    return add()

func = bar()
print(func)
res = func(1,2)
print(res)

【二】闭包函数

  • 闭包是指包含对自由变量的函数和对这些变量的引用环境的组合。
  • 基于函数对象的概念,可以将函数返回到任意位置去调用
  • 但作用域的关系是在定义完函数时就已经被确定了的,与函数的调用位置无关。
x_global = 1

def outer():
    def inner():
        print(x_global)
    return inner

def func():
    x_func = 3
    inner = outer()
    inner()

func()

【1】什么是闭包函数

  • 也就是说函数被当做数据处理时,始终以自带的作用域为准。
  • 若内嵌函数包含对外部函数作用域(而非全局作用域)中变量的引用
  • 那么该’内嵌函数’就是闭包函数,简称闭包(Closures)
x_global = 1

def outer():
    x_global = 2

    def inner():
        print(x_global)
    return inner

func = outer()
func()

【2】如何查看闭包函数所包裹的外部变量

x_global = 1


def outer():
    # 定义局部变量,覆盖全局变量
    x_global = 2

    def inner():
        # 打印外部函数的局部变量
        print(x_global)
    return inner

func = outer()
func()

【3】闭包函数用途

(1)将值以参数的形式传入

import requests

def get(url):
    return requests.get(url).test

(2)将值包给函数

import requests

def page(url):
    def get():
        return requests.get(url).test

    return get

(3)函数工厂

import requests


# 将值包给函数
def page(url):
    def get():
        return requests.get(url).text

    return get

python = page('https://www.python.org')
java = page('https://www.java.com')

(4)封装

def counter():
    count = 0

    def increment():
        nonlocal count
        count += 1
        return count

    return increment

counter1 = counter()
counter2 = counter()

print(counter1())  # 1
print(counter1())  # 2
print(counter2())  # 1