Как я могу реализовать "для (Int I = 0; я - PullRequest
0 голосов
/ 23 марта 2020

Могу ли я использовать range () здесь или есть другой способ?

1 Ответ

2 голосов
/ 23 марта 2020

Вы можете просто использовать 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...