04_04、函数对象与闭包
一、函数对象
简单来说,函数对象其实就是函数名,函数名具体有4中用法
注意:函数名后面跟括号,表示函数被调用
用法一
函数名可以当成变量赋值
def index(): print('from index') a = index # 把函数名index赋值给a a() # a +()代表函数自定义函数已被调用 print(a) # 函数名就是内存地址
用法二
函数名可以当成函数的参数
def index(): print('from index') def func(a): a() print('from func') # 把函数名index作为函数func的参数 func(index)
用法三
函数名也可以当成函数的返回值
def index(): print('from index') def func(): print('from func') return index # 函数名index作为函数func的返回值 res = func() res()
用法四
函数名也可以当成容器(可以存放多个元素)类型的元素
def index(): print('from index') l = [1, 2, 3, index] # 函数名index当成列表l的一个元素 print(l)
二、函数的嵌套
1、函数的嵌套调用
所谓的函数嵌套调用,简单来说就是函数里面调用另一个函数
def index(): print('from index') def func(): index() # 在函数func里调用函数index print('from func') func()
应用案例1:
# 1.比较两个数的大小 def my_max(a, b): if a > b: return a return b # my_max(1, 2)
应用案例2:
# 2. 比较4个数的大小 def many_max(a, b, c, d): # 先两两比较,a,b res = my_max(a, b) res1 = my_max(res, c) res2 = my_max(res1, d) return res2 print(many_max(1,2,3,4))
2、函数的嵌套定义
函数的嵌套定义是指在函数里面再定义另一个函数
其中一个用途是把复杂的功能隐藏起来,方便操作
def all_func(type): def register(): print('注册') def login(): print('登录') def transfer(): print('转账') def withdraw(): print('提现') if type == 1: register() elif type == 2: login() elif type == 3: transfer() elif type == 4: withdraw() else: print('好好输入') all_func(1) # all_func(2)
三、闭包函数
1、闭包函数定义
所谓闭是——定义在函数内部的函数(函数至少要有两层)
所谓包是——内部函数必须使用外部函数的数据
闭包函数就是同时满足“闭”和“包”两个条件的函数
# 闭:两个函数a和b # 包:函数b中x,需要从函数a中调用 # 这就是一个闭包函数 def a(): x = 1 def b(): print(x) b() a()
2、闭包函数的用途
函数传参的基本方式是通过写入实参向形参赋值
# my_max是一个比较a,b大小的函数 def my_max(a, b): if a > b: return a return b print(my_max(1, 2)) # 直接写入实参传给形参
闭包函数则提供了第二种传参的方式
这种传参方式的底层方式依然是实参向形参传输
不同点在于实参不直接向功能函数传参,而是向外层空间函数传参
优点是可以不改变原有代码和调用方式
def outer(a, b): def my_max(): if a > b: return a return b return my_max res = outer(2, 20) # 此时outer()的返回值是my_max print(my_max()) # my_max()是函数名my_max的值,并赋给res
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通