Вы можете просто использовать while
для этого:
i = 0 // maybe 1 would be better?
while i < someSize:
doSomething()
i *= 5
Просто знайте, что это бесконечное l oop (если, конечно, someSize
не равно нулю), если, как вы это сделали в вашем названии вы начинаете с нуля. Неважно сколько сколько раз вы умножаете ноль на пять, вы всегда будете в итоге равны нулю.
Кроме того, ничто не мешает вам создать свой собственный итератор, даже тот, который вызывает функцию для определения следующего значения и должен ли итератор остановиться.
Следующий код предоставляет такого зверя, в котором вы указываете начальное значение и пару функций для обновления и проверки значений (реализовано в виде лямбды в тестовом коде):
# Iterator which uses a start value, function for calculating next value,
# and function for determining whether to continue, similar to standard
# C/C++ for loop (not C++ range-for, Python already does that).
class FuncIter(object):
def __init__(self, startVal, continueProc, changeProc):
# Store all relevant stuff.
self.currVal = startVal
self.continueProc = continueProc
self.changeProc = changeProc
def __iter__(self):
return self
def __next__(self):
# If allowed to continue, return current and prepare next.
if self.continueProc(self.currVal):
retVal = self.currVal
self.currVal = self.changeProc(self.currVal)
return retVal
# We're done, stop iterator.
raise StopIteration()
print([item for item in FuncIter(1, lambda x: x <= 200, lambda x: x * 4 - 1)])
Выражение:
FuncIter(1, lambda x: x <= 200, lambda x: x * 4 - 1)
генерирует значения, которые вы получите с эквивалентным C / C ++ for
оператор:
for (i = 1; i <= 200; i = i * 4 - 1)
, как показано в результате:
[1, 3, 11, 43, 171]