python装饰器
装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
强调装饰器的原则:1 不修改被装饰对象的源代码
2 不修改被装饰对象的调用方式
装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能
函数即变量
高阶函数
嵌套函数
http://www.cnblogs.com/wupeiqi/articles/4980620.html
import time
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 foo():
time.sleep(3)
print('from foo')
foo()
生成器
import time
def consumer(name):
print('%s 准备吃包子' %name)
while True:
baozi = yield
print('包子[%s]来了,被[%s]吃了!' %(baozi,name))
# c = consumer('邵延行')
# c.__next__()
# b1 = '豆沙'
# c.send(b1)
def producer(name): # 协程
c = consumer('a')
c2 = consumer('b')
c.__next__()
c2.__next__()
print('我要开始做包子了')
for i in range(10):
time.sleep(1)
print('做包子分两半')
c.send(i)
c2.send(i)
producer('syh')
迭代器
from collections import Iterator
isinstance([],Iterable) # 是否可迭代对象
# 可以用iner()函数
装饰器(1)
#_*_coding:utf-8_*_
user_status = False #用户登录了就把这个改成True
def login(auth_type): #把要执行的模块从这里传进来
def auth(func):
def inner(*args,**kwargs):#再定义一层函数
if auth_type == "qq":
_username = "alex" #假装这是DB里存的用户信息
_password = "abc!23" #假装这是DB里存的用户信息
global user_status
if user_status == False:
username = input("user:")
password = input("pasword:")
if username == _username and password == _password:
print("welcome login....")
user_status = True
else:
print("wrong username or password!")
if user_status == True:
return func(*args,**kwargs) # 看这里看这里,只要验证通过了,就调用相应功能
else:
print("only support qq ")
return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数
return auth
def home():
print("---首页----")
@login('qq')
def america():
#login() #执行前加上验证
print("----欧美专区----")
def japan():
print("----日韩专区----")
@login('weibo')
def henan(style):
'''
:param style: 喜欢看什么类型的,就传进来
:return:
'''
#login() #执行前加上验证
print("----河南专区----")
home()
# america = login(america) #你在这里相当于把america这个函数替换了
#henan = login(henan)
# #那用户调用时依然写
america()
# henan("3p")
带参数的装饰器