#Python 2.5
創(chuàng)新互聯(lián)建站專注于陽江網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供陽江營銷型網(wǎng)站建設(shè),陽江網(wǎng)站制作、陽江網(wǎng)頁設(shè)計、陽江網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)服務(wù),打造陽江網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供陽江網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
#這個可以用修飾器來完成
#但是一般不會限制參數(shù)類型
#給你個思路:
def argfilter(*types):
def deco(func):
#這是修飾器
def newfunc(*args):
#新的函數(shù)
if len(types)==len(args):
correct = True
for i in range(len(args)):
if not isinstance(args[i], types[i]):
#判斷類型
correct = False
if correct:
return func(*args)
#返回原函數(shù)值
else:
raise TypeError
else:
raise TypeError
return newfunc
#由修飾器返回新的函數(shù)
return deco
#返回作為修飾器的函數(shù)
@argfilter(int, str)
#指定參數(shù)類型
def func(i, s):
#定義被修飾的函數(shù)
print i, s
#之后你想限制類型的話, 就這樣:
#@argfilter(第一個參數(shù)的類名, 第二個參數(shù)的類名, ..., 第N個參數(shù)的類名)
#def yourfunc(第一個參數(shù), 第一個參數(shù), ..., 第N個參數(shù)):
#
...
#
#相當(dāng)于:
#def yourfunc(第一個參數(shù), 第一個參數(shù), ..., 第N個參數(shù)):
#
...
#yourfunc = argfilter(第一個參數(shù)的類名, 第二個參數(shù)的類名, ..., 第N個參數(shù)的類名)(yourfunc)
python 限制函數(shù)調(diào)用次數(shù)的實例講解
發(fā)布時間:2018-04-21 09:58:18 作者:隨便起個名字啊
下面小編就為大家分享一篇python 限制函數(shù)調(diào)用次數(shù)的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
如下代碼,限制某個函數(shù)在某個時間段的調(diào)用次數(shù),
靈感來源:python裝飾器-限制函數(shù)調(diào)用次數(shù)的方法(10s調(diào)用一次) 歡迎訪問
原博客中指定的是緩存,我這里換成限制訪問次數(shù),異曲同工
#newtest.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import time
def stat_called_time(func):
cache={}
limit_times=[10]
def _called_time(*args,**kwargs):
key=func.__name__
if key in cache.keys():
[call_times,updatetime]=cache[key]
if time.time()-updatetime 60:
cache[key][0]+=1
else:
cache[key]=[1,time.time()]
else:
call_times=1
cache[key]=[call_times,time.time()]
print('調(diào)用次數(shù): %s' % cache[key][0])
print('限制次數(shù): %s' % limit_times[0])
if cache[key][0] = limit_times[0]:
res=func(*args,**kwargs)
cache[key][1] = time.time()
return res
else:
print("超過調(diào)用次數(shù)了")
return None
return _called_time
@stat_called_time
def foo():
print("I'm foo")
if __name__=='__main__':
for i in range(10):
foo()
#test.py
from newtest import foo
import time
for i in range(30):
foo()
print('*'*20)
foo()
foo()
print('*'*20)
for i in range(60):
print(i)
time.sleep(1)
for i in range(11):
foo()
有的時候, 我們希望會保留列表中的數(shù)據(jù)作為備份,又不希望函數(shù)中不修改列表的值,該怎么做?python中提供了一種方法,將列表的副本傳遞給
函數(shù),這樣函數(shù)修改的只是列表的副本, 不會修改原列表的內(nèi)容,可以按照下面這樣做:
function_name(list_name[:])
切片表示法[:]創(chuàng)建列表副本.
如下面程序: 我們可以 給print_models 方法傳遞 unprinted_designs[:],這樣原列表?unprinted_designs值的就不會被修改
def print_models(unprinted_designs ,completed_models):
"""
模擬打印每個設(shè)計,直到?jīng)]有未打印的設(shè)計為止
打印每個設(shè)計后,都將其移到列表completed_models中
"""
while unprinted_designs:
? ? current_design = unprinted_designs.pop()
? ? #模擬根據(jù)設(shè)計制作3D打印模型的過程
? ? print("Printing model:"+current_design)
? ? completed_models.append(current_design)
def show_completed_models(completed_models):
"""顯示打印的所有模型"""
print("\n The following mdels have been printed:")
for completed_model in completed_models:
? ? print(completed_model)
unprinted_designs =['iphone case','robot pendant','dodecahedron']
completed_models = []
print_models(unprinted_designs , completed_models)
show_completed_models(completed_models)
python不能無限的遞歸調(diào)用下去。并且當(dāng)輸入的值太大,遞歸次數(shù)太多時,python 都會報錯
首先說結(jié)論,python解釋器這么會限制遞歸次數(shù),這么做為了避免"無限"調(diào)用導(dǎo)致的堆棧溢出。
tail recursion 就是指在程序最后一步執(zhí)行遞歸。這種函數(shù)稱為 tail recursion function。舉個例子:
這個函數(shù)就是普通的遞歸函數(shù),它在遞歸之后又進行了 乘 的操作。 這種普通遞歸,每一次遞歸調(diào)用都會重新推入一個調(diào)用堆棧。
把上述調(diào)用改成 tail recursion function
tail recursion 的好處是每一次都計算完,將結(jié)果傳遞給下一次調(diào)用,然后本次調(diào)用任務(wù)就結(jié)束了,不會參與到下一次的遞歸調(diào)用。這種情況下,只重復(fù)用到了一個堆棧。因此可以優(yōu)化結(jié)構(gòu)。就算是多次循環(huán),也不會出現(xiàn)棧溢出的情況。這就是 tail recursion optimization 。
c和c++都有這種優(yōu)化, python沒有,所以限制了調(diào)用次數(shù),就是為了防止無限遞歸造成的棧溢出。
如果遞歸次數(shù)過多,導(dǎo)致了開頭的報錯,可以使用 sys 包手動設(shè)置recursion的limit
手動放大 recursionlimit 限制: