美文网首页
函数对象和闭包

函数对象和闭包

作者: 慕知 | 来源:发表于2021-08-11 17:29 被阅读0次

函数对象和闭包

image.png

一) 函数对象

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

#1) 函数可以被引用
def add(x,y):
    return x+y

#方式一
res=add(3,5)
print(res)
# 8


#方式二
res=add
print(res(1,4))
# 5








#2) 函数可以作为容器类型的元素
def add(x,y):
    return x+y

dic={'add':add,'max':max}
print(dic)
# {'add': <function add at 0x102f421f0>, 'max': <built-in function max>}
# 以上说明add是函数,max是内置
print(dic['add'](1,3))
# 4











# 3)函数可以作为参数传入另外一个函数
def add(x,y):
    return x+y

def foo(x,y,func):
    return func(x,y)

print(foo(1,2,add))
#3








#4)函数的返回值可以是一个函数
def add(x,y):
    return x+y

def bar():
    return add

res=bar()
print(res(1,2))
# 3



示例:
#例1)
def f1():
    print('f1')

def f2():
    print('f2')

def f3():
    print('f3')

func_l = [f1,f2,f3]

func_l[0]()
func_l[1]()
func_l[2]()
# f1
# f2
# f3





#例2)
def login():
    print('注册功能'.center(20,' '))

def register():
    print('注册功能'.center(20,' '))

def transfer():
    print('转账功能'.center(20,' '))

def withdraw():
    print('体现功能'.center(20,' '))

dic_L={
    "1":['登陆功能',login],
    "2":['注册功能',register],
    "3":['转账功能',transfer],
    "4":['体现功能',withdraw]
}

count=0
while True:
    print('0 退出')
    for k in dic_L:
        print(k,dic_L[k][0])
    choice=input('输入编号:').strip()
    if choice == '0':
        break
    elif choice in dic_L:
        dic_L[k][1]()
    else:
        print('输入编号不存在,重新输入:')
        count += 1
    if count == 3:
        print('超过3次输入错误')
        break

二)函数嵌套

# 两位数比大小
def max(x,y):
    if x > y:
        return x
    else:
        return y

# 四位数比大小
def max4(a,b,c,d):
    res=max(a,b)
    res1=max(res,c)
    res2=max(res1,d)
    print(res2)

max4(5,6,7,8)
# 8

三)闭包函数

闭函数: 该函数是定义在函数内部的函数
def outter():
    def wrapper():
        print('wrapper====> ')




包函数: 一个内层函数引用了一个来自于外层函数的变量
def outter():
    x = 111
    def wrapper():
        print('wrapper====> ',x)



# 注意以上示例调用不会返回任何值!!outter这个函数没有return也没有print,也不可以单独调用wrapper






# 闭包函数=名称空间与作用域+函数嵌套定义+函数对象
def outter():
    x = 111
    def wrapper():
        print('wrapper====> ',x)

    return wrapper

f=outter()
f()
# wrapper====>  111









====================   函数体传参的两种方案 
  ====================
# # 方案1: 直接用参数传入
def wrapper(x):
    print('wrapper====> ',x)

wrapper(111)
# wrapper====>  111

wrapper(222)
# wrapper====>  222




# 方案2: 闭包函数
def outter(x):
    def wrapper():
        print('wrapper====> ',x)
    return wrapper


f=outter(111)
f()
# wrapper====>  111

f=outter(222)
f()
# wrapper====>  222









闭包的用途:
方便一次传值,多次调用,无需每次调用都输入参数!!!!!

相关文章

  • 函数对象和闭包

    函数对象和闭包 一) 函数对象 示例: 二)函数嵌套 三)闭包函数

  • day14-函数(3)装饰器

    一、闭包函数 闭包函数=函数嵌套定义+函数对象+名称空间与作用域 闭包函数 1、闭:指的是该函数是定义在一个函数内...

  • python之理解闭包和装饰器

    python之理解闭包和装饰器 1、闭包函数 1.1 python中函数都是对象 结果: 上面定义一个shut函数...

  • day14 装饰器

    Ⅰ 闭包函数 闭包函数=函数嵌套定义+函数对象+名称空间作用域 闭:指的是该函数是定义再一个函数内部的函数...

  • Swift入门二(对象函数)

    函数 闭包 GCD 尾随闭包 闭包循环引用解决(OC) 闭包循环引用解决(swift推荐) 面向对象 命名空间: ...

  • 内存泄漏

    闭包 在闭包中,内部函数引用外部函数变量,实际上是应用了外部函数的作用域(scope)对象 如果作用域对象所在函数...

  • JS高级学习:函数

    案例 函数作为返回值 案例2: 闭包 闭包的优缺点:缓存数据 函数模式的闭包:在一个函数中有一个函数 对象模式的闭...

  • 06.实现一个累加器

    使用构造函数和对象的方式,实现累加器:本质上还是闭包 使用闭包实现一个累加器闭包

  • 廖雪峰JavaScript闭包、箭头函数

    闭包 闭包返回函数对象 闭包的调用不互相影响 实际结果全部返回16,原因,当执行函数时,i的值已经改变 返回闭包,...

  • rust 闭包与同步

    rust 闭包与同步 rust 闭包 rust闭包中主要包括两个部分,闭包参数和闭包环境变量。闭包函数和函数参数使...

网友评论

      本文标题:函数对象和闭包

      本文链接:https://www.haomeiwen.com/subject/kkglbltx.html