如果您想在 while
循环之前进行 零 初始化,可以使用带有计数器的 单例模式:
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(
cls, *args, **kwargs)
cls.count=0
else:
cls.count+=1
return cls._instance
那么只会有一个 Singleton 实例,每个额外的实例只会增加一个:
>>> Singleton().count # initial instance
0
>>> Singleton().count
1
>>> Singleton().count
2
>>> Singleton().count
3
然后你的while循环变成了:
while Singleton():
x=int(raw_input('x: '))
if x>10: break
print 'While loop executed',Singleton().count,'times'
输入 1,2,3,11
后,它会打印出:
x: 1
x: 2
x: 3
x: 11
While loop executed 4 times
如果您不介意在while
循环之前进行单行初始化,您可以直接子类化迭代器:
import collections
class WhileEnum(collections.Iterator):
def __init__(self,stop=None):
self.stop=stop
self.count=0
def next(self):
if self.stop is not None:
self.remaining=self.stop-self.count
if self.count>=self.stop: return False
self.count+=1
return True
def __call__(self):
return self.next()
那么你的 while 循环变成了:
enu=WhileEnum()
while enu():
i=int(raw_input('x: '))
if i>10: break
print enu.count
我认为第二种方法更好。您可以拥有多个枚举器,并且还可以设置循环次数的限制:
limited_enum=WhileEnum(5)
while
经常很有用 - 这就是为什么他们把它包含在语言中的原因。 - Bitwisefor
做同样的事情,而不会让它变得更丑陋和难以理解。 - Bitwise