Цикл с условиями в питоне - PullRequest
10 голосов
/ 01 декабря 2010

Рассмотрим следующий код на C:

for(int i=0; i<10 && some_condition; ++i){
    do_something();
}

Я хотел бы написать нечто похожее на Python.Лучшая версия, которую я могу придумать:

i = 0
while some_condition and i<10:
    do_something()
    i+=1

Честно говоря, мне не нравятся циклы while, которые имитируют циклы for.Это связано с риском забыть увеличить значение счетчика.Другой вариант, который учитывает этот риск:

for i in range(10):
    if not some_condition: break
    do_something()

Важные разъяснения

  1. some_condition не предназначен для расчета во время цикла, а точнее, чтобы указать, нужно ли вначале запускать цикл

  2. Я имею в виду Python2.6

Какой стиль предпочтительнее?Есть ли лучший способ сделать это?

Ответы [ 3 ]

9 голосов
/ 01 декабря 2010

Это может быть не связано, но есть то, что я привык делать ... Если some_condition достаточно просто, поместите его в функцию и filter элементов, которые вы повторяете:

def some_condition(element):
    return True#False

for i in filter(some_condition, xrange(10)):
    pass

Вы можете использовать этот подход также, когда вы перебираете некоторый список элементов.

selected = filter(some_condition, to_process)
for i, item in enumerate(selected):
    pass

Опять же, это может быть не так, вы должны выбрать метод фильтрации элементов в зависимости от вашей проблемы.

7 голосов
/ 01 декабря 2010

В общем, стиль "range + break" предпочтителен - но в Python 2.x используйте xrange вместо range для итерации (это создает значения по требованию вместо фактического созданиясписок номеров).

Но это всегда зависит.Что особенного в числе 10 в этом контексте?Что именно some_condition?И т. Д.

Ответ на обновление:

Звучит так, как будто some_condition является "инвариантом цикла", т.е. не изменится во время цикла.В этом случае, мы просто должны сначала проверить это:

if some_condition:
  for i in xrange(10):
    do_something()
3 голосов
/ 01 декабря 2010

for циклы с постоянной верхней границей немного редки в Python. Если вы перебираете somearray, вы можете сделать:

for i in xrange(len(somearray)):
    if not some_condition:
        break
    do_sth_with(i, somearray[i])

или, что лучше:

for i, item in enumerate(somearray):
    if not some_condition:
        break
    do_sth_with(i, item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...