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获取当前日期和时间的方法
Apr 30 Python
Python的Flask开发框架简单上手笔记
Nov 16 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
Mar 21 Python
python爬虫框架talonspider简单介绍
Jun 09 Python
Python堆排序原理与实现方法详解
May 11 Python
selenium+python 对输入框的输入处理方法
Oct 11 Python
python+openCV调用摄像头拍摄和处理图片的实现
Aug 06 Python
详谈tensorflow gfile文件的用法
Feb 05 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
Mar 25 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
May 16 Python
python实现mean-shift聚类算法
Jun 10 Python
Python pygame实现中国象棋单机版源码
Jun 20 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
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
Apache站点配置SSL强制跳转443
2021/03/09 Servers
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
jQuery学习笔记之jQuery原型属性和方法
2014/06/09 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
详解AngularJS 过滤器的使用
2018/06/02 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
python字符串编码识别模块chardet简单应用
2015/06/15 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
Python flask框架post接口调用示例
2019/07/03 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
python如何支持并发方法详解
2020/07/25 Python
Python创建临时文件和文件夹
2020/08/05 Python
船餐厅和泰晤士河餐饮游轮:Bateaux London
2018/03/19 全球购物
Java和Javasciprt的区别
2012/09/02 面试题
工作自我评价怎么写
2014/01/29 职场文书
秋季校运会广播稿100字
2014/09/18 职场文书
公司出差管理制度范本
2015/08/05 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
一文搞懂MySQL索引页结构
2022/02/28 MySQL
生命的关键成分来自太空?陨石说是的
2022/04/29 数码科技