首页 > 编程语言 >Python高级之函数对象与闭包函数

Python高级之函数对象与闭包函数

时间:2024-05-09 15:11:32浏览次数:24  
标签:闭包 __ 函数 Python res inside def

【一】函数对象

  • 函数对象是指函数可以被当成数据来处理,python中一切皆为对象

【1】函数可以被引用

def add(a, b):
    return a + b


res = add(3, 4)
print(res)  # 7

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

def add(a, b):
    return a + b


num_list = [add, 1]
res = num_list[0](3, 4)
print(res)  # 7

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

def add(a, b):
    return a + b


def multi(a, b, function):
    return function(a, b)


res = multi(3, 4, add)
print(res)  # 7

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

def add(a, b):
    return a + b


def multi():
    return add


func = multi()
res = func(3, 4)
print(res)  # 7

【二】闭包函数

【1】什么是闭包

  • 闭包是指包含对自由变量的函数和对这些变量的引用环境的组合
a = 1 # 全局变量


def outside():
    def inside():
        print(a)

    return inside


def func():
    inside = outside() # 将函数Iinside的内存地址赋给变量inside
    inside() # 再调用inside


func()  # 1

【2】什么是闭包函数

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


def outside():
    a = 2  # 局部变量

    def inside():
        print(a)

    return inside


res = outside()  # 拿到函数inside的内存地址
# 需要再次调用它
res()  # 2

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

  • 使用函数的closure属性,查看到闭包函数所包裹的外部变量
a = 1  # 全局变量


def outside():
    a = 2  # 局部变量

    def inside():
        print(a)

    return inside


res = outside()  # 拿到函数inside的内存地址
# 需要再次调用它
res()  # 2

res_first = res.__closure__
print(res_first)  # (<cell at 0x000001945A08B9A0: int object at 0x0000019459AA0110>,)

print(dir(res.__closure__[0]))
'''
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'cell_contents']
'''

# __closure__ 属性是一个元组,包含了函数闭包中的每个 cell 对象。每个 cell 对象都有一个 cell_contents 属性,它存储着相应的值。
res_second = res.__closure__[0].cell_contents
print(res_second)  # 2

标签:闭包,__,函数,Python,res,inside,def
From: https://www.cnblogs.com/ligo6/p/18179999

相关文章

  • Python高级之函数的参数
    【一】形参和实参函数的参数分为形参和实参,形参就是定义在函数名后面括号里的参数(用来接收外部传来的值),实参就是调用函数时,括号里传进去的值(值可以是常量、变量、表达式)defadd(x,y):returnx+y#实参是常量print(add(3,4))#输出7#实参是变量x=3y=4prin......
  • Python高级之函数
    【一】函数的基本使用我们在前面的学习中,所有的功能代码都集中在一块,需要使用同一功能时,需重复编写该功能的代码,这样比较麻烦,当我们到后面代码变得越来越长,也不利于我们修改其中一个小功能的代码我们完全可以从现实生活中找到简化程序设计的方案:比如一个修理工会事先准备好螺......
  • xlwings:在Excel中集成Python
    Github地址:https://github.com/xlwings/xlwings在现代数据分析和报表生成中,MicrosoftExcel仍然是一款非常流行和强大的工具。与此同时,Python作为一种高级编程语言,具备出色的数据处理和分析能力。那么,有没有一种方法可以将Excel和Python完美结合,以发挥它们各自的优势?答案是肯定的......
  • pybuilder:Python项目构建、测试、文档、发布
    Github地址:https://github.com/pybuilder/pybuilder在Python项目开发中,良好的构建和自动化流程是非常重要的。PyBuilder是一个用于构建Python项目的工具,它提供了简单易用的方式来定义和管理项目的构建过程,包括依赖管理、测试、代码质量检查等。本文将深入探讨PyBuilder库的使用......
  • Python 如何优雅的操作 PyMySQL
    一、PyMysql在使用Python操作MySQL数据过的过程中,基本的增删改查操作如何更加高效优雅的执行。这里将以PyMySQL为例,介绍一下如何使用Python操作数据库。Python对MySQL数据库进行操作,基本思路是先连接数据库Connection对象,建立游标Cursor对象,然后执行SQL语句对数据库进行操作......
  • 7个鲜为人知的 Python 好库!
    https://mp.weixin.qq.com/s/eY1QXpwbTNSOd08Wfpg4sQ①-PivotTableJS无需任何代码就可以在JupyterNotebook中交互式地分析数据。https://pypi.org/project/pivottablejs/②-PyTube只需5行代码就可以下载油管视频。可能这个是国内用户最用不到的Python库了。https://pytu......
  • 四款强大的 Python 可视化库
    ......
  • nicegui:Python 图形界面库,简单好用
    前言在现代计算机应用程序开发中,图形用户界面(GUI)是用户与程序交互的重要组成部分。然而,GUI开发往往需要大量的代码和复杂的布局,给开发者带来了一定的挑战。在本篇博文中,将介绍nicegui,它是一个简单易用的图形用户界面库,提供了一种简化GUI开发的方式,使开发者能够更快速地构建吸......
  • locust:Python 分布式压力测试(带WebUI)
    Locust介绍它采用纯Python实现,是一个分布式用户负载测试的工具。使用基于Requests库的客户端发起请求,使编写脚本大大简化;在模拟并发方面摒弃进程和线程,完全基于时间驱动,采用协程(gevent)提供的非阻塞IO和coroutine来实现网络层的并发请求。因此单台压力机也能产生数千......
  • python 集合类型 set
    set定义集合(Set)是一种无序且不重复的数据结构,用于存储一组唯一的元素。时间复杂度O(1)。集合是由一对花括号{}构成,其中每个元素之间用逗号分隔。集合中的元素必须是不可变的(不可修改),可以包含数字、字符串、元组等不可变类型。集合中的元素不重复,即集合中每个元素是唯一的。......