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中的descriptor描述器的作用及用法
Jun 27 Python
Python使用正则表达式实现文本替换的方法
Apr 18 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
Python断言assert的用法代码解析
Feb 03 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
Python封装成可带参数的EXE安装包实例
Aug 24 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
May 03 Python
Python实现石头剪刀布游戏
Jan 20 Python
pandas 操作 Excel操作总结
Mar 31 Python
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
Jun 13 Python
基于Python实现将列表数据生成折线图
Mar 23 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基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
php下实现伪 url 的超简单方法[转]
2007/09/24 PHP
关于PHP结束标签的使用细节探讨及联想
2013/03/04 PHP
Javascript 写的简单进度条控件
2008/01/22 Javascript
JS 类型转换常见方法小结
2010/05/31 Javascript
jquery获取tr中控件值并操作tr实现思路
2013/03/27 Javascript
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
2016/06/08 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
JavaScript中创建原子的方法总结
2018/08/26 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
零基础写python爬虫之神器正则表达式
2014/11/06 Python
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
python 定时修改数据库的示例代码
2018/04/08 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
django框架forms组件用法实例详解
2019/12/10 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
CSS3 特效范例整理
2011/08/22 HTML / CSS
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
销售经理竞聘书
2014/03/31 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
保护地球的标语
2014/06/17 职场文书
2015年端午节活动方案
2015/05/05 职场文书
工商局调档介绍信
2015/10/22 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
Oracle笔记
2021/04/05 Oracle
如何Tomcat中使用ipv6地址
2022/05/06 Servers