zoukankan      html  css  js  c++  java
  • Python—函数对象与闭包

    一 函数对象

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

    1.1 函数可以被引用

    def index():
        print('from index')
    a = index
    a()
    

    1.2 函数可以当做参数传递

    def foo(x,y,func):
        print(x,y)
        func()
        
    def bar():
        print('from bar')
    
    foo(1,2,bar)
    #>>> 1 2
    #>>> from bar
    

    1.3 函数名可以当做返回值使用

    def index():
        print('from index')
        
    def func(a):
        return a
        
    a = func(index)
    a()
    #>>> from index
    

    1.4

    函数名可以被当做容器类型的元素

    def func():
        print('from func')
        
    l1 = [1,'2',func,func()]
    
    f = l1[2]
    
    #>>> from func
    

    二 闭包函数

    2.1 闭与包

    基于函数对象的概念,可以将函数返回到任意位置去调用,但作用域的关系是在定义完函数时就已经被确定了的,与函数的调用位置无关。

    x = 1
    
    def f1():
        def f2():
            print(x)
        return f2
        
    def f3():
        x = 3
        f2 = f1() # 调用f1()返回函数f2
        f2() # 需要按照函数定义时的作用关系去执行,与调用位置无关
    f3() # 结果为1
    
    

    也就是说函数被当做数据处理时,始终以自带的作用域为准。若内嵌函数包含对外部函数作用域(而非全局作用域)中变量的引用,那么该‘内嵌函数’就是闭包函数,简称闭包(closeures)

    x = 1
    def otuer():
        x = 2
        def inner():
            print(x)
        return inner
    
    func = outer()
    func() # 结果为2
    

    2.2 闭包的用途

    目前为止,我们得到了两种为函数传值的方式,一种是直接将值以参数的形式传入,另外一种就是将值包给函数

    # 直接传参
    def func(x):
        print(x)
        
        
    func(1000)
    
    
    # 通过闭包函数传参
    def outer(number):
        # number = 1000
        # inner就是闭包函数
        def inner()
            print(number)
        return inner
        
    func = outer(1000) # ---》 inner地址 ---》 func变量名
    func() # func ---> inner地址()
    

    闭包函数的这种特性有时又称为惰性计算。使用将值传给函数的方式,在装饰器中也将大有用处!

  • 相关阅读:
    《aelf经济和治理白皮书》重磅发布:为DAPP提供治理高效、价值驱动的生态环境
    在线直播: .NET与物联网主流技术探秘 初识IoT!
    2019,.Net开发者的高光时刻
    git stash 切换分支以后 恢复
    redis之简单动态字符串(SDS)
    mysql机制总结
    mac 修改用户权限
    sql注入方法以及防范
    redis学习
    mysql百万数据分页查询速度
  • 原文地址:https://www.cnblogs.com/snailhuang/p/11892636.html
Copyright © 2011-2022 走看看