• 🍖闭包函数


    引入

    闭包函数其实是 名称空间与作用域, 函数嵌套, 函数对象的综合运用

    一.什么是闭包函数

    • 闭 : 指的是定义在函数内部的函数

    • 包 : 闭函数引用了一个来自外层函数的变量

    '总结一句话来说' : 定义在函数内部的函数, 并且该函数包含对外部函数作用域中名字的引用,该函数就称为闭包函数
        
    def outter():
         name='egon'
         def inner():
             print('my name is %s' %name)
         return inner  #注意不能加括号
    
    f=outter()    #f=inner
    
    • 注意 : 作用域在函数定义阶段就规定死了, 与调用的位置无关
    定义阶段已经规定死了到'outter'下面的"x"去拿
    def outter():
         x=2           
         def inner():
             # x=1
             print('from inner',x)
    
         return inner
    
    在全局里面定义也无效
     f=outter()  # f=inner
     print(f)
     x=11111111111111111
     f()  # 2
    
    把它装进一个函数,在函数里面再定义也是无效的
     def foo():
         x=111111111111111111
         f()
    
     foo()  # 2
    

    二.为函数传值的方式

    方式一 : 将值以参数的形式传入

    import requests
    
    将"url"以参数的形式传入(也是最常用)
    def get(url):
        response=requests.get(url)下载
        if response.status_code == 200:
            print(response.text)
    
    get('https://www.baidu.com')
    get('https://www.python.org')
    

    方式二 : 以包的方式传入

    这是个获取网络源码的功能
    import requests    
    
    def outter(url):
        def get():
            response=requests.get(url)
            if response.status_code == 200:
                print(response.text)
        return get
        
    baidu = outter('https://www.baidu.com')
    baidu()
    

    如果难以理解,就来个精简版

    def outter(x):
    	def wrapper():
    		print(x)    #按照查找的优先级去查找"x"
    	return wrapper  #吐出了函数"wrapper"的内存地址
    
    f = outter(10)  #这里返回的值就是函数"wrapper"的内存地址,赋值给"f",加括号就调用
    f()  #10
    
  • 相关阅读:
    Iphone [Tab Bar实现多view切换,Picker,DataPicter实现
    基于socket、多线程的客户端服务器端聊天程序
    C/C++面试题
    Unity3D打Box游戏
    Unity3D项目开发一点经验
    Unity3D使用过程中常见的20个问题
    @property中strong跟weak的区别
    java多线程系列8 高级同步工具(2)CountDownLatch
    java多线程系列7 高级同步工具(1)信号量Semaphore
    java多线程系列6 synchronized 加强版 ReentrantLock
  • 原文地址:https://www.cnblogs.com/songhaixing/p/14051164.html
Copyright © 2020-2023  润新知