如何在Python中循环调用每个函数

时间:2012-11-23 18:05:02

标签: python python-2.7

每次在Python 2.7.3中对某个函数进行一定数量的调用时,我需要增加一个变量。

例如,feetTraveled = 0for每12次调用travelOneInch()feetTraveled += 1

使用for循环是否最佳?或者我应该使用不同的东西? 如果最好使用像上面那样的for循环,那么应该放置什么而不是'每12次调用'?

另一个例子:我有四个仆人。它们每个都在时钟滴答中执行一项任务,时间计数器最初为time = 0。所以for every four calls to servantDo()time += 1

4 个答案:

答案 0 :(得分:3)

在这种情况下,我想我会使用实例方法:

class Foo(object):
    def __init__(self):
        self.inches = 0
        self.feet = 0

    def travel_one_inch(self):
        self.inches += 1
        if self.inches > 11:
            self.inches = 0
            self.feet += 1

    def __str__(self):
        return "{feet} feet and {inches} inches".format(feet=self.feet,inches=self.inches)

a = Foo()
for _ in range(123):
    a.travel_one_inch()
print(a)

绝大多数情况下,如果你想要一个函数来记住调用之间的某种状态,你根本就找不到函数 - 你正在寻找一个带有实例方法的类。

答案 1 :(得分:0)

最好的实现可能是使用一个对象来存储状态并使用该函数来修改它:

class Position(object):
    def __init__(self):
        self.pos = 0
    def advance(self,inches=1):
        self.pos += inches
    def pos_as_foot(self):
        return self.pos // 12

如果您发现这种方法有点无聊(即使它是最正确的方法),您可以尝试更深奥的方法:您可以使用该函数的内部值,即将其视为对象

def foo():
    foo.value+=1
    if foo.value and not foo.value%12:
        foo.result+=1
foo.value=0
foo.result=0

for i in range(15): 
    foo()
print foo.value
#15
print foo.result
#1

这不是最简单的解决方案,如果你需要几个计数器就有问题,但有趣的是要知道。它有一个优点是从类定义中删除一些混乱的代码(至少在简单的情况下)(在引擎盖下使用),并保持状态可访问,无论你将使用该函数,而不会篡改全局变量(我reaaaly不喜欢)

答案 2 :(得分:0)

如果您想在全局命名空间中工作:

inches = 0
feet   = 0

def travelOneInch(sure):
    inches += 1

    if (inches % 12) == 0:
        feet += 1
    #...

使用inches % 12 == 0优于inches > 12,以防您希望自己的功能识别出第二个和更多的脚。

答案 3 :(得分:0)

mgilson(上图)知道发生了什么事。如果我是你,我会做以下事情,以使事情变得更容易:

class Foo(object):
    def __init__(self):
        self.__inches = 0

    def travel_one_inch(self):
        self.__inches += 1

    def feetTraveled(self):
        return self.__inches // 12

但是,就最优性而言,如果您只是这样做一次,那么您可以使用临时变量:

feetTraveled = 0
inchesTraveled = 0
for i in xrange(72):
    # as in mgilson's answer
    inchesTraveled += 1
    if inchesTraveled > 11:
        inchesTraveled = 0
        feetTraveled += 1