zoukankan      html  css  js  c++  java
  • 二. 函数进阶(闭包)一

    一 .闭包

    概念: 是一个闭包 把一个函数当做参数返回一个替代的函数 本质上就是一个返回函数的函数

            闭包函数 嵌套函数 调用外部函数的变量

           闭包作业:

               可以保护你的变量不受侵害

               可以让一个变量常驻内存中

    # 简单闭包
    def fun1():
     print("哈哈哈哈哈哈name")
    
    def fun2():
       print("啦啦啦啦啦啦啦")
       fun1()
    fun2()
    # 啦啦啦啦啦啦啦
    # 哈哈哈哈哈哈name
    # 闭包函数 嵌套函数 调用外部函数的变量
    def ss():
        a=20000    可以让一个变量常驻内存中   
        def inner():
            print(a)
        print(inner.__closure__)
    ss()
    
    def ls():
        a="张三啊哈哈哈哈啊哈"
        def ll():
            print(a)
        return  ll
    inn=ls()
    inn()
    
    # (<cell at 0x0000012CFC17A708: int object at 0x0000012CFC159CD0>,)
    # 张三啊哈哈哈哈啊哈
     # 函数名可以作为返回值
    def func():
        print(123)
    
    def nice(f):
        print(456)
        f()
        return f  # 函数名可以作为返回值
    ff=nice(func) # 函数名可以作为函数的参数
    ff()
    # 456
    # 123
    # 123
    from urllib.request  import urlopen
    ret=urlopen('https://www.88tph.com/topic/zhuangshihua/').read()
    print(ret)
    def get_rul():
        ul='https://www.88tph.com/topic/zhuangshihua/'
        ret=urlopen(ul).read()
        print(ret)
    get_rul()
    
    
    def geta():
        ula='http://huaban.com/boards/29108884/'
        def cc():
            ret=urlopen(ula).read()
            print(ret)
        return  cc
    bb=geta()
    bb()
    爬取
    a=1
    b=5
    def hh(a,b):
        print(a,b)
    aa=hh(6,44)
    print(aa,"111")
    # 6 44
    # None 111
    
    a=1
    b=5
    def hh(a,b):
         return  a,b
    aa=hh(6,44)
    print(aa,"111")
    print(aa)
    # (6, 44) 111
    # (6, 44)
    def dd(*args):
        print(type(args))
        ff=0
        for i in args:
         ff+=i
        print(ff)
        print(type(ff))
    
    dd(5,5,5,5)
    
    # <class 'tuple'>
    # 20
    # <class 'int'>

     三层嵌套函数使用 闭包

    # 三层嵌套函数使用   闭包
    # cc.__closure__   判断闭包是否存在  不存在返会None
    def aa(b):
        print("这是aa函数")
        name=6666
        def bb():
            print("这是bb函数")
            print(name)
            print(b)
            def cc():
                print("这是cc函数")
                print(name)
                print(b)
            print(cc.__closure__)
            return cc
    
        print(bb.__closure__)
        return bb
    
    bb=aa(999999)
    cc=bb()
    cc()

     一共有三种命名空间从大范围到小范围的顺序:内置命名空间、全局命名空间、局部命名空间

    作用域(包括函数的作用域链):

    函数的嵌套:

      嵌套调用

      嵌套定义:定义在内部的函数无法直接在全局被调用

    函数名的本质:

      就是一个变量,保存了函数所在的内存地址

    闭包:

      内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数

    案例 . 闭包函数获取网络应用

    from urllib.request import urlopen
    
    def getl():
    
        def aa(url):
          name=urlopen(url).read()
          return  name
        return  aa
    aa=getl()
    cc=aa("http://www.xiaohuar.com/")
    print(cc)
    
    cc=aa("https://re.jd.com/list/item/1421-37857431390.html?re_dcp=202m0QjIIg==&cu=true&utm_source=baidu-nks&utm_medium=cpc&utm_campaign=t_262767352_baidunks&utm_term=83117993061_0_5d7f065e74ab4f90bfcf5694d08c39d6")
    print(cc)
    from urllib.request import urlopen
    
    def index():
        url = "http://www.xiaohua100.cn/index.html"
        def get():
            return urlopen(url).read()
        return get
    
    xiaohua = index()
    content = xiaohua()
    print(content)
    闭包函数获取网络应用
  • 相关阅读:
    福尔摩斯的约会 (20)
    数素数 (20)
    STL源码分析-priority_queue
    STL源码分析-bitset
    STL源码分析-rbtree
    STM32自动生成精美图案
    STL源码分析-function
    STL源码分析-list
    STL源码分析-iterator
    STL源码分析-traits
  • 原文地址:https://www.cnblogs.com/Sup-to/p/10842072.html
Copyright © 2011-2022 走看看