所以我试图做一个函数,跟踪一个方法被调用的次数。 例如:有没有一种方法可以跟踪函数被调用的次数?
a = [1,2,3,4]
a.pop()
我想知道有多少次a.pop()是到目前为止在这个例子叫,我会得到1 有没有办法做到这一点?
所以我试图做一个函数,跟踪一个方法被调用的次数。 例如:有没有一种方法可以跟踪函数被调用的次数?
a = [1,2,3,4]
a.pop()
我想知道有多少次a.pop()是到目前为止在这个例子叫,我会得到1 有没有办法做到这一点?
一个简单的方法是每次调用函数时增加一个全局变量。
counter = 0
a = [1,2,3,4]
a.pop()
counter += 1
我相信OP想知道调用了多少次'a.pop()',那么你就不会那么做。你基本上是在计算你的代码在一个时间间隔内运行的次数。 – enginefree
是的,我基本上是自己创建课堂,我需要计算一次调用方法的次数,但现在我已经明白了。感谢大家的帮助。 – user3050527
这并不适用于内置函数的工作,但一个有趣的方法是:
def myfunction():
myfunction.counter += 1
myfunction.counter = 0
你给的功能属性,所以每次调用属性被更新。没有全局变量需要。
内置插件是只读的。他们不能被修改。
谢谢。这节省了我的一天。 – lanenok
counter = 0
def pop():
counter += 1
print counter
#other function code
a = [1,2,3,4]
a.pop()
这应该解决您的问题,你应该能够看到什么被计数。 + 每次调用函数时,计数器将随着函数的每次传递而增加和打印。
IF其内置的:
counter = 0
def newfunction():
a = [1,2,3,4]
a.pop()
counter += 1
print counter
在这个逻辑是,它会调用你的新功能进入功能被预制然后走出的内置函数,然后去纪念计数器增加。输出你的计数器。
iirc你必须全局变量,然后才能在全局范围内修改它的函数 – icedtrees
谢谢,我忘了补充一点。 :p – castaway2000
您可以使用一个装饰器来跟踪该函数被调用的次数。由于list
是内置的,因此您不能修饰或替换其pop
方法,因此您必须使用自己的列表类。
def counted(f):
def wrapped(*args, **kwargs):
wrapped.calls += 1
return f(*args, **kwargs)
wrapped.calls = 0
return wrapped
class MyList(list):
@counted
def pop(self, *args, **kwargs):
return list.pop(self, *args, **kwargs)
x = MyList([1, 2, 3, 4, 5])
for i in range(3):
x.pop()
print x.pop.calls # prints 3
这简直是美丽的。谢谢! –
踢,我写了使用装饰的答案:
class counter:
#wraps a function, to keep a running count of how many
#times it's been called
def __init__(self, func):
self.func = func
self.count = count
def __call__(self, *args, **kwargs):
self.count += 1
return self.func(*args, **kwargs)
要使用它,简单的装饰功能。然后您可以通过检查“count”属性来检查该函数运行了多少次。这样做很好,因为:
1.)没有全局变量。计数直接与函数关联。
2)你可以很容易地包裹内置功能,通过直接调用类:
sum_wrapped = counter(sum)
sum_wrapped([1, 2 ,3, 4])
#outputs 10
print sum_wrapped.count
#outputs 1
当然,这可以通过使用Decorators模块,以保持文档字符串和其他好东西原封不动加以改进。此外,要了解装修工的概况以及工作原理,请查看this stackoverflow answer。
一种方法是创建要计数属性访问该实例的代理:
from collections import Counter
class CountingProxy():
def __init__(self, instance):
self._instance = instance
self.count = Counter()
def __getattr__(self, key):
if hasattr(self._instance, key):
self.count[key] += 1
return getattr(self._instance, key)
>>> l = [1,2,3,4,5]
>>> cl = CountingProxy(l)
>>> cl.pop()
5
>>> cl.append(10)
>>> cl.index(3)
2
>>> cl.reverse()
>>> cl.reverse()
>>> cl.count
Counter({'reverse': 2, 'pop': 1, 'append': 1, 'index': 1})
这个计数*访问*而不一定*调用*,这在某些情况下可能是一个重要的区别。例如'f = cl.pop; F(); F(); F();' – FogleBird
我用下面的小动作跟踪函数调用的次数
def myfun(s,i=[0]):
print(s)
i[0]+=1 # mutable variable get evaluated ONCE
return i[0]
>>> myfun('aaa')
aaa
1
>>> myfun('bbb')
bbb
2
很容易用你自己的功能来完成,而不是那些内置的功能。 – roippi
创建一个全局变量或通过引用 – wipindipy10
在函数'pop'中传递,您可以定义一个名为'counter'的变量,然后在该函数的第一行执行'counter + = 1'。或类似的东西 – enginefree