重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
python 限制函数调用次数的实例讲解
成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都做网站、网站设计、外贸营销网站建设、右江网络推广、成都小程序开发、右江网络营销、右江企业策划、右江品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供右江建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
发布时间:2018-04-21 09:58:18 作者:随便起个名字啊
下面小编就为大家分享一篇python 限制函数调用次数的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
如下代码,限制某个函数在某个时间段的调用次数,
灵感来源:python装饰器-限制函数调用次数的方法(10s调用一次) 欢迎访问
原博客中指定的是缓存,我这里换成限制访问次数,异曲同工
#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('调用次数: %s' % cache[key][0])
print('限制次数: %s' % limit_times[0])
if cache[key][0] = limit_times[0]:
res=func(*args,**kwargs)
cache[key][1] = time.time()
return res
else:
print("超过调用次数了")
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()
你可以使用Python中的 `int()` 函数,它将给定的参数强制转换为整数。比如 `int(x)`,其中 `x` 是可以是浮点数、字符串或布尔值的变量。
python不能无限的递归调用下去。并且当输入的值太大,递归次数太多时,python 都会报错
首先说结论,python解释器这么会限制递归次数,这么做为了避免"无限"调用导致的堆栈溢出。
tail recursion 就是指在程序最后一步执行递归。这种函数称为 tail recursion function。举个例子:
这个函数就是普通的递归函数,它在递归之后又进行了 乘 的操作。 这种普通递归,每一次递归调用都会重新推入一个调用堆栈。
把上述调用改成 tail recursion function
tail recursion 的好处是每一次都计算完,将结果传递给下一次调用,然后本次调用任务就结束了,不会参与到下一次的递归调用。这种情况下,只重复用到了一个堆栈。因此可以优化结构。就算是多次循环,也不会出现栈溢出的情况。这就是 tail recursion optimization 。
c和c++都有这种优化, python没有,所以限制了调用次数,就是为了防止无限递归造成的栈溢出。
如果递归次数过多,导致了开头的报错,可以使用 sys 包手动设置recursion的limit
手动放大 recursionlimit 限制:
def hanshu(*a):
return a
print(hanshu(1,2))
输出(1,2)
print(hanshu(1,2,3,4,5,6))
输出(1,2,3,4,5,6)
print(hanshu('a','b','c'))
输出('a','b','c')
注意:这里a会自动生成元组,不是列表。