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 paramiko实现ssh远程访问的方法
Dec 03 Python
采用Psyco实现python执行速度提高到与编译语言一样的水平
Oct 11 Python
详解Python的Django框架中的Cookie相关处理
Jul 22 Python
python @property的用法及含义全面解析
Feb 01 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
Jan 08 Python
Python实现京东秒杀功能代码
May 16 Python
Python变量访问权限控制详解
Jun 29 Python
python挖矿算力测试程序详解
Jul 03 Python
python nmap实现端口扫描器教程
May 28 Python
Python+appium框架原生代码实现App自动化测试详解
Mar 06 Python
Python虚拟环境venv用法详解
May 25 Python
python 19个值得学习的编程技巧
Aug 15 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
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
Javascript学习笔记9 prototype封装继承
2010/01/11 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
2015/10/23 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
基于vue中对鼠标划过事件的处理方式详解
2018/08/22 Javascript
微信小程序实现自动定位功能
2018/10/31 Javascript
Vue 组件注册实例详解
2019/02/23 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
python提示No module named images的解决方法
2014/09/29 Python
Python实现约瑟夫环问题的方法
2016/05/03 Python
python实现K最近邻算法
2018/01/29 Python
Python+OpenCV实现车牌字符分割和识别
2018/03/31 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
python获取微信小程序手机号并绑定遇到的坑
2018/11/19 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
学Python 3的理由和必要性
2019/11/19 Python
利用HTML5绘制点线面组成的3D图形的示例
2015/05/12 HTML / CSS
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
2019/07/18 HTML / CSS
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
Linux文件操作命令都有哪些
2015/02/27 面试题
Hibernate持久层技术
2013/12/16 面试题
银行实习人员自我鉴定
2013/09/22 职场文书
毕业生医学检验求职信
2013/10/16 职场文书
户外拓展活动方案
2014/02/11 职场文书
维护民族团结演讲稿
2014/08/27 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
七夕情人节问候语
2015/11/11 职场文书
Python max函数中key的用法及原理解析
2021/06/26 Python
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技