标签: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