一、函数对象

函数对象的精髓就是函数可以当做变量去使用

1.1函数可以被引用

注意赋值函数不能加括号

加括号是函数的调用,不加括号是函数体内函数体代码的内存地址

def func():
print("func 函数")
f1 = func
f1()
>>>func 函数

1.2函数可以作为容器类型的元素

用这种方法也可以去优化我们多个函数的选择调用

一个函数:

def func():
print("func 函数")
dict1= {"func":func}
dict1["func"]()
>>>func 函数

多个函数:

#功能函数
def func1():
print("登录")
def func2():
print("注册")
def func3():
print("检查")
#存放功能函数的字典
func_dict = {
"0":["退出",exit],
"1":["注册",func1],
"2":["登录",func2],
"3":["检查",func3]}
while True:
for key in func_dict:
print(key,func_dict[key][0])
cmd = input("请输入指令>")
if not cmd.isdigit():
print("请输入数字")
continue
elif cmd in func_dict:
func_dict[cmd][1]()
else:
print("不存在该指令")

1.3函数可以作为参数传入另外一个函数

def func(x):
x()
def foo():
print("函数 foo")
func(foo)
>>>函数 foo

1.4函数的返回值可以是一个函数

def foo():
print("函数 foo")
def func():
return foo
res = func()
res()
>>>函数 foo

二、闭包函数

前提:

闭包函数=函数空间与作用域+函数嵌套+函数对象

核心点:名字的查找关系是以函数定义阶段为准

1 什么是闭包函数

“闭”函数:指的是该函数的内嵌函数

def foo():
def bar():
pass
#在这个场景下bar就是闭函数

“包”函数:指的是函数包含对外层函数作用域名字的引用(不是对全局作用域)

闭包函数:名称空间和作用域的应用+函数嵌套

def foo():
x=123123
def bar():
print(x)
#在这个例子里bar包含对外层函数foo内作用域里名字x的引用
#所以此时bar是闭包函数

2 闭包函数的用法

def foo():
x=123
def bar():
print(x)
return bar #foo函数的返回值是bar函数的内存地址
f = foo()#将foo函数的返回值赋值给f
f()#此时调用f函数等于在调用闭包函数bar
>>>123

此时通过引入闭包函数的概念,我们知道了两种函数体传参的方式

方式一:直接把函数体需要的参数定义成形参

def foo(x):
print(x)
foo(1)

方式二:通过闭包函数的外层函数作用域里的变量传值

def foo():
x=123
def bar():
print(x)
return bar
bar = foo()
bar()
>>>123
#上面的方式传值x固定是123,当然也可以通过传参的方式自定义传值
def f1(x):
def f2():
return x*2
return f2
f2 = f1(2)
print(f2())
>>>4

day16 函数对象与闭包函数的更多相关文章

  1. python中的函数对象与闭包函数

    函数对象 在python中,一切皆对象,函数也是对象 在python语言中,声明或定义一个函数时,使用语句: def func_name(arg1,arg2,...): func_suite 当执行流 ...

  2. Python(2.7.6) 函数对象与闭包

    在 Python 中,一切皆对象.函数也是对象,它可以赋值给其他变量,也可以当作参数传递. lambda 表达式可以创建函数对象,在 Python 中,lambda 表达式的函数体只能有唯一的一条语句 ...

  3. python函数对象和闭包

    关于函数对象和闭包 闭包(closure)是函数式编程的重要的语法结构.不同的语言实现闭包的方式不同.Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看 ...

  4. 18.C++-[ ]操作符使用 、函数对象与普通函数区别(详解)

    在上章17.C++-string字符串类(详解)学习了string类,发现可以通过[ ]重载操作符来访问每个字符. 比如: string s="SAD"; for(int i=0, ...

  5. Python中的函数对象与闭包

    函数在Python中是第一类对象,可以当做参数传递给其他函数,放在数据结构中,以及作为函数的返回结果. 下面的例子为接受另外一个函数作为输入并调用它 #foo.py def callf(func): ...

  6. python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数

    1.函数的定义: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  7. 函数嵌套>作用域>闭包函数

    一:函数对象 函数是第一类对象,即表示函数可以当做数据传递 可以被引用:把函数内存地址赋值给一个变量名,仍然遵循函数的调用规则. 可以被当做参数传递:传递的是函数的运行的结果#可以当做返回值 把函数作 ...

  8. c++之函数对象、bind函数

    函数对象实质上是一个实现了operator()--括号操作符--的类. class Add { public: int operator()(int a, int b) { return a + b; ...

  9. python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)

    1.函数对象 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函 ...

随机推荐

  1. ElasticSearch系列(二):ElasticSearch Head、Kibana、Elasticsearch-Analysis-Ik安装、使用

    1.ElasticSearch Head使用 扩展程序安装插件:ElasticSearch github地址:https://github.com/mobz/elasticsearch-head/ 运 ...

  2. 内存管理,goto的使用,内存的申请和释放,mmap,ioremap

    1.内存管理 (将物理内存映射到内核空间(3G~4G)并使用)  深入内核: 伙伴系统 1.1基本概念    1)linux内核管理内存是以物理内存页为单位       一个物理内存页通常为4KB   ...

  3. [转] 图解单片机下载程序电路原理之USB转串口线、CH340、PL2303、MAX232芯片的使用

    点击阅读原文 目前为止,我接触单片机已有不少时日,从选择元器件.原理图.PCB.电路硬件调试.软件开发也算小有心得 .单片机软件开发里面第一步当属下载程序了,如果这一步都有问题,那么后面的一切便无从谈 ...

  4. min_25筛入门

    目录 1.什么是min_25筛 2.前置知识 2.1.数论函数 2.2.埃拉托色尼筛 2.3.欧拉筛 3.min_25筛 3.1.计算质数贡献 3.2.计算总贡献 3.3.实现 4.例题 4.1.[L ...

  5. XAI/MLI 可解释机器学习系列1- 开源&paper汇总

    一直在关注可解释机器学习领域,因为确实在工作中有许多应用 模型检查,特征重要性是否符合预期和AUC一样重要 模型解释,比起虚无缥缈的模型指标,解释模型学到的规律更能说服业务方 样本解释,为什么这些用户 ...

  6. navicat 出现 mysql远程连接问题 Lost connection to MySQL server at ‘reading initial communication packet', system error: 0

    今天做服务器上的东西需要看数据库时,突然发现有这个报错,然后自己也查了很多资料 我最后找到一个在my,cnf配置文件中mysqld下加入一条 max_allowed_packet = 500M 也就是 ...

  7. 本地代码提交到远程仓库(git)

    [准备环境] 我没有在Linux搭建gitlab私有云服务器,用的是开源的 gitee托管平台 1.在gitee注册账号 2.本地下载git客户端 [步骤] 1  本地新建1个文件夹  进入文件夹后 ...

  8. Java WebService _CXF、Xfire、AXIS2、AXIS1_四种发布方式(优缺点对比)

    xis,axis2,Xfire以及cxf对比 http://ws.apache.org/axis/ http://axis.apache.org/axis2/java/core/ http://xfi ...

  9. 尚硅谷spring 事物管理

    接下来我们重点来学习spring中的事务管理 接下来我们通过代码来实现 spring实现事物我们采用aop的方式来实现 获得连接和手动设置事物相当于@before标注的前置通知,conn.commit ...

  10. Lens —— 最炫酷的 Kubernetes 桌面客户端

    原文链接:https://fuckcloudnative.io/posts/lens/ Kubernetes 的桌面客户端有那么几个,曾经 Kubernetic 应该是最好用的,但最近有个叫 Lens ...