函数对象与闭包函数

一. 函数对象(函数名)

ps :函数名遇到括号就会调用!!!

函数名有4种用法

  1. 函数名可以当做变量名赋值

     def index():
         print('from index')
     a = index
     a()  # 本质就是在调用index函数
    
  2. 函数名还可以当做函数的实参

     def index():
         print('from index')
     def func(a):
         print(a)
         a()
         print('from func')
     func(index)
    
  3. 函数名还可以当做函数返回值

     def index():
         print('from index')
     def func():
         print('from func')
         return index
     res = func()  # 调用func并接受func的返回值
     res()  # 就是index()
    
  4. 函数名可以当做容器类型(内部可以存放多个数据)的元素

     def index():
         print('from index')
     l = [111, 222, 333, index()]
     print(l)
    

image

二. 函数的嵌套调用

# 嵌套调用:函数内部调用其他函数
def my_max(a, b):
    if a > b:
        return a
    return b

def many_max(x,y,z,m):
    res = my_max(x,y)
    res1 = my_max(res,z)
    res2 = my_max(res1,m)
    return res2
ret = many_max(1,2,3,4)
print(ret)  # 4

函数的嵌套定义

将复杂的功能全部隐藏起来 暴露一个简单的接口

三. 闭包函数

1. 定义

闭:定义在函数内部的函数

包:内部函数使用了外部函数名称空间中的名字

只有符合上述两个特征的函数才可以称之为"闭包函数"

闭包函数其实是给函数传参的第二种方式

x=1
def outer():
    x=2
    def inner():
        print(x)
    return inner

func=outer()
func() # 结果为2

“闭”代表函数是内部的,“包”代表函数外’包裹’着对外层作用域的引用。因而无论在何处调用闭包函数,使用的仍然是包裹在其外层的变量。

2.闭包的用途

 def outer(x,y):
     # x = 2
     # y = 40
     def my_max():
         if x > y:
             return x
         return y
     return my_max
 res = outer(2,40)
 print(res())
 print(res())
 # 这样以后就不需要再赋值,要替换的话只需要把x,y重新赋值然后用新的变量接收就可以一直使用了.

image

posted @ 2021-11-16 17:10  zong涵  阅读(28)  评论(0编辑  收藏  举报