闭包函数与装饰器
一、闭包函数
闭包函数:函数内部定义函数,成为内部函数,
该内部函数包含对外部作用域,而不是对全局作用域名字的引用
那么该内部函数成为闭包函数
name='alex'
# def func():
# name='egon'
# def bar():
# print(name)
# return bar
bar函数为一个闭包函数,它包含了对外部作用域name,并不是去找全局作用域的name
b=func()
print(b)
闭包函数:1 内部函数 2 包含对外部作用域而非全局作用域的引用
闭包函数的特点:
自带作用域
延迟计算
#定义闭包函数的基本形式
# def 外部函数名():
# 内部函数需要的变量
# def 内部函数():
# 引用外部变量
# return 内部函数
money=100
# def name():
# name='enon'
# def mo():
# money=10
# def tell_in():
# print('%s have money %s' %(name,money))
# return tell_in
# return mo
# a=name()
# name_money=a()
# print(name_money.__closure__[0].cell_contents)#闭包函数的参数用来判断是否为闭包函数!
# print(name_money.__closure__[1].cell_contents)
二global与nonlocal关键字
x=1
def fuck ():
global x#global 关键字将函数内的局部变量改为全局变量
x=100000
def fuck2():
x=100
def fuck3():
x=1000
print(x)
print(x)
print(x)
fuck()
x=1
def f():
x=2
def d():
nonlocal x#nonlocal关键字将本函数内部的变量改为它上一层变量并且只作用与函数内部!
x=3
def a():
pass
print(x)
f()
三、装饰器
-----------
(1):程序遵循开放封闭原则,对扩展是开放的,对修改是封闭的
(2):装饰器,装饰器本质可以任意可调用对象,被装饰的对象也可以是任意
可调用对象,
装饰器的功能是:
在不修改被装饰对象源代码以及调用方式的前提下为期添加新功能
原则:
1.不修改源代码
2.不修改调用方法
目标:添加新功能
--------------#装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字import timeimport random#装饰器def timmer(func):
def wrapper():
start_time = time.time()
func()
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return wrapper
#被装饰函数
@timmer #index=timmer(index) #装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字
def index():
time.sleep(random.randrange(1,5))
print('welecome to index page')
@timmer #home=timmer(home)
def home():
time.sleep(random.randrange(1,3))
print('welecome to HOME page')
index() #wrapper()
home()
#装饰器修订版这样能满足任意类型和任意类型的实参传入形参!
import time
import random
#装饰器
def timmer(func):
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
def index():
time.sleep(random.randrange(1,5))
print('welecome to index page')
@timmer
def home(name):
time.sleep(random.randrange(1,3))
print('welecome to %s HOME page' %name)