每次在Python 2.7.3中对某个函数进行一定数量的调用时,我需要增加一个变量。
例如,feetTraveled = 0
。 for
每12次调用travelOneInch()
,feetTraveled += 1
。
使用for循环是否最佳?或者我应该使用不同的东西? 如果最好使用像上面那样的for循环,那么应该放置什么而不是'每12次调用'?
另一个例子:我有四个仆人。它们每个都在时钟滴答中执行一项任务,时间计数器最初为time = 0
。所以for every four calls to servantDo()
,time += 1
。
答案 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)
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