def f1():
b = 123
def f2():
print(b)
定义:必须是嵌套函数,内部函数要使用外部函数变量
内部的函数引用了外部函数的变量就形成闭包函数。
def f1(b): #闭包常用状态
def f2():
print(b)
return f2
ret = f1('bbb') #接收的是f2的地址
ret() #====》 ret() == f1('bbb')()
def f1(): #从内部函数返回一个值到全局
b = 10
def f2():
print(b)
return f2()
print(f1())
from urllib.request import urlopen
# ret = urlopen('http://www.cnblogs.com/Eva-J/articles/7194277.html').read()
# print(ret)
def get_url(url):
def read1():
ret = urlopen(url).read()
print(ret)
return read1
read_func = get_url('http://www.cnblogs.com/Eva-J/articles/7194277.html')
read_func()
read_func()
#讲故事
#带着你一步一步的剖析装饰器的成因
#关于时间:
import time #模块
# start_time = time.time()
# time.sleep(1)
# end_time = time.time()
# print('=====%s====='%(end_time-start_time))
def timmer(func):
def inner():
start_time = time.time()
time.sleep(0.1)
func()
end_time = time.time()
print('=====%s=====' % (end_time - start_time))
return inner
def func():
print('公司好老板好同事好')
# func = timmer(func)
# func()
#装饰器的作用
# 在不改变函数的调用方式的情况下,给函数的前后添加新的功能
#从最简单的装饰器
def timmer(qqxing): #timmer是装饰器的名字,传入的参数就是被装饰的函数
def inner(): #在装饰器中需要定义一个内部函数
print('调用func之前')
qqxing() #被装饰的函数,并且要执行
print('调用func之后')
return inner #将内部函数的名字返回
@timmer #语法糖 func = timmer(func)
def func():
print('公司好老板好同事好')
# func()
# 完整的装饰-万能的装饰
def timmer(qqxing): #timmer是装饰器的名字,传入的参数就是被装饰的函数
def inner(*args,**kwargs): #在装饰器中需要定义一个内部函数
print('调用func之前')
ret = qqxing(*args,**kwargs) #被装饰的函数,并且要执行
print('调用func之后')
return ret
return inner #将内部函数的名字返回
@timmer #语法糖 func = timmer(func)
def func(name):
print('%s的公司好老板好同事好'%(name))
return 1111111111
ret = func('俊杰')
print('result : %s'%ret)
#装饰器的固定结构
def wrapper(func):
def inner(*args,**kwargs):
"""被装饰函数执行之前要添加的代码"""
ret = func(*args,**kwargs)
"""被装饰函数执行之后要添加的代码"""
return ret
return inner
#python特有
#带着你一步步剖析装饰器成因
#装饰器作用:在不改变函数调用方式情况下给函数前后添加功能
#从简单的 到完整的 到万能的
#写一个装饰器的固定结构
#装饰器提高