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)
    闭包函数获取网络应用
  • 相关阅读:
    POJ 3140 Contestants Division (树dp)
    POJ 3107 Godfather (树重心)
    POJ 1655 Balancing Act (树的重心)
    HDU 3534 Tree (经典树形dp)
    HDU 1561 The more, The Better (树形dp)
    HDU 1011 Starship Troopers (树dp)
    Light oj 1085
    Light oj 1013
    Light oj 1134
    FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869
  • 原文地址:https://www.cnblogs.com/Sup-to/p/10842072.html
Copyright © 2011-2022 走看看