1

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

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

使用 for 循环是最佳选择还是我应该使用不同的东西?如果最好使用上面的 for 循环,应该放置什么而不是“每 12 次调用”?

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

4

4 回答 4

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)

绝大多数情况下,如果您希望一个函数在调用之间记住某种状态,那么您根本不是在寻找一个函数——您是在寻找一个具有实例方法的类。

于 2012-11-23T18:14:49.313 回答
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

这不是最简单的解决方案,如果您需要多个计数器就会有问题,但知道这很有趣。它的优点是从类定义(即在后台使用)中删除了一些杂乱的代码(至少在简单的情况下),并在您将使用该函数的任何地方保持状态可访问,而不会篡改全局变量(我确实如此)不喜欢)

于 2012-11-23T18:19:42.343 回答
0

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

inches = 0
feet   = 0

def travelOneInch(sure):
    inches += 1

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

并且使用inches % 12 == 0inches > 12你希望你的函数识别第二只脚和更远的脚更好。

于 2012-11-23T18:20:33.763 回答
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
于 2012-11-23T18:24:42.770 回答