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

    引入

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

    一.什么是闭包函数

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

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

    '总结一句话来说' : 定义在函数内部的函数, 并且该函数包含对外部函数作用域中名字的引用,该函数就称为闭包函数
        
    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
    
  • 相关阅读:
    Android:SurfaceView和View 区别
    放下这8件事 就离成功不远了
    Android 的参考资料地址
    Java内存分配原理(二)
    J2ME最佳实践之联网开发编写反应灵敏的联网提示界面
    [转载]正则表达式学习
    Java内存分配原理(三)
    flashpaper2.2 asp.net win2003 iis 配置解决方案
    ubuntu ip地址,jdk,ssh配置
    office 2007 打开xls提示格式不正确
  • 原文地址:https://www.cnblogs.com/songhaixing/p/14051164.html
Copyright © 2011-2022 走看看