首页 > 其他分享 >函数对象、闭包函数

函数对象、闭包函数

时间:2024-04-15 19:34:06浏览次数:25  
标签:闭包 return 函数 get 对象 url add def

【一】函数对象

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

【1】可以直接被引用

定义一个函数用一个新的变量名来存,用新的变量名来调用

# 定义一个函数
def add(x, y):
    return x + y


# 将函数地址绑定给一个变量
func = add
# 通过这个变量找到对应的地址,从而调用函数
res = func(1, 2)
print(res) # 3

【2】可以作为元素被存储

功能字典中的函数地址

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


dic = {'add': add, 'max': max}
print(dic)  # {'add': <function add at 0x0000020523843E20>, 'max': <built-in function max>}
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) # 3

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

我们直接将函数的内存地址返回

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


def bar():
    return add


func = bar()
print(func)  # <function add at 0x00000239EC363E20>
res = func(1, 2)
print(res)  # 3

【二】闭包函数

【1】什么是闭包函数

  • 闭包函数就是对外部作用域有引用的函数
  • 内嵌函数对外部函数作用域有引用,那这个内嵌函数就叫闭包函数
# 定义全局变量
x_global = 1


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

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

    return inner


func = outer()
func()  
# 结果为2

【2】闭包函数的应用

[1]将值以参数的形式传入
import requests

# 将值以参数的形式传入
def get(url):
    return requests.get(url).text
[2]将值包给函数
import requests

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

    return get
[3]对比
  • 方式一在下载同一页面时需要重复传入url
  • 方式二只需要传一次值,就会得到一个包含指定url的闭包函数,以后调用该闭包函数无需再传url
import requests


# 将值以参数的形式传入
def get(url):
    return requests.get(url).text


# 方式一下载同一页面
get('https://www.python.org')
get('https://www.python.org')
get('https://www.python.org')
import requests


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

    return get


# 方式二下载同一页面
python = page('https://www.python.org')
python()
python()
python()

【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

标签:闭包,return,函数,get,对象,url,add,def
From: https://www.cnblogs.com/chosen-yn/p/18136742

相关文章

  • 函数的调用方式、函数的参数、类型提示语、名称空间
    【一】函数的调用方式defstudent(name,age):print(f"mynameis{name}andmyageis{age}")[1]直接调用函数函数名()----->调用函数student(name='max',age=18)[2]用表达式调用函数用一个新变量存储函数的内存地址然后调用defadd(x,y):returnx......
  • 9.函数参数 与 名称空间
    【一】函数作为参数1)分类1.形参函数定义时,括号内声明的值;用来接收外部传来的值2.实参函数调用时,括号内传入的得值;常是常量,变量,表达式或三者组合2)位置参数参数数量不对会报错必须按照顺序传入,否则顺序会乱3)关键字参数需指定定义时的名字,可不按位置传入4)默认参数......
  • 对象模型 - this
    对象模型-this通过一个对象来调用一个函数,那么对象的地址就是this虚函数的模板方法使用方式templatemethod示例代码:#pragma#ifndef__THIS_TEMPLATE_MODEL__#define__THIS_TEMPLATE_MODEL__​classCDocument{public:virtualvoidSerialize();voidOnFileOpen......
  • const在类和函数之间的运用
    const在类和函数之间的运用第一种情况简单来说就是如果声明了一个const类但是调用了非const的方法.那么编译会不通过->const类只能调用const方法,非const类就都可以调用示例代码:宏定义:#pragma#ifndef__CONST_OBJECT__#define__CONST_OBJECT__​#include<iostream>#incl......
  • JS 中的函数式 - 常用概念
    一、柯里化-currying柯里化的意思是将一个多元函数,转换成一个依次调用的单元函数,用表达式表示: f(a,b,c)→f(a)(b)(c)  核心代码实现:exportfunctioncurry(fn){letlen=fn.length;//收集目标函数的参数个数(总)returnfunctioncurriedFn(...params){......
  • 在 C 中定义函数 - 如何定义 C 中的函数
    在C编程中,函数扮演着基本的角色。它们使您能够编写组织良好且易于维护的代码。在本文中,您将学习在C中定义函数的基础知识。(本文视频讲解:java567.com)C中的函数是什么?在编程中,函数是执行特定任务的代码块。函数接受输入,处理它们,执行操作,并产生输出。函数很重要,因为它们组......
  • C++_内存模型和函数以及类
    C++内存模型函数函数与编译器类成员变量class内部通过 static修饰变量时,表示该变量为静态成员变量,必须在类外定义 staticconst修饰变量时,表示该变量为静态成员常量,可以在类内初始化,或者在类外初始化 staticconstexpr修饰变量时,表示该......
  • ES6对象object
    <!DOCTYPEhtml><html><head> <metacharset="utf-8"> <metaname="viewport"content="width=device-width,initial-scale=1"> <title>ES6对象object</title></head><body> <......
  • 函数对象,闭包函数及装饰器了解
    函数对象【1】定义函数对象指的是函数可以被当做数据来处理【2】可以直接被引用定义一个函数用一个新的变量名来存,用新的变量名来调用#定义一个函数defadd(x,y):returnx+y#将函数地址绑定给一个变量func=add#通过这个变量找到对应的地址,从而调用函数res......
  • hash()函数在python2和python3的区别
    在Python3中,对于字符串类型的对象,hash()函数会根据当前进程的种子值计算哈希值。这个种子值在每次Python进程启动时都会随机生成。因此,即使是相同的字符串,在不同的Python进程中调用hash()函数会得到不同的哈希值。这种设计的目的是为了增加哈希表的随机性,从而提高安全性......