返回顶部
首页 > 资讯 > 后端开发 > Python >如何理解及使用Python闭包
  • 107
分享到

如何理解及使用Python闭包

2024-04-02 19:04:59 107人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、python 中的作用域规则和嵌套函数二、定义闭包函数三、何时使用闭包? 四、总结一、Python 中的作用域规则和嵌套函数 每当执行一个函数时,就会创建一个新的局部命名空间

一、Python 中的作用域规则和嵌套函数

每当执行一个函数时,就会创建一个新的局部命名空间,它表示包含函数体内分配的函数参数和变量名的局部环境。我们可以将名称空间看作一个字典,其中键是对象名称,值是对象本身。

解析名称时,解释器首先搜索本地命名空间。如果不存在匹配,则搜索全局名称空间,该名称空间是定义函数的模块。如果仍然没有找到匹配项,则在引发 NameError 异常之前最终检查内置名称空间。下图说明了这一点:

让我们考虑下面的例子:


age = 27
def birthday(): 
  age = 28
birthday()
print(age)  # age will still be 27
>>
27

当变量在函数内部赋值时,它们总是绑定到函数的本地名称空间; 因此,函数体中的变量 age 指的是一个包含值28的全新对象,而不是外部变量。可以使用全局语句更改此行为。下面的示例强调了这一点:


age = 27
name = "Sarah"
def birthday(): 
  global age       # 'age' is in global namespace 
  age = 28
  name = "Roark"
birthday()         # age is now 28. name will still be "Sarah"

Python 也支持嵌套函数定义(函数内部的函数):


def countdown(start):
  # This is the outer enclosing function
  def display():
    # This is the nested function
    n = start
    while n > 0:
      n-=1
      print('T-minus %d' % n)
 
  display()
# We execute the function
countdown(3)
>>>
T-minus 3
T-minus 2
T-minus 1

二、定义闭包函数

在上面的示例中,如果函数 countdown()的最后一行返回了 display 函数而不是调用它,会发生什么情况?这意味着该函数的定义如下:


def countdown(start):
  # This is the outer enclosing function
  def display():
    # This is the nested function
    n = start
    while n > 0:
      n-=1
      print('T-minus %d' % n)
  return display
# Now let's try calling this function.
counter1 = countdown(2)
counter1()
>>>
T-minus 2
T-minus 1

使用值2调用 countdown()函数,并将返回的函数绑定到名称 counter1。在执行 counter1()时,它使用最初提供给 countdown ()的 start 值。因此,在调用 counter1()时,尽管我们已经执行了 count1()函数,但仍然记住这个值。

这种将一些数据(本例中为2)附加到代码的技术在 Python 中称为闭包。

即使变量超出范围或函数本身从当前名称空间中移除,也会记住封闭范围中的这个值。我们可以尝试下面的代码来确认:


>>> del countdown
>>> counter1()
T-minus 2
T-minus 1
>>> countdown(2)
Traceback (most recent call last):
...
NameError: name 'countdown' is not defined

三、何时使用闭包?

当一个类中实现的方法很少(大多数情况下只有一个方法)时,闭包可以提供一个替代的、更优雅的解决方案。此外,如果我们希望根据延迟或延迟计算的概念编写代码,闭包和嵌套函数特别有用。下面是一个例子:


from urllib.request import urlopen
def page(url): 
  def get(): 
    return urlopen(url).read() 
  return get

在上面的示例中,page ()函数实际上并不执行任何计算。相反,它只是创建并返回一个函数 get () ,该函数在调用 WEB 页面时获取页面内容。因此,在 get ()中执行的计算实际上被延迟到计算 get ()时程序中的某个后续点。例如:


>>> url1 = page("Http://www.Google.com") 
>>> url2 = page("http://www.bing.com") 
>>> url1
<function page.<locals>.get at 0x10a6054d0>
>>> url2
<function page.<locals>.get at 0x10a6055f0>
  
>>> gdata = url1()     # Fetches http://www.google.com 
>>> bdata = url2()     # Fetches http://www.bing.com
>>>

可以找到闭包函数中包含的值。

所有函数对象都有一个 _closure_ 属性,如果它是一个闭包函数,那么这个属性将返回一组单元格对象。根据上面的例子,我们知道 url1和 url2是闭包函数。


>>> page.__closure__       # Returns None since not a closure
>>> url1.__closure__
(<cell at 0x10a5f1250: str object at 0x10a5f3120>,)

单元格对象具有存储关闭值的属性 cell_contents。


>>> url1.__closure__[0].cell_contents
'http://www.google.com'
>>> url2.__closure__[0].cell_contents
'http://www.bing.com'

四、总结

当嵌套函数引用其封闭范围中的值时,可以定义 Python 中的闭包。闭包提供了某种形式的数据隐藏。闭包还可以是一种高效的方法,可以在一系列函数调用之间保持状态。用 Python 创建一个闭包函数:

  • 我们必须有一个嵌套的函数
  • 嵌套函数必须引用封闭函数中定义的值
  • 封闭函数必须返回嵌套函数

到此这篇关于如何理解及使用Python闭包的文章就介绍到这了,更多相关Python闭包内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 如何理解及使用Python闭包

本文链接: https://lsjlt.com/news/127296.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解及使用Python闭包
    目录一、Python 中的作用域规则和嵌套函数二、定义闭包函数三、何时使用闭包? 四、总结一、Python 中的作用域规则和嵌套函数 每当执行一个函数时,就会创建一个新的局部命名空间...
    99+
    2024-04-02
  • 如何理解Python中的闭包Closure
    如何理解Python中的闭包Closure,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都...
    99+
    2023-06-17
  • Python中的闭包使用及作用
    目录1.什么是闭包2.闭包的实例3.闭包和装饰器的区别1.什么是闭包 当我们在外部函数中定义了一个内部函数,并且内部函数能够读取到外部函数内的变量,这种函数我们就称为闭包。简单来说,...
    99+
    2024-04-02
  • JavaScript闭包如何理解
    这篇“JavaScript闭包如何理解”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Jav...
    99+
    2024-04-02
  • 如何正确的使用Python闭包
    如何正确的使用Python闭包?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Python 中的作用域规则和嵌套函数每当执行一个函数时,就会创建一个新的局部命...
    99+
    2023-06-15
  • JavaScript闭包原理及作用详解
    目录简介闭包的用途柯里化实现公有变量缓存封装(属性私有化)闭包的原理垃圾收集简介实际开发中的优化简介 说明 本文介绍JavaScript的闭包的作用、用途及其原理。 闭包的定义 闭包...
    99+
    2024-04-02
  • 如何在python闭包中使用函数
    这期内容当中小编将会给大家带来有关如何在python闭包中使用函数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问...
    99+
    2023-06-14
  • 理解python中的闭包
    一 什么是闭包?在一个函数内部嵌套定义了另一个函数,其中内部函数使用了外部函数作用域的变量(自由变量),并且外部函数的返回值是内部函数的引用,当外部函数结束时,外部函数的变量会被绑定到内部函数,由此就构成了闭包。闭包的本质是一个函数,它有两...
    99+
    2023-01-31
    python
  • 谈谈自己的理解:python中闭包,闭包
    闭包这个概念好难理解,身边朋友们好多都稀里糊涂的,稀里糊涂的林老冷希望写下这篇文章能够对稀里糊涂的伙伴们有一些帮助~请大家跟我理解一下,如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数。闭包:   在一个外函...
    99+
    2023-01-31
    自己的 python 中闭包
  • 如何使用闭包方法
    本篇内容介绍了“如何使用闭包方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是 Python 闭包首先,让我使用一个简单的示例来说明什...
    99+
    2023-06-15
  • 如何使用js的闭包原理做对象封装及调用方法
    这篇文章主要为大家展示了“如何使用js的闭包原理做对象封装及调用方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用js的闭包原理做对象封装及调用方法”这...
    99+
    2024-04-02
  • 如何理解并掌握JavaScript闭包
    这篇文章主要介绍“如何理解并掌握JavaScript闭包”,在日常操作中,相信很多人在如何理解并掌握JavaScript闭包问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何...
    99+
    2024-04-02
  • 如何使用 PHP 闭包函数?
    闭包函数是匿名函数,可以访问其定义环境中的变量。其语法为 $closure = function ($arguments) { // 函数体}; 可以在函数中使用 use 语句显式声明...
    99+
    2024-04-16
    php 闭包函数 排列
  • python如何使用libpcap库进行抓包及数据处理
    今天小编给大家分享一下python如何使用libpcap库进行抓包及数据处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。p...
    99+
    2023-07-04
  • Python闭包的使用方法
    目录1.闭包的定义和使用2.闭包内函数修改外函数定义的变量(加nonlocal)1.闭包的定义和使用 当返回的内部函数使用了外部函数的变量就形成了闭包闭包可以对外部函数的变量进行保存...
    99+
    2024-04-02
  • Python的闭包怎么使用
    本篇内容介绍了“Python的闭包怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.闭包的定义和使用当返回的内部函数使用了外部函数的...
    99+
    2023-06-30
  • Netty粘包拆包及使用原理详解
    目录为什么使用Netty框架Netty框架介绍Netty实战Netty编写服务器端Netty客户端粘包与拆包为什么使用Netty框架 NIO的类库和API繁杂,使用麻烦,你需要熟练掌...
    99+
    2022-11-13
    Netty 粘包拆包 Netty 原理
  • python函数及闭包是什么及怎么用
    本篇内容主要讲解“python函数及闭包是什么及怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python函数及闭包是什么及怎么用”吧!函数对象函数对象指...
    99+
    2024-04-02
  • golang匿名函数及闭包原理解析
    是的,go 中的匿名函数可用于快速定义一次性函数或立即执行函数,而闭包则用于将局部变量封锁在匿名函数中,即使后者返回也能访问这些变量。 Go 中的匿名函数和闭包理解 匿名函数是在不定义...
    99+
    2024-05-03
    函数 golang 闭包
  • python包如何使用
    python 包的模块 函数 类 定义 导入使用详细说明下面是一个使用 Python 包的详细案例,它涉及到模块、函数和类的定义、导入以及使用:首先,我们创建一个名为 my_package 的目录,作为包的根目录。在其中创建以下文件:my_...
    99+
    2023-05-18
    Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作