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()
    

      



  • 相关阅读:
    7.1MongoDB之索引
    7.1MongoDB之排序
    6.30MongoDB之Limit与Skip方法
    6.30Java连接MongoDB进行操作练习
    6.30MongoDB之$type操作符
    6.30MongoDB之条件操作符
    6.30MongoDB之"查"
    6.29MongoDB之"改"
    c# 调用jar包
    sql server SQL 调试:无法启动 T-SQL 调试。未能附加到 SQL Server 进程
  • 原文地址:https://www.cnblogs.com/datatool/p/13457972.html
Copyright © 2011-2022 走看看