标签:tps 外部变量 import 变量 print name 函数对象 全局 com
函数对象:
第一类对象:
第一类对象所特有的特性为:
函数、类、模块等所有对象都是第一类的
闭包函数:
函数内定义的函数为内部函数
内部函数包含对外部作用域而非全局作用域的引用
定义闭包函数的基本形:
def 外部函数名():
    内部函数需要的变量
    def 内部函数():
        引用外部变量
    return 内部函数
----------------------------------------------------------
# 举例
def f1():
    x=1
    def f2():
        print(x)
    return f2
f = f1()
print(f)        # <function f1.<locals>.f2 at 0x00000189C2226158>
f()
print(f.c.__closure__[0].cell_contents)  # 查看闭包元素   闭包函数都有 __closure__ 方法
# 这里内部函数f2打印x,f2中没有变量x,去上一层找,找到f1中的x,然后打印,这里的 f 就是闭包函数,包含了对f1中x的引用
闭包特点
闭包函数和作用域:
money = 666
def foo(name):
    print(‘%s have %s money‘ %(name,money))
 
def foo1():
    money = 999
    foo(‘shuai‘)
foo1()                                    #  shuai have 666 money
 
# 这里打印不会是999,函数在定义时就已经确定了作用域,所以当doo函数内没有money时,会去找全局的money
闭包函数让我始终有着一笔钱
money = 888
def func1():
    name = ‘shuai‘
    def func():
        money = 666
        def foo():
            print(‘%s have %s money‘ %(name,money))
        return foo
    return func
f = func1()
f1 = f()
 
def foo1():
    money = 999
    f1()
foo1()
 
# 包了两层
    # 先看func1和func,这两个函数返回闭包函数 func,包含了 name
    # func 和 foo ,这俩函数返回闭包函数 foo,包含了 money
# f = func1()   拿到 func,再执行f1 = f() 拿到 foo
简单应用:
from urllib.request import urlopen
def get(url):
    return urlopen(url).read()
print(get(‘http://www.xiaohua100.cn‘))
 
# 获取校花网信息 
# 问题:每次都要传url,网站过多,url是没法记住的
 
 
# 闭包应用
from urllib.request import urlopen
def index(url):
    def get():
        return urlopen(url).read()
    return get
 
xiaohua = index(‘http://xiaohua100.cn‘)
print(xiaohua())
jidong = index(‘https://www.jd.com/‘)
print((jidong()))
 
# 这样想要下载哪个就执行哪个,不用就放着,并且不用传url;
标签:tps 外部变量 import 变量 print name 函数对象 全局 com
原文地址:https://www.cnblogs.com/Mr-chenshuai/p/9954110.html