zoukankan      html  css  js  c++  java
  • 闭包函数

    一、什么是闭包?

    #内部函数包含对外部作用域而非全局作用域的引用
    
    #提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇
    
            def counter():
                n=0
                def incr():
                    nonlocal n
                    x=n
                    n+=1
                    return x
                return incr
    
            c=counter()
            print(c())
            print(c())
            print(c())
            print(c.__closure__[0].cell_contents) #查看闭包的元素
    

    二、闭包的意义与应用

    #闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
    #应用领域:延迟计算(原来我们是传参,现在我们是包起来)
        from urllib.request import urlopen
    
        def index(url):
            def get():
                return urlopen(url).read()
            return get
    
        baidu=index('http://www.baidu.com')
        print(baidu().decode('utf-8'))
    

    三、闭包函数讲解

    1.简述

    闭包函数=函数嵌套定义+名称空间与作用域+函数对象
    闭:指的是该函数是一个定义在函数内部的函数
    包:闭函数访问了一个来自于外层函数中的名字
    #示例
    def f1():
        x = 111
        def f2():
            print('from f2: ',x)
    
        return f2  # 千万不要加括号
    
    res=f1()
    
    def foo():
        x=222
        res()
    
    foo()
    

      

    2、为函数体传参的解决方案:

    2.1直接定义形参

    def f2(x):
        print(x)
    
    f2(111)
    f2(222)
    f2(333)
    

    2.2闭包函数是一种为函数体传参的解决方案

    def f1(x):
        # x=111
        def f2():
            print(x)
    
        return f2  # return f1.locals.f2的内存地址
    
    f2=f1(111)
    f2()
    

      



  • 相关阅读:
    【PHP】php基础回顾
    【PHP】MVC架构
    【OpenGL学习】使用VBO和FBO
    【OpenGL学习】使用Shader做图像处理
    hdu 杭电 1242 Rescue 果枫
    并查集模板 果枫
    数组结构体中排序 果枫
    hdu 杭电 1728 逃离迷宫 果枫
    hdu 杭电 1241 Oil Deposits 果枫
    hdu 杭电 2216 Game III 果枫
  • 原文地址:https://www.cnblogs.com/datatool/p/13457972.html
Copyright © 2011-2022 走看看