• 函数对象与闭包


    函数对象与闭包

    函数对象指的是函数可以被当做""数据""来处理

    1.函数可以被引用

    >>> def add(x, y):
    ...     return x+y
    ...
    >>> func = add
    >>> func(1, 2)
    3
    

    2.函数可以当做参数传递

    >>> def foo(x,y,func):
    ...     return func(x,y)
    ...
    >>> foo(1,2,add)
    3
    

    3.函数可以当做返回值使用

    (传参的时候一定不能加括号,加括号当场就执行了)

    def index():
        print("from index")
    
    def func(a):
        return a
    
    a = func(index)
    a()
    

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

    def func():
        print('from func')
    
    
    l1 = [1, '2', func, func()]
    
    f = l1[2]
    print(f)
    from func
    <function func at 0x000001F6BD7F3E18>
    

    函数的嵌套

    函数的嵌套调用:在函数内调用函数

    定义:

    ​ 让内层函数封闭起来,不让外部直接调用

    作用:

    将复杂并且小的功能,在函数内部调用,解决代码结构清晰问题

    def index():
        def home():
            print("from home")
        home()
    
    index()
    from home
    

    例子:

    def func1(x, y):
        if x > y:
            return x
        else:
            return y
    
    
    print(func1(1,2))
    
    def func2(x, y, z, a):
        result = func1(x, y)
        result = func1(result, z)
        result = func1(result, a)
        return result
    
    
    print(func2(1, 200000, 3, 1000
    2
    200000
    

    闭包函数

    闭:代表函数内部

    包:代表函数外“包裹”着对外层作用域的引用

    是函数嵌套、函数对象、名称空间与作用域的结合体

    1.闭包函数必须在函数内部定义

    2.闭包函数可以引用外层函数的名字

    闭包函数是为了装饰器做准备

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

    有两种为函数体传值的方式,一种是直接将值以参数的形式传入,另外一种就是将值包给函数

    import requests
    
    
    def get(url):		#第一种方式
        return requests.get(url).text
    
    
    print(len(get('https://www.baidu.com')))
    print(len(get('https://www.python.org')))
    2443
    49559
    

    方式一在下载同一页面时需要重复传入url

    import requests
    
    def page(url):		#第二种方式
        def get():
            return requests.get(url).text
        return get
    
    
    python = page('https://www.python.org')
    python()
    

    方式二只需要传入一次值,就会得到一个包含指定url的闭包函数,以后调用该闭包函数无需再传url

  • 相关阅读:
    在阿里云“专有网络”网络类型中配置vsftpd
    Ubuntu 16.04下开启Mysql 3306端口远程访问
    .net core 2.0 报错:error NU1102: Unable to find package ...
    .NET Core Runtime ARM32 builds now available
    .NET Core on Raspberry Pi
    .NET Core 跨平台发布(dotnet publish)
    使用vscode开发调试.net core应用程序并部署到Linux跨平台
    docker容器镜像删除
    使用阿里docker镜像加速器加速
    树莓派3b基于UbuntuMate下载中文输入法
  • 原文地址:https://www.cnblogs.com/YGZICO/p/11843844.html
Copyright © 2020-2023  润新知