Бесконечные циклы

    Как ивестно простейший способ получить диапазон чисел в Python это использовать range(). range возвращает список но когда нужно пройтись по большому диапазону лучше использовать xrange(), который вместо списка, возвращает итератор. Но как быть, когда конец диапазона не известен, а использовать while True кажется не эстетичным.
    Очень просто:
    from itertools import count
    for i in count(1): DoSomeWith(i)

    Разумеется как только мы получим результат, можем спокойно сделать break.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 19

      +3
      Ну если while True кажется не эстетичным, то попробуйте while 1<5. Мне кажется, что 1>=5 - отличное условие завершения цикла.
        +1
        Хммм... Кстати, практике эстетичного выхода из цикла можно посвятить целую статью. Как вам. например, такой вариант:

        while True:
            print i
            i += 1
            if i == 10:
                True, False = False, True


        Кто захочет добавить подобный код в проект, пожалуйста, расскажите о последствиях. Уверен, будет занимательно.
          0
          не помню, как там было, что-то вроде
          #define TRUE ( (rand()%2) - 1 )
          ;)
            +3
            это сродни сишному:
            #define i j /* have a nice debug */
              +1
              Посему предлагаю количеством букв „i“ обозначать глубину вложености цикла. i,ii,iii,...
                0
                я так и делаю, когда не получается дать осмысленное имя.
        –2
        спасибо. малочь, а занятно. поднял бы карму кабы мог (-:
          +2
          Я обычно пишу что-то вроде:

          while "в Питоне нету нормальных бесконечных циклов":
            ...
            +1
            а чем while True настолько неэстетичен, что надо грузить целую itertools???
              0
              from itertools import count
              не всю...
              а вообще хз.
                0
                Да про эстэтику я вообще сказал прикола ради, на самом деле itertools лучше только тем что не нужно ручками инкрементировать i и всё - красивее ведь.
                  0
                  интересно было бы еще по скорости оценить этот вариант - насколько itertools.count дает выигрыш/проигрыш в скорости...
                +1
                Ну то, что руками не надо инкремент переменной делать это очень хорошо. Экономия одной строки.
                Но насколько падает удобочитаемость кода? Пишите код для людей, а не для машин (с) Стив Макконнелл :-)
                  0
                  Нисколько не падает, очень даже красиво :) Посмотрите на haskell, но хоть и не для людей но для математиков, но при том выглядет очень выразительно.
                    0
                    Если учитывать три оговорки "но", то да, возможно удобочитаемость не падает.
                    Красиво и удобно это две разные вещи. Притом обе субъективны.

                    Но я предпочитаю знать, что переменная инкрементируется и видеть в каком участке кода это происходит.
                    Мне кажется я не одинок, потому что сколько исходников широко распространенных программ на Python я ни смотрел --- не видел таких хитростей ни разу.

                    Я за избавление кода от магии.
                      0
                      Вы конечно правы но давайте остановимся на том, что на вкус и цвет - фломастеры разные :)
                  +1
                  Я пишу
                  working = True
                  while working:
                  ....

                  и где-то в другом месте (например по сигналу TERM или INT операционной системы), ставлю working=False. Этим убиваю сразу двух зайцев: цикл длится бесконечно пока не наступит какое-то событие (например, пользователь нажмет Ctrl+C) и в тоже время гарантированно, что цикл не завершится на середине какого-то оператора, мы корректно из него выйдем, закроем все файлы, запишем данные в БД и т.п.
                    0
                    А вы уверены, что ваш цикл бесконечный?

                    ...
                    2147483642
                    2147483643
                    2147483644
                    2147483645
                    2147483646
                    Traceback (most recent call last):
                    File "<stdin>", line 1, in <module>
                    OverflowError: cannot count beyond PY_SSIZE_T_MAX

                    Проблема в том, что count не поддерживается longint, поэтому когда нужен очень большой цикл, такой метод использовать нельзя.
                      0
                      В формате комментария трудно все выразить. Опубликовал свои размышления на тему бесконечных циклов в Python.
                      Сорри, что не сюда - не хватило кармы.

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое