Циклы

Введение

Примеры

  • Перебор списков

    Для того, чтобы перебирать список можно использовать for :

     for x in ['one', 'two', 'three', 'four']:
        print(x)
    
     

    Это распечатает элементы списка:

     one
    two
    three
    four
    
     

    range функция генерирует числа , которые также часто используются в цикле.

     for x in range(1, 6):
        print(x)
    
     

    Результат будет специальный диапазон типа последовательности в Python> = 3 и список в Python <= 2. И то, и другое можно пройти через цикл for.

     1
    2
    3
    4
    5
    
     

    Если вы хотите , чтобы петля , хотя обоих элементов списка и имеют индекс для элементов , а также, вы можете использовать Python, enumerate функции:

     for index, item in enumerate(['one', 'two', 'three', 'four']):
        print(index, '::', item)
    
     

    enumerate будет генерировать кортежи, которые распакованы в index (целое число) и item (фактическое значение из списка). Вышеуказанный цикл напечатает

     (0, '::', 'one')
    (1, '::', 'two')
    (2, '::', 'three')
    (3, '::', 'four')
    
     

    Перебирать список с манипуляцией значений с использованием map и lambda , то есть применить функцию лямбда каждого элемента в списке:

     x = map(lambda e :  e.upper(), ['one', 'two', 'three', 'four'])
    print(x)
    
     

    Выход:

     ['ONE', 'TWO', 'THREE', 'FOUR'] # Python 2.x
    
     

    NB: в Python 3.x map возвращает итератор вместо списка , чтобы вы в случае , если вам нужен список , вы должны бросить результат print(list(x)) (см https://codecamp.ru/documentation/python/ 809 / несовместимости между ними-питоном-2-и-питоном-3/8186 / карта ) в https://codecamp.ru/documentation/python/809/incompatibilities-between-python-2-and-python-3 ).

  • Для петель

    for петель итерации по коллекции элементов, такие как list или dict , и запустить блок кода с каждым элементом из коллекции.

     for i in [0, 1, 2, 3, 4]:
        print(i)
    
     

    Выше for итерации цикла над списком номеров.

    Каждая итерация устанавливает значение i к следующему элементу списка. Итак , сначала будет 0 , то 1 , то 2 , и т.д. Вывод будет следующим образом :

     0  
    1
    2
    3
    4
    
     

    range это функция , которая возвращает ряд чисел под Iterable формы, таким образом , он может быть использован в for циклов:

     for i in range(5):
        print(i)
    
     

    дает тот же результат, что первый for цикл. Обратите внимание , что 5 не печатается , как диапазон здесь первые пять чисел , считая от 0 .

    Итерируемые объекты и итераторы

    for цикла может итерацию по любому Iterable объекта , который является объектом , который определяет __getitem__ или __iter__ функцию. __iter__ функция возвращает итератор, который является объектом с next функцией, которая используется для доступа к следующему элементу итерации.

  • Перерыв и продолжить в циклах

    break заявление

    Когда break оператор выполняет внутри цикла, управление потоком «разрывов» из цикла немедленно:

     i = 0
    while i < 7:
        print(i)
        if i == 4:
            print("Breaking from loop")
            break
        i += 1
    
     

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

    Выполнение следующему печатает каждую цифру до числа 4 , когда break заявление не будет выполнено и цикл останавливается:

     0
    1
    2
    3
    4
    Breaking from loop
    
     

    break заявления также могут быть использованы внутри for петель, других для создания циклов , представленного Python:

     for i in (0, 1, 2, 3, 4):
        print(i)
        if i == 2:
            break
    
     

    Выполнение этого цикла теперь печатает:

     0
    1
    2
    
     

    Обратите внимание, что 3 и 4 не печатаются, так как цикл закончился.

    Если цикл имеет в else положение , оно не выполняется , когда цикл завершается через break заявления.

    continue заявление

    continue заявление будет перейти к следующей итерации цикла , обходя остальную часть текущего блока , но продолжает цикл. Как с break , по- continue могут появляться только внутри петли:

     for i in (0, 1, 2, 3, 4, 5):
        if i == 2 or i == 4:
            continue
        print(i)
    
    0
    1
    3
    5
    
     

    Обратите внимание , что 2 и 4 не печатаются, это происходит потому , что по- continue идет к следующей итерации вместо продолжения на print(i) , когда i == 2 или i == 4 .

    Вложенные циклы

    break и continue работать только на одном уровне цикла. Следующий пример сломается только из внутренних for цикла, а не внешние , while петель:

     while True:
        for i in range(1,5):
            if i == 2:
                break    # Will only break out of the inner loop!
    
     

    Python не имеет возможности вырваться из нескольких уровней петли сразу - если такое поведение желательно, рефакторинга один или несколько петель в функцию и заменить break с return может быть путь.

    Используйте return из функции в качестве break

    return оператор выходит из функции без выполнения кода , который приходит после него.

    Если у вас есть цикл внутри функции, используя return внутри этого цикла эквивалентно имеющие break в качестве остальной части кода цикла не выполняется (обратите внимание , что любой код после цикла не выполняется ни):

     def break_loop():
        for i in range(1, 5):
            if (i == 2):
                return(i)
            print(i)
        return(5)
    
     

    Если у вас есть вложенные циклы, то return оператор будет разорвать все петлю:

     def break_all():
        for j in range(1, 5):
            for i in range(1,4):
                if i*j == 6:
                    return(i)
                print(i*j)
     

    будет выводить:

     1 # 1*1
    2 # 1*2
    3 # 1*3
    4 # 1*4
    2 # 2*1
    4 # 2*2
    # return because 2*3 = 6, the remaining iterations of both loops are not executed
    
     
  • Циклы с предложением "else"

    for и в while операторы составных (петля) могут дополнительно иметь else пункт (на практике, это использование довольно редко).

    else положение выполняется только после того, как for цикла завершается итерация к завершению, или после того, в while цикл завершается его условным выражением становится ложным.

     for i in range(3):
        print(i)
    else:
        print('done')
    
    i = 0
    while i < 3:
        print(i)
        i += 1
    else:
        print('done')
    
     

    выход:

      0
     1
     2
     done
    
     

    else пункт не выполняется , если цикл завершается другим способом (через break заявление или повышение исключения):

     for i in range(2):
        print(i)
        if i == 1:
            break
    else:
        print('done')
    
     

    выход:

     0
    1
    
     

    Большинство других языков программирования не хватает этого необязательного else положение петель. Использование ключевого слова else , в частности , часто считается запутанным.

    Первоначальная концепция такого положения восходит к Дональду Кнуту и смысл else ключевого слова становится понятным , если переписать цикл в терминах , if заявления и goto заявление от предыдущих дней до структурного программирования или из ассемблера нижнего уровня.

    Например:

     while loop_condition():
        ...
        if break_condition():
            break
        ...
    
     

    эквивалентно:

     # pseudocode
    
    <<start>>:
    if loop_condition():
        ...
        if break_condition():
            goto <<end>>
        ...
        goto <<start>>
    
    <<end>>:
    
     

    Они остаются эквивалентными , если приложить else пункт к каждому из них.

    Например:

     while loop_condition():
        ...
        if break_condition():
            break
        ...
    else:
        print('done')
    
     

    эквивалентно:

     # pseudocode
    
    <<start>>:
    if loop_condition():
        ...
        if break_condition():
            goto <<end>>
        ...
        goto <<start>>
    else:
        print('done')
    
    <<end>>:
    
     

    for цикла с else п может быть понято таким же образом. Концептуально, существует условие цикла, которое остается True до тех пор, пока итерируемый объект или последовательность все еще имеет некоторые оставшиеся элементы.

    Зачем использовать эту странную конструкцию?

    Основной вариант использования для for...else конструкта является кратким осуществление поиска как, например:

     a = [1, 2, 3, 4]
    for i in a:
        if type(i) is not int:
            print(i)
            break
    else:
        print("no exception") 
    
     

    Для того, чтобы сделать else в этой конструкции менее запутанным можно думать о нем , как «если не ломаются» или «если не найден».

    Некоторые дискуссии по этому вопросу можно найти в [Python-идей] Резюме для ... Else потоков , Почему использование питона «еще» после того, как на и в то время как петли? И Else Морозы по выпискам Loop

  • Перебор словарей

    Учитывая следующий словарь:

      d = {"a": 1, "b": 2, "c": 3}
    
    
     

    Чтобы перебрать его ключи, вы можете использовать:

     for key in d:
        print(key)
    
     

    Выход:

     "a"
    "b"
    "c"
    
     

    Это эквивалентно:

     for key in d.keys():
        print(key)
    
     

    или в Python 2:

     for key in d.iterkeys():
        print(key)
    
    
     

    Чтобы просмотреть его значения, используйте:

     for value in d.values():
        print(value)
    
     

    Выход:

     1
    2
    3
    
    
     

    Чтобы перебрать его ключи и значения, используйте:

     for key, value in d.items():
        print(key, "::", value)
    
     

    Выход:

     a :: 1
    b :: 2
    c :: 3
    
    
     

    Обратите внимание , что в Python 2, .keys() , .values() и .items() возвращает list объектов. Если вам просто нужно перебирать корыта результата, вы можете использовать эквивалентные .iterkeys() , .itervalues() и .iteritems() .

    Разница между .keys() и .iterkeys() , .values() и .itervalues() , .items() и .iteritems() является то , что iter* методы являются генераторами. Таким образом, элементы в словаре выдаются один за другим по мере их оценки. Когда list будет возвращен объект, все элементы упакованы в список , а затем вернулся для дальнейшей оценки.

  • Пока петля

    В while цикл будет вызывать операторы цикла будет выполняться , пока условие цикла не falsey . Следующий код выполнит операторы цикла в общей сложности 4 раза.

     i = 0 
    while i < 4:
        #loop statements
        i = i + 1
    
     

    В то время как выше петли легко могут быть переведены в более элегантный for цикла, в while петли полезны для проверки , если какое - либо условие было выполнено. Следующий цикл будет продолжать выполняться , пока myObject не будет готов.

     myObject = anObject()
    while myObject.isNotReady():
        myObject.tryToGetReady()
    
     

    в True while петли могут также работать без условия с использованием чисел (комплексных или вещественных) или True :

     import cmath
    
    complex_num = cmath.sqrt(-1)
    while complex_num:      # You can also replace complex_num with any number, True or a value of any type
        print(complex_num)   # Prints 1j forever
    
     

    Если условие всегда истинно, цикл while будет выполняться вечно (бесконечный цикл), если он не завершается оператором break или return или исключением.

     while True:
        print "Infinite loop"
    # Infinite loop
    # Infinite loop
    # Infinite loop
    # ...
    
    
     
  • Пропуск Заявление

    pass является пустым оператором для того, когда оператор требует синтаксис Python (например, в пределах тела for или в while цикла), но никакие действий не требуются или желательны программист. Это может быть полезно в качестве заполнителя для кода, который еще не написан.

     for x in range(10):
        pass #we don't want to do anything, or are not ready to do anything here, so we'll pass
    
     

    В этом примере ничего не произойдет. for цикла будет завершено без ошибок, но ни одна из команд или кода не будут действовавшие. pass позволяет нам запускать наш код успешно , не имея все команды и действия в полном объеме.

    Аналогичный образом , pass может быть использована в while петли, а также в выборе и определении функций и т.д.

     while x == y:
        pass 
  • Перебор другой части списка с разным размером шага

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

    Вот простой список, который будет использоваться в примерах:

     lst = ['alpha', 'bravo', 'charlie', 'delta', 'echo']
    
    
     

    Итерация по всему списку

    Для перебора каждого элемента в списке, for петли , как показано ниже могут быть использованы:

     for s in lst:
        print s[:1] # print the first letter
    
     

    for цикла назначает с для каждого элемента lst . Это напечатает:

     a
    b
    c
    d
    e
    
     

    Часто вам нужен как элемент, так и индекс этого элемента. enumerate ключевых слов выполняет эту задачу.

     for idx, s in enumerate(lst):
        print("%s has an index of %d" % (s, idx))
    
     

    Индекс idx будет начинаться с нуля и приращения для каждой итерации, в то время как s будет содержать элемент обрабатывается. Предыдущий фрагмент будет выводить:

     alpha has an index of 0
    bravo has an index of 1
    charlie has an index of 2
    delta has an index of 3
    echo has an index of 4
    
    
     

    Итерация по подсписку

    Если мы хотим , чтобы перебрать диапазон (напомним , что Python использует индексацию с нуля), используйте range ключевых слов.

     for i in range(2,4):
        print("lst at %d contains %s" % (i, lst[i]))
    
     

    Это вывело бы:

     lst at 2 contains charlie
    lst at 3 contains delta
    
     

    Список также может быть нарезан. Следующие обозначения среза идет от элемента с индексом 1 до конца с шагом 2. два for петель дают тот же результат.

     for s in lst[1::2]:
        print(s)
    
    for i in range(1, len(lst), 2):
        print(lst[i])
    
     

    Вышеуказанные выводы фрагмента:

     bravo
    delta
    
     

    Индексирование и разрезание является темой самостоятельно.

  • "Полупериод" делать пока

    В отличие от других языков, Python не имеет конструкции do-while или do-while (это позволит выполнить код один раз перед проверкой условия). Тем не менее, вы можете объединить while True с break для достижения той же цели.

     a = 10
    while True:
        a = a-1
        print(a)
        if a<7:
            break
    print('Done.')
    
     

    Это напечатает:

     9
    8
    7
    6
    Done. 
  • Зацикливание и распаковка

    Если вы хотите перебрать список кортежей, например:

     collection = [('a', 'b', 'c'), ('x', 'y', 'z'), ('1', '2', '3')]
    
     

    вместо того, чтобы делать что-то вроде этого:

     for item in collection:
        i1 = item[0]
        i2 = item[1]
        i3 = item[2]
        # logic
    
     

    или что-то вроде этого:

     for item in collection:
        i1, i2, i3 = item
        # logic
    
     

    Вы можете просто сделать это:

     for i1, i2, i3 in collection:
        # logic
    
     

    Это также будет работать для большинства типов итерируемых, а не только кортежи.

Синтаксис

Параметры

Примечания