遞迴函式
# 遞迴函式
# 經典遞迴函式錯誤寫法
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...