Python для циклов: быстрые ответы и примеры

Оглавление

Знакомство с Python for циклы

Большая часть пользы, которую мы получаем от использования компьютеров, связана с программированием их на выполнение одной и той же задачи несколько раз подряд, что требует повторения одного и того же блока кода снова и снова. Именно здесь циклы for each полезны в Python или любом другом языке объектно-ориентированного программирования (ООП). Мы будем использовать for loop и for each loop взаимозаменяемо, так как цикл Python for всегда связан с некоторой коллекцией элементов, на которую ссылается each, и полезно думать об элементах, с которыми предстоит работать. Официально в документации Python цикл for называется "оператором for".

В этом посте мы рассмотрим все основы использования циклов в Python, в частности циклов for, покажем, как они работают и различные типы циклов, которые можно использовать для различных повторяющихся задач.

Что такое цикл for?

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

Однако следует различать while loop, который является еще одной примитивной командой цикла в Python. Эта команда выполняет набор операторов до тех пор, пока условие истинно. Например, вы можете захотеть напечатать что-то, пока счетчик не достигнет определенного числа. Этот тип итерации является условным и бесконечным.

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

Основное использование циклов for в Python

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

Просмотр строки

Мы можем ссылаться на элементы объекта string, потому что он итерируемый: строка состоит из последовательности символов, и эта последовательность является конечным набором элементов, которые мы можем предоставить ключевому слову for.

Представьте, что нам нужно узнать, сколько раз буква встречается в слове, или сколько раз слово встречается в абзаце. Например, если нам нужно выяснить, сколько раз буква "i" встречается в слове "Миссисипи" -

>>> word = 'Mississippi'
>>> count = 0
>>> for letter in word:
>>>     if letter == 'i':
>>>         count = count + 1
>>> print(count)

4

Примечание: существуют более простые способы подсчета букв в слове с помощью встроенных инструментов, таких как 'Mississippi'.count('i')

Обратите внимание на основной формат:

for <item> in <iterable>: 
	<Work to be done to item>

Все остальные утверждения внутри цикла for сопровождаются дополнительным отступом, как в приведенном выше утверждении if. Также обратите внимание, что хотя итерируемая переменная должна ссылаться (или быть объявлением) на реальную итерируемую переменную, имя переменной элемента может быть любым, каким вы захотите, поскольку содержимое изменяется от одной итерации к другой.

Правильная практика заключается в том, чтобы назвать это как-то, что четко описывает тип элемента в итерабле. Если требуется краткость, допустимо также использовать одну букву, также желательно указывающую на тип объекта, над которым выполняется работа.

Внимание (!) Согласно PEP8, никогда не используйте строчную букву "L" в качестве имени переменной, так как этот символ часто неотличим от цифры 1.

Перемещение по спискам

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

Допустим, у вас есть список студентов и вам нужно вывести имя каждого студента из этого списка -

>>> student_list= ("jake", "john", "jim")
>>> for student in student_list:
>>>     print(student)

jake
john
jim

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

Как работают циклы?

Давайте немного разделим это на части и рассмотрим конкретные шаги, выполняемые в цикле for. Иногда циклы становятся очень сложными, и важно помнить основы того, что происходит в цикле.

Мы будем использовать быстрый пример для получения каждого символа в строке, где каждый аспект определен, и весь процесс описан:

>>> for character in "Kite":
>>>     print(character)

K
i
t
e

В цикле Python for и in являются ключевыми словами Python; Kite является строкой; и character является переменной цикла, которую мы назначили.

  1. Назначаем переменную цикла "character"
  2. Мы определяем итерабельную переменную, которая будет "Kite"
  3. Цикл извлекает первый символ, а затем печатает его
  4. После этого цикл начинается заново, (т.е. берется следующий элемент)
  5. Он напечатает следующий элемент, а затем начнет сначала
  6. Цикл выполняется в общей сложности 4 раза, пока не останется больше элементов

Такая схема обработки известна как трансверсальная. В Python цикл используется для итерации по последовательности, будь то словари, списки, кортежи или множества - это итерируемые объекты.

Итерирование трудным способом

В приведенном ниже примере мы создадим кортеж, содержащий различные марки воды, а затем с помощью функции iter() создадим объект, который можно итерировать, также называемый итератором. Затем мы будем использовать функцию next() для вызова элементов по одному.

>>> example_tuple = ("smartwater", "fiji", "aquafina")
>>> my_tuple = iter(example_tuple)  

>>> print(next(my_tuple))
>>> print(next(my_tuple))
>>> print(next(my_tuple))

smartwater
fiji
aquafina

Как мы можем сократить это? Вы угадали - циклом! Мы можем использовать for loop для итерации по итерируемому объекту - кортежу (example_tuple). for loop создает объект-итератор и выполняет метод next() для каждого цикла.

>>> example_tuple = ("smartwater", "fiji", "aquafina")

>>> for x in example_tuple:
>>> 	print(x)

Как видите, for loop создал объект-итератор и по существу выполнил метод next() до тех пор, пока не был достигнут конец списка, набрав при этом гораздо меньше кода!

Другие for ключевые слова и возможности цикла

Большая часть возможностей циклов заключается в специальных ключевых словах, которые позволяют лучше контролировать основные итеративные шаги.

В цикле можно сделать множество вещей: остановить его после определенного момента, пропустить определенную последовательность, поставить условия, и даже поместить цикл в цикл. (Такая практика называется "вложенной" для циклов и используется, когда сам итерируемый объект является вложенным - например, список, содержащий больше списков).

Сначала мы рассмотрим два различных типа утверждений: break и continue. Затем мы рассмотрим функцию range(), условный цикл else и вложенные циклы.

Заявление break

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

Например:

>>> students = ["John", "Jerry", "Sarah"]


>>> for x in students:
>>>   print(x) 
>>>   if x == "Jerry":
>>>     break

John
Jerry

Если мы хотим, чтобы он прервался после Джона, то мы поставим условие и прервемся перед печатью.

>>> students = ["John", "Jerry", "Sarah"]
>>> for x in students:
>>>   if x == "Jerry":
>>>     break
>>>   print(x) 

John

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

Заявление continue

Оператор continue используется для пропуска итерации. Допустим, нам нужно напечатать список сверху, но Джерри сегодня отсутствует. Или, другими словами, чтобы остановить текущую итерацию и continue обычно сверху.

>>> students = ["John", "Jerry", "Sarah"]
>>> for x in students:
>>>   if x == "Jerry":
>>>     continue
>>>   print(x) 

John
Sarah

Функция range()

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

Вы можете указать количество раз, которое вы хотите зациклить набор кода, используя функцию range(). По умолчанию эта функция будет начинаться с 0 и увеличиваться на 1 до указанного числа.

>>> for x in range(5):
>>>   print(x)

0
1
2
3
4

Имейте в виду, что они будут выдавать значения от 0 до 4, а не от 0 до 5. По сути, счет не включает 5 и остановится перед ним.

Вы также можете указать значение инкремента в качестве третьего параметра с range(0, 10, 2). Опять же, вы увидите, что значения останавливаются перед 8, а не в конце диапазона 10.

>>> for x in range(0, 10, 2):
>>>   print(x)

0
2
4
6
8

Это может помочь вам итерировать список до определенного количества или чередовать варианты. Мы не будем рассматривать здесь все возможности функции range(), но я рекомендую ознакомиться с ней!

Выполните работу после цикла с помощью else

Ключевое слово else else в цикле for определяет блок кода, который будет выполняться после завершения цикла. Его можно использовать по-разному, например, для запроса дополнительных данных, если в цикле закончились данные или если вы достигли конца списка.

>>> for x in range(5):
>>>   print(x)
>>> else:
>>>   print("Finally finished!")

0
1
2
3
4
Finally finished!

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

Вы можете помещать циклы в циклы, как в фильме Inception. Вложенные циклы помогают нам справиться с итерациями, живущими внутри других итераций. Это одна из двух основных причин для размещения цикла for внутри другого цикла for.

Вы можете иметь списки внутри списков, где если бы вы использовали один цикл, то он вывел бы отдельные списки. Давайте посмотрим и покажем, что произошло бы без вложенного цикла:

>>> list_of_lists = [['yorkshire', 'jack russell', 'golden retriever'],[0, 1, 2],[11, 22, 33]]

>>> for list_item in list_of_lists:
>>>     print(list_item)

['yorkshire', 'jack russell’, 'golden retriever’]
[0, 1, 2]
[11, 22, 33]

Вложение цикла означает, что мы выполним другой цикл как часть текущей итерации:

>>> list_of_lists = [['yorkshire', 'jack russell', 'golden retriever'],[0, 1, 2],[11, 22, 33]]

>>> for list_item in list_of_lists:
>>>     for item in list_item:
>>>         print(item)

yorkshire
jack russell
golden retriever
0
1
2
11
22
33

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

Вторым основным случаем использования вложенных циклов является объединение нескольких списков, создавая все возможные перестановки. Обратите внимание, что для получения такого поведения вам придется вложить список еще на один уровень для каждой итерабельной переменной.

Вы можете даже объединить два списка для создания всех перестановок:

>>> adj = ["red", "sporty", "electric"]
>>> cars = ["BMW", "Lexus", "Tesla"]

>>> for x in adj:
>>>   for y in cars:
>>>     print(x, y)

red BMW
red Lexus
red Tesla
sporty BMW
sporty Lexus
sporty Tesla
electric BMW
electric Lexus
electric Tesla

Общие ошибки цикла

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

Затем, когда вы начнете использовать вложенные циклы, хорошей идеей будет сохранить код читабельным и избегать сильной вложенности. Не стоит нагромождать слишком много переменных-итераторов, потому что их трудно читать и они чреваты ошибками.

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

Первой проблемой будет бесконечный цикл, в котором условие всегда выполняется или никогда не выполняется.

>>> count = 0
>>> i = 1
>>> while i == 1:
>>>	count+=1

Здесь вы должны убедиться, что ваше условие будет ложным в какой-то точке или в конце концов будет конечная точка.

Неправильный вызов range()

Когда вы хотите вывести числа в диапазоне, он выводит первые 5 чисел или другими словами: 0, 1, 2, 3 и 4.

>>> for i in range(5):
>>> 	print(i)
0
1
2
3
4

Заметили, что "5" не было включено?

Это означает, что если вы хотите вывести число 5, вам придется пройти мимо этого числа и вывести все, что находится в диапазоне 6.

>>> for i in range(6):
>>> 	print(i)
0
1
2
3
4
5

Если вы хотите вывести только числа, есть два различных способа сделать это:

Первый способ - начиная с первого числа и конечного числа плюс 1:

>>> for i in range(1, 6):
>>> 	print(i)
1
2
3
4
5

Второй способ - настроить печать от печати только i до печати i + 1 (от 1 до 5).

>>> for i in range(5):
>>> 	print(i+1)
1
2
3
4
5

Расширенные случаи использования цикла

Блоги

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

eCommerce

На сайте электронной коммерции цикл можно использовать для изменения цены, отображаемой посетителям, на определенную сумму или процент без изменения исходной цены в базе данных. Это может быть полезно, если в базе данных хранится стоимость товара, но программное обеспечение для электронной коммерции должно добавить наценку на все товары в размере 20% для маржи прибыли, которая затем отображается потенциальному покупателю в качестве конечной цены.

Ленты новостей

Большинство людей пользовались Facebook и знают о ленте новостей: месте, где вы видите сообщения от ваших друзей, страниц и групп, за которыми вы следите. Ленту можно использовать для показа сообщений от друзей, с которыми вы связаны, или отфильтровать, чтобы показать сообщения в определенном временном диапазоне.

Можно даже использовать вложенный цикл (который мы рассмотрим ниже) для более раннего показа определенных сообщений в зависимости от того, скольким общим друзьям понравилось это сообщение. Обратите внимание, что в каждом из этих случаев у нас все еще был какой-то объект, живущий в коллекции, над которым нам нужно было выполнить работу. Даже в сложных случаях основы остаются неизменными.

Следующие шаги

В дополнение к приведенным выше идеям, возьмите за привычку искать в коде способы итерации по коллекциям. Например, мы не рассмотрели, как именно выполнять итерации в словарях. Поскольку словари имеют различные методы для возврата итераций, существует довольно много способов итерации по словарям, но не верьте мне на слово!

После этого я бы предложил посмотреть, как можно написать циклы for, чтобы они еще больше походили на человеческий язык. Самое большое преимущество Python в том, что он настолько читабелен, что вам легче "думать" на Python, чем на других языках, и просто записывать свои идеи в виде кода.

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

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

Вернуться на верх