day16 函数对象与闭包函数
一、函数对象
函数对象的精髓就是函数可以当做变量去使用
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 函数对象与闭包函数的更多相关文章
- python中的函数对象与闭包函数
函数对象 在python中,一切皆对象,函数也是对象 在python语言中,声明或定义一个函数时,使用语句: def func_name(arg1,arg2,...): func_suite 当执行流 ...
- Python(2.7.6) 函数对象与闭包
在 Python 中,一切皆对象.函数也是对象,它可以赋值给其他变量,也可以当作参数传递. lambda 表达式可以创建函数对象,在 Python 中,lambda 表达式的函数体只能有唯一的一条语句 ...
- python函数对象和闭包
关于函数对象和闭包 闭包(closure)是函数式编程的重要的语法结构.不同的语言实现闭包的方式不同.Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看 ...
- 18.C++-[ ]操作符使用 、函数对象与普通函数区别(详解)
在上章17.C++-string字符串类(详解)学习了string类,发现可以通过[ ]重载操作符来访问每个字符. 比如: string s="SAD"; for(int i=0, ...
- Python中的函数对象与闭包
函数在Python中是第一类对象,可以当做参数传递给其他函数,放在数据结构中,以及作为函数的返回结果. 下面的例子为接受另外一个函数作为输入并调用它 #foo.py def callf(func): ...
- python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数
1.函数的定义: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...
- 函数嵌套>作用域>闭包函数
一:函数对象 函数是第一类对象,即表示函数可以当做数据传递 可以被引用:把函数内存地址赋值给一个变量名,仍然遵循函数的调用规则. 可以被当做参数传递:传递的是函数的运行的结果#可以当做返回值 把函数作 ...
- c++之函数对象、bind函数
函数对象实质上是一个实现了operator()--括号操作符--的类. class Add { public: int operator()(int a, int b) { return a + b; ...
- python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)
1.函数对象 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函 ...
随机推荐
- chrome浏览器版本与驱动不匹配问题的解决办法
1.浏览器与驱动如何匹配才不会报错 使用selenium模块的webdriver打开谷歌浏览器时常遇到这样的错误提示: selenium.common.exceptions.WebDriverExce ...
- [原创][开源] SunnyUI.Net 更新日志
SunnyUI.Net, 基于 C# .Net WinForm 开源控件库.工具类库.扩展类库.多页面开发框架 Blog: https://www.cnblogs.com/yhuse Gitee: h ...
- Linux系统管理——Linux简介
UNIX与Linux发展史 UNIX发展历史 1.1965年,美国麻省理工学院(MIT),通用电气公司(GE)及AT&T的贝尔实验室联合开发Multics工程计划,其目标是开发一种交互式的具有 ...
- @bzoj - 5104@ Fib数列
目录 @description@ @solution@ @accepted code@ @details@ @description@ Fib数列为1,1,2,3,5,8... 求在Mod10^9+9 ...
- Nested Report_FR
设置好下面的关系(Mar 18做,copy from MyQ): 1) Customer.Orders.Items 的 MasterSouce.MasterField2) 后面2个的 DataSour ...
- linear-gradient,radial-gradient 渐变
一.渐变效果 -> 线性渐变 方法: background-image: linear-gradient(direction, color-stop1, color-stop2, ...); ...
- 【JMeter_18】JMeter逻辑控制器__吞吐量控制器<Throughput Controller>
吞吐量控制器<Throughput Controller> 业务逻辑: 他的实际作用似乎跟吞吐量扯不上什么关系.就是单纯的控制控制器下的子节点被执行的次数或被执行比列,该控制器默认为多线程 ...
- Java中时间处理
旧 API:位于 java.util 包中,里面主要有 Date.Calendar.TimeZone 类 新 API:位于 java.time 包中,里面主要有 LocalDateTime.Zoned ...
- 微信小程序入门基础
微信小程序入门基础 视频教程(https://edu.csdn.net/course/detail/8456?pre_view=1) 第一章.认识小程序 1.工具的下载与安装 2.小程序代码构成 ...
- 不同类型数据库中LIKE语句使用
不同数据库的LIKE语句使用略有差别,这里记录一下: Oracle数据库: SELECT *FROM userWHEREname LIKE CONCAT('%',#{name},'%')或SELECT ...