Python Language
Loops
Поиск…
Вступление
Как одна из самых основных функций в программировании, петли - важная часть почти для каждого языка программирования. Петли позволяют разработчикам устанавливать определенные части своего кода для повторения через несколько циклов, которые называются итерациями. В этом разделе описывается использование нескольких типов циклов и приложений циклов в 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
Это также будет работать для большинства типов итераций, а не только для кортежей.