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 解析html之BeautifulSoup
Jul 07 Python
python对指定目录下文件进行批量重命名的方法
Apr 18 Python
Python2.7读取PDF文件的方法示例
Jul 13 Python
python如何对实例属性进行类型检查
Mar 20 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
ORM Django 终端打印 SQL 语句实现解析
Aug 09 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
python检测服务器端口代码实例
Aug 31 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
Nov 11 Python
python的range和linspace使用详解
Nov 27 Python
Python操作Sonqube API获取检测结果并打印过程解析
Nov 27 Python
Python Django模型详解
Oct 05 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
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
PHP 调试工具Debug Tools
2011/04/30 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
2015/03/07 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
2016/01/05 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
php提高脚本性能的4个技巧
2020/08/18 PHP
常用js脚本
2006/12/03 Javascript
QUnit jQuery的TDD框架
2010/11/04 Javascript
javascript tips提示框组件实现代码
2010/11/19 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
2012/08/14 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
JS实现简单的图书馆享元模式实例
2015/06/30 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
详解Vue This$Store总结
2018/12/17 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
使用python的turtle函数绘制一个滑稽表情
2020/02/28 Python
css3动画 小球滚动 js控制动画暂停
2019/11/29 HTML / CSS
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
新闻学专业个人求职信写作
2014/02/04 职场文书
经理秘书求职自荐信范文
2014/03/23 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
学生检讨书如何写
2014/10/30 职场文书
2014年施工员工作总结
2014/11/18 职场文书
青年教师个人总结
2015/02/11 职场文书
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS