Поиск…


Вступление

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

Синтаксис

  • while <boolean expression>:
  • для <variable> в <iterable>:
  • для <variable> в диапазоне (<число>):
  • для <variable> в диапазоне (<start_number>, <end_number>):
  • для <variable> в диапазоне (<start_number>, <end_number>, <step_size>):
  • для i, <variable> в перечислении (<iterable>): # с индексом i
  • для <variable1>, <variable2> в zip (<iterable1>, <iterable2>):

параметры

параметр подробности
логическое выражение выражение, которое может быть оценено в булевом контексте, например x < 10
переменная имя переменной для текущего элемента из iterable
итерируемый все, что реализует итерации

Итерирование по спискам

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

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

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

one
two
three
four

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

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

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

1
2
3
4
5

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

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: на map Python 3.x вместо итератора вместо списка появляется итератор, поэтому если вам нужен список, вы должны указать результат print(list(x)) (см. Http://www.riptutorial.com/python/ пример / 8186 / map-- в http://www.riptutorial.com/python/topic/809/incompatabilities-moving-from-python-2-to-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 - это функция, которая возвращает серию чисел под итерируемой формой, поэтому ее можно использовать for циклов for :

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

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

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

for loop может выполнять итерацию по любому итерируемому объекту, который является объектом, который определяет функцию __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 цикл 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 цикл for с предложением else . Концептуально существует условие цикла, которое остается True, пока итерируемый объект или последовательность все еще имеют некоторые оставшиеся элементы.

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

Основным вариантом использования for for...else construct является краткая реализация поиска, например:

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

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

Некоторые обсуждения по этому вопросу можно найти в [Python-ideas] Summary of for ... else threads. Почему python использует «else» после циклов for и while? , и Else Clauses on Loop Statement

Итерация над словарями

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

 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 возвращается, все элементы упаковываются в список и затем возвращаются для дальнейшей оценки.

Обратите также внимание на то, что в Python 3 порядок элементов, напечатанных указанным выше способом, не соответствует никакому порядку.

Пока цикл

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

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

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

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

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 присваивает s для каждого элемента 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

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

«Half loop» do-while

В отличие от других языков, Python не имеет конструкцию do-until или 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

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



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow