Python函数对象与闭包函数

【一】函数对象

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

【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
posted @   Fredette  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在外漂泊的这几年总结和感悟,展望未来
· 博客园 & 1Panel 联合终身会员上线
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· https证书一键自动续期,帮你解放90天限制
· 在 ASP.NET Core WebAPI如何实现版本控制?
点击右上角即可分享
微信分享提示