二. 函数进阶(闭包)一

一 .闭包

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

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

       闭包作业:

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

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

# 简单闭包
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)
闭包函数获取网络应用

 

posted @ 2019-05-10 00:48  supreme9999  阅读(229)  评论(0编辑  收藏  举报