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 Web框架Pylons中使用MongoDB的例子
Dec 03 Python
Python多进程同步Lock、Semaphore、Event实例
Nov 21 Python
Python使用numpy实现BP神经网络
Mar 10 Python
python 筛选数据集中列中value长度大于20的数据集方法
Jun 14 Python
python统计多维数组的行数和列数实例
Jun 23 Python
Python sorted函数详解(高级篇)
Sep 18 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 Python
Python实现生成密码字典的方法示例
Sep 02 Python
python中Ansible模块的Playbook的具体使用
May 28 Python
python框架flask入门之环境搭建及开启调试
Jun 07 Python
python判断变量是否为列表的方法
Sep 17 Python
python lambda的使用详解
Feb 26 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下10件你也许并不了解的事情
2008/09/11 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
jQuery中Ajax的load方法详解
2015/01/14 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
JS表单验证的代码(常用)
2016/04/08 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
微信实现自动跳转到用其他浏览器打开指定APP下载
2019/02/15 Javascript
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
JavaScript创建、读取和删除cookie
2019/09/03 Javascript
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
[01:46]辉夜杯—打造中国DOTA新格局
2015/12/25 DOTA
Eclipse + Python 的安装与配置流程
2013/03/05 Python
python基于phantomjs实现导入图片
2016/05/13 Python
对python模块中多个类的用法详解
2019/01/10 Python
Python3几个常见问题的处理方法
2019/02/26 Python
浅谈python中get pass用法
2019/03/19 Python
python内打印变量之%和f的实例
2020/02/19 Python
Python Json数据文件操作原理解析
2020/05/09 Python
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
应届大学生的推荐信
2013/11/20 职场文书
《燕子专列》教学反思
2014/02/21 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
2014年采购工作总结
2014/11/20 职场文书
鉴史问廉观后感
2015/06/10 职场文书
付款证明模板
2015/06/19 职场文书
2015年新农村建设指导员工作总结
2015/07/24 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
Python 中面向接口编程
2022/05/20 Python