Python函数对象与闭包函数


Posted in Python onApril 13, 2022

一 函数对象

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

1.1 函数可以被引用

>>> def add(x,y):
...     return x+y
... 
>>> func=add
>>> func(1,2)
3

1.2 函数可以作为容器类型的元素

>>> dic={'add':add,'max':max}
>>> dic
{'add': <function add at 0x100661e18>, 'max': <built-in function max>}
>>> dic['add'](1,2)
3

1.3 函数可以作为参数传入另外一个函数

>>> def foo(x,y,func):
...     return func(x,y)
...
>>> foo(1,2,add)
3

1.4 函数的返回值可以是一个函数

>>> def bar():
...     return add
...
>>> func=bar()
>>> func(1,2)
3

二 闭包函数

2.1 闭与包

基于函数对象的概念,可以将函数返回到任意位置去调用,但作用域的关系是在定义完函数时就已经被确定了的,与函数的调用位置无关。

x=1

def f1():
    def f2():
        print(x)

    return f2

def f3():
    x=3
    f2=f1() #调用f1()返回函数f2
    f2() #需要按照函数定义时的作用关系去执行,与调用位置无关

f3() #结果为1

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

x=1
def outer():
    x=2
    def inner():
        print(x)
    return inner

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

可以通过函数的__closure__属性,查看到闭包函数所包裹的外部变量

>>> func.__closure__
(<cell at 0x10212af78: int object at 0x10028cca0>,)
>>> func.__closure__[0].cell_contents
2

“闭”代表函数是内部的,“包”代表函数外’包裹’着对外层作用域的引用。因而无论在何处调用闭包函数,使用的仍然是包裹在其外层的变量。

2.2 闭包的用途

目前为止,我们得到了两种为函数体传值的方式,一种是直接将值以参数的形式传入,另外一种就是将值包给函数

import requests

#方式一:
def get(url):
    return requests.get(url).text

#方式二:
def page(url):
    def get():
        return requests.get(url).text
    return get

提示:requests模块是用来模拟浏览器向网站发送请求并将页面内容下载到本地,需要事先安装:pip3 install requests

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

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

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

闭包函数的这种特性有时又称为惰性计算。使用将值包给函数的方式,在接下来的装饰器中也将大有用处

到此这篇关于Python函数对象与闭包介绍的文章就介绍到这了!

Python 相关文章推荐
python制作企业邮箱的爆破脚本
Oct 05 Python
Python如何为图片添加水印
Nov 25 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
python分割一个文本为多个文本的方法
Jul 22 Python
Django项目之Elasticsearch搜索引擎的实例
Aug 21 Python
python/Matplotlib绘制复变函数图像教程
Nov 21 Python
Python如何使用OS模块调用cmd
Feb 27 Python
Keras 加载已经训练好的模型进行预测操作
Jun 17 Python
使用Python文件读写,自定义分隔符(custom delimiter)
Jul 05 Python
Python tkinter界面实现历史天气查询的示例代码
Aug 23 Python
python em算法的实现
Oct 03 Python
python中的对数log函数表示及用法
Dec 09 Python
Python作用域和名称空间的详细介绍
Apr 13 #Python
Python获取字典中某个key的value
Apr 13 #Python
Python基本的内置数据类型及使用方法
Apr 13 #Python
Python如何使用循环结构和分支结构
Apr 13 #Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
Apr 13 #Python
python运算符之与用户交互
Apr 13 #Python
python垃圾回收机制原理分析
Apr 13 #Python
You might like
十天学会php(3)
2006/10/09 PHP
落伍首发 php+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
2006/12/16 PHP
追求程序速度,而不是编程的速度
2008/04/23 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
基于jQuery实现收缩展开功能
2016/03/18 Javascript
使用jQuery中的wrap()函数操作HTML元素的教程
2016/05/24 Javascript
js 获取站点应用名的简单实例
2016/08/18 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
2017/11/27 Javascript
Nuxt.js之自动路由原理的实现方法
2018/11/21 Javascript
原生js实现的金山打字小游戏(实例代码详解)
2020/03/16 Javascript
js实现页面图片消除效果
2020/03/24 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
JQuery绑定事件四种实现方法解析
2020/12/02 jQuery
[07:52]2014DOTA2 TI逗比武士游V社解说背后的故事
2014/07/10 DOTA
Python去掉字符串中空格的方法
2014/03/11 Python
wxPython使用系统剪切板的方法
2015/06/16 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
python实现视频压缩功能
2020/12/18 Python
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
Carter’s官方旗舰店:美国受欢迎的婴童服装品牌
2018/01/21 全球购物
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
半年思想汇报
2013/12/30 职场文书
函授教育个人学习的自我评价
2013/12/31 职场文书
乔迁之喜主持词
2014/03/27 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
任命书怎么写
2015/03/02 职场文书
入党群众意见范文
2015/06/02 职场文书
捐书仪式主持词
2015/07/04 职场文书
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL