Одним из основных преимуществ декоратора является то, что он может извлекать похожий код в большом количестве функций, которые не имеют ничего общего с его собственной функцией, чтобы добиться эффекта повторного использования кода.
\
один
\
def dec(func):
print ("lakers")
def inner():
print(" kobebryant111.")
func()
print(" kobebryant222.")
return func()
print("los ")
return inner
@dec
def myfunc():
print(" kobebryant.")
myfunc()
\
Выходной результат:
lakers
los
kobebryant111.
kobebryant.
kobebryant222.
kobebryant.\
\
два
\
def dec(func):
def inner(*arg,**kwarg):
print("answer:%s<=>%s"%(arg,kwarg))
return func(*arg,**kwarg)
return inner
@dec
def f1(x,y):
return x*y
@dec
def f2():
print("i am f2()")
return 100
f1(5,4)
f2()
\
Выходной результат:
answer:(5, 4)<=>{}
answer:()<=>{}
i am f2()\
\
\
три
\
import time
def dec(func):
start=time.time()
func()
end=time.time()
take=end-start
print("take %f s"%take)
def myfunc():
print("myfunc start--------")
time.sleep(3)
print("myfunc end----------")
dec(myfunc)
\
Выходной результат:
myfunc start--------
myfunc end----------
take 3.063872 s\
\
Четыре
\
import time
def dec(func):
def inner():
start=time.time()
func()
end=time.time()
take=end-start
print("take %f s"%take)
return inner
def myfunc():
print("myfunc start--------")
time.sleep(3)
print("myfunc end----------")
print("myfunc is ",myfunc.__name__)
myfunc=dec(myfunc)
print ("myfunc is ",myfunc.__name__)
myfunc()
\
Выходной результат:
myfunc is myfunc
myfunc is inner
myfunc start--------
myfunc end----------
take 3.010637 s\
\
пять
\
import functools
import time
def dec(func):
@functools.wraps(func)
def inner():
start=time.time()
func()
end=time.time()
take=end-start
print("take %f s"%take)
return inner
def myfunc():
print("myfunc start--------")
time.sleep(3)
print("myfunc end----------")
print("myfunc is ",myfunc.__name__)
myfunc=dec(myfunc)
print ("myfunc is ",myfunc.__name__)
myfunc()
\
Выходной результат:
myfunc is myfunc
myfunc is myfunc
myfunc start--------
myfunc end----------
take 3.042459 s\
шесть
import functools
def text(addtest):
def dec(func):
print ("one----------")
@functools.wraps(func)
def inner():
print("%s"%addtest)
return func()
print("one============ ")
return inner
return dec
@text("testtext")
def myfunc():
print(" kobebryant.")
myfunc()
print("myfunc is ",myfunc.__name__)
\
Выходной результат:
one----------
one============
testtext
kobebryant.
myfunc is myfunc\
\
Семь
\
def dec1(func):
print ("one----------")
def inner():
print(" kobebryant111.")
func()
print(" kobebryant222.")
return func()
print("one============ ")
return inner
def dec2(func):
print ("two----------")
def inner():
print(" kobebryant333.")
func()
print(" kobebryant444.")
return func()
print("two============ ")
return inner
@dec2
def myfunc():
print(" kobebryant.")
myfunc()
print("myfunc is ",myfunc.__name__)
\
Выходной результат:
two----------
two============
kobebryant333.
kobebryant.
kobebryant444.
kobebryant.
myfunc is inner\
\
8
\
def dec1(func):
print ("one----------")
def inner():
print(" kobebryant111.")
func()
print(" kobebryant222.")
return func()
print("one============ ")
return inner
def dec2(func):
print ("two----------")
def inner():
print(" kobebryant333.")
func()
print(" kobebryant444.")
return func()
print("two============ ")
return inner
@dec1
@dec2
def myfunc():
print(" kobebryant.")
myfunc()
print("myfunc is ",myfunc.__name__)
\
Выходной результат:
two----------
two============
one----------
one============
kobebryant111.
kobebryant333.
kobebryant.
kobebryant444.
kobebryant.
kobebryant222.
kobebryant333.
kobebryant.
kobebryant444.
kobebryant.
myfunc is inner\
\
Девять
\
def dec(func):
tmp={}
def wrap(*args):
if args not in tmp:
tmp[args]=func(*args)
return tmp[args]
return wrap
@dec
def fib1(n):
if n==1 or n==0:
return 1;
else:
return fib1(n-2)+fib1(n-1)
def fib2(n,tmp=None):
if tmp is None:
tmp={}
if n in tmp:
return tmp[n]
if n==1 or n==0:
return 1
else:
tmp[n]=fib2(n-1,tmp)+fib2(n-1,tmp)
return tmp[n]
def fib(n):
if n==1 or n==0:
return 1
else:
return fib(n-2)+fib(n-1)
import time
begin=time.time()
print([fib1(n) for n in range(30)])
end=time.time()
print(end-begin)
begin=time.time()
[fib2(n) for n in range(30)]
end=time.time()
print(end-begin)
begin3=time.time()
[fib(n) for n in range(30)]
end3=time.time()
print(end3-begin3)
\
Выходной результат:
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040]
0.031210899353027344
0.0
0.8125066757202148\
\
\
\
\