大前提:函数的作用域关系是在函数定义阶段就已经固定死的,与调用位置无关
闭包函数:
1、闭指的是-》定义在函数的内部的函数
2、包-》该内部函数包含对其外层函数作用域名字的引用
闭包函数通常需要结合函数对象的概念,将闭包函数返回到外部使用
def outter():
x=100
def inner():
print(x)
return inner
f=outter()
# x=200
# f()
def foo():
x=300
def bar():
x=400
f()
bar()
foo()
闭包函数的基本形式
def outter(x):
def inner():
print(x)
return inner
import requests#爬虫
安装requests,cmd--在python安装路径下-Scripts\
通过参数的形式为函数体传值
def get(url):
response=requests.get(url)
print(len(response.text))
x='https://www.baidu.com'
get(x)
get(x)
get(x)
y='https://www.jd.com'
get(y)
get(y)
get(y)
#将值包给函数
def outter(url):
#url='https://www.jd.com'
def get():
response=requests.get(url)
print(len(response.text))
return get
jd=outter('https://www.jd.com')
jd()
jd()
jd()
baidu=outter('https://www.baidu.com')
baidu()
baidu()
baidu()
################
def outter():
x=1
def foo():
print(x)
return foo
f=outter()
print(f)
装饰器
1、什么是装饰器
装饰指的是为被装饰对象添加新的功能
器指的的是工具
装饰器本身可以任意可调用的对象,被装饰的对象也可以是任意可调用的对象
目标:
写一个函数用来为另外一个函数添加新功能,需要遵循开放封闭原则(对修改是封闭的,对扩展是开放的)
1、不修改被装饰对象的源代码
2、不修改被装饰对象的调用方式
import time
def index():
time.sleep(3)
print('welcome to index page')
def outter(func): #func=最原始index
def wrapper():
start_time=time.time()
func()
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return wrapper
index=outter(index) #index=wrapper
index() #wrapper()
import time
def index():
time.sleep(0.5)
print('welcome to index page')
return 1234
def home(name):
time.sleep(1)
print('welcome %s to home page' %name)
def timmer(func): #func=最原始index
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return res
return wrapper
# index=timmer(index) #index=wrapper
# home=timmer(home)
# 正常的调用
res=index() #res=wrapper()
print(res)
# home('egon') #wrapper('egon')
装饰器的语法糖:在被装饰对象正上方单独一行写上@装饰器名字
import time
def timmer(func): #func=最原始index
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return res
return wrapper
@timmer #index=timmer(index)
def index():
time.sleep(0.5)
print('welcome to index page')
return 1234
@timmer #home=timmer(home)
def home(name):
time.sleep(1)
print('welcome %s to home page' %name)
# 正常的调用
res=index() #res=wrapper()
print(res)
home('egon') #wrapper('egon')
函数对象、函数嵌套、名称空间与作用域、装饰器
链接:http://www.cnblogs.com/linhaifeng/articles/7532497.html