首页 > 其他分享 >14、函数对象和闭包

14、函数对象和闭包

时间:2022-08-18 12:37:37浏览次数:80  
标签:闭包 return 14 add func def 函数

14、函数对象和闭包

14、函数对象和闭包

 

 

目录:

  • 一 函数对象
    • 1.1 函数可以被引用
    • 1.2 函数可以作为容器类型的元素
    • 1.3 函数可以作为参数传入另外一个函数
    • 1.4 函数的返回值可以是一个函数
  • 二 闭包函数
    • 2.1 闭与包
    • 2.2 闭包的用途
  • 视频链接

 

一 函数对象

函数对象指的是函数可以被当做’数据’来处理,具体可以分为四个方面的使用,我们如下

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()
……

闭包函数的这种特性有时又称为惰性计算。使用将值包给函数的方式,在接下来的装饰器中也将大有用处

视频链接:

函数对象:

https://www.bilibili.com/video/av73342471?p=43​www.bilibili.com/video/av73342471?p=43

闭包函数:

https://www.bilibili.com/video/av73342471?p=46​www.bilibili.com/video/av73342471?p=46

 

 

标签:闭包,return,14,add,func,def,函数
From: https://www.cnblogs.com/leeyong49/p/16598274.html

相关文章

  • 18、函数递归
    18、函数递归  目录:一函数递归调用介绍二回溯与递推视频链接 一函数递归调用介绍函数不仅可以嵌套定义,还可以嵌套调用,即在调用一个函数的过......
  • python lambda函数 匿名函数
    先用def来定义函数,代码如下defsq(x):returnx*xmap(sq,[yforyinrange(10)])再用lambda函数来编写代码map(lambdax:x*x,[yforyinrange(10)])用lam......
  • 11、函数的基本使用
    11、函数的基本使用  目录:一引入二定义函数三调用函数与函数返回值视频链接 一引入​基于前一部分的学习,我们已经能开发一些功能简单的小......
  • 「学习笔记」Z 函数(扩展 KMP)
    前置芝士:KMP算法正文本文涉及的字符串下标以\(0\)为起点。对于个长度为\(n\)的字符串\(s\)。定义函数\(z(i)\)表示\(s\)和\(s_{i\simn-1}\)(即以\(s_i\)开......
  • 评分管理系统环境部署:JDK1.8,nginx:1.14.0,redis 6.2.4 ,mysql 8.0.22
    背景:环境要求服务器上部署项目,需要JDK1.8,nginx:1.14.0,redis6.2.4,mysql8.0.22,使用在线安装版本或者docker版本;linux的版本是CentOs7.4(cat/etc/redhat-release);jdk......
  • C++primer练习14.44-53
    练习14.44编写一个简单的桌面计算器使其处理二元计算doubleadd(doublea,doubleb){returna+b;}autosubtra=[](doublea,doubleb){returna-b;};stru......
  • CodeForces-1469C Building a Fence
    BuildingaFencedp模拟?维护好可摆放的区间即可,我用的区间是指当前位置可摆放的东西的下边界区间下限:\(l_i=max(l_{i+1}-k,h_i)\),表示尽量往下放,以及在地面之上......
  • 145.binary-tree-postorder-traversal 二叉树的后序遍历
    对比前序遍历的"中左右",后序遍历是"左右中",颠倒一下就是"中右左",所以可以参照前序遍历的迭代法来写迭代遍历。#include<algorithm>#include<stack>#include<vector>......
  • 144.binary-tree-preorder-traversal 二叉树的前序遍历
    前序遍历即中左右,前中后序遍历区别就在于中节点是在前、中还是后。利用栈实现二叉树的迭代遍历:#include<stack>#include<vector>usingstd::stack;usingstd::vecto......
  • 吐槽一下thinbook14+R7 6800H
    随便写一点,这个机器确实挺招人喜欢的,换句话说,真的是做产品的把客户当人了,就是这个16g的版本不适合开发使用,以前没有在意,没显卡占用了2g,只有14g内存,在开了3个i......