Python之裝飾器

2021-09-10 21:12:13 字數 3552 閱讀 9374

遞迴函式
# 遞迴函式

# 經典遞迴函式錯誤寫法

def calc(n):

print(n)

return calc(n+1)

calc(0)

遞迴函式特性

必須有乙個明確的結束條件

每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少

遞迴效率不高,遞迴層次過多導致棧溢位

# 需求用乙個數除以2,大於0就繼續除

def calc(n):

print(n)

if int(n/2) > 0:

return calc(int(n/2))

print('->>>',n)

calc(10)

實現裝飾器的知識儲備:

函式即「變數」

高階函式

巢狀函式

高階函式
a:把乙個函式名當做乙個實參傳給另外乙個函式(在不修改被裝飾函式源**的情況下為其新增功能)

b:返回值中包含函式名(不修改函式的呼叫方式)

# 高階函式

def add(x, y, f):

return f(x)+ f(y)

res = add(3,-6,abs)

print(res)

巢狀函式
def func1():

print('in the func1')

def func2():

print('in the func2')

裝飾器
# 無參函式+無參裝飾器==

import time

def timmer(func):

def deco():

start_time = time.time()

func()

end_time = time.time()

print("the func foo run time is %s"%(end_time - start_time))

return deco

@timmer #等價於宣告 foo = timmer(foo)

def foo():

time.sleep(2)

print('in the func foo!')

@timmer #等價於宣告 bar = timmer(bar)

def bar():

time.sleep(2)

print('in the func bar!')

foo()

bar()

# 有參函式+無參裝飾器

import time

def timmer(func):

def deco(*args,**kwargs):

start_time = time.time()

func(*args,**kwargs)

end_time = time.time()

print('the func foo run time is %s'%(end_time - start_time))

return deco

@timmer

def foo():

time.sleep(2)

print('in the func foo')

@timmer

def bar(name):

time.sleep(2)

print('print my name is %s'%name)

@timmer

def font(num, *args, **kwargs):

print(num)

time.sleep(2)

print(args, kwargs)

foo()

bar('kobe')

font(24, 'kobe', 'james', 'wade', kobe=24, james=23, wade=3)

# demo

user, passwd = 'kobe','abc123'

def auth(func):

username = input('username:').strip()

password = input('password:').strip()

if user == username and passwd ==password:

print('ok')

func(*args, **kwargs)

# res = func(*args, **kwargs)

# print(res) # 如果被裝飾的函式含有return,想列印出來,用此方法

else:

print('no')

def index():

print('welcome to index page!')

@auth

def home():

print('welcome to home page!')

return 'from home' # 被裝飾的函式含有return部分

@auth

def bbs():

print('welcome to bba page!')

index()

home()

bbs()

# 有參函式+ 有參裝飾器

user, passwd = 'kobe','abc123'

def auth(auth_type):

if auth_type =='local':

username = input('username:').strip()

password = input('password:').strip()

if user == username and passwd ==password:

print('ok')

func(*args, **kwargs)

# res = func(*args, **kwargs)

# print(res)

else:

print('no')

else:

print('搞個毛的ldbs')

def index():

print('welcome to index page!')

@auth(auth_type = 'local')

def home():

print('welcome to home page!')

return 'from home'

@auth(auth_type = 'ldbs')

def bbs():

print('welcome to bba page!')

index()

home()

bbs()

python裝飾器介紹 Python之裝飾器簡介

python函式式程式設計之裝飾器 1.開放封閉原則 簡單來說,就是對擴充套件開放,對修改封閉。在物件導向的程式設計方式中,經常會定義各種函式。乙個函式的使用分為定義階段和使用階段,乙個函式定義完成以後,可能會在很多位置被呼叫。這意味著如果函式的定義階段 被修改,受到影響的地方就會有很多,此時很容易...

python 找到裝飾器 Python之裝飾器

裝飾器本質上就是乙個python函式,他可以讓其他函式在不需要做任何 變動的前提下,增加額外的功能,裝飾器的返回值也是乙個函式物件。裝飾器的作用 在不改變原函式及原函式的執行的情況下,為原函式增加一些額外的功能,比如列印日誌 執行時間,登入認證等等。乙個簡單的裝飾器 import time def ...

Python之裝飾器

裝飾器就是乙個以函式作為引數並返回乙個替換函式的可執行函式 即裝飾器是乙個函式,其引數為函式,返回值也為函式 可理解為對函式的功能進行拓展,所以叫裝飾 outer為裝飾器,效果為給被裝飾函式返回值結果加負號 defouter fun definner x return fun x return in...