Циклы в Python
Каждый язык программирования, с которым я сталкивался, содержит какую-нибудь конструкцию цикла. В большей части языков есть больше одной такой конструкции. В мире Python есть два типа циклов:
- Цикл for
- Цикл while
Я заметил, что цикл for популярнее второго. Циклы используются в тех случаях, когда нам нужно сделать что-нибудь много раз. Нередко вам придется выполнить какую-нибудь операцию (или ряд операций) в части данных снова и снова. Тут то и вступают в силу циклы. Благодаря им становится возможно максимально упростить данный вопрос. Давайте подробно разберём, как работают эти структуры!
Как было сказано ранее, мы используем цикл в тех случаях, когда вам нужно повторить что-нибудь n-ное количество раз. Это проще понять, если взглянуть на пример. Мы используем встроенную функцию Python range. Функция range создаст список длинной в «n» элементов.
print(range(5)) # ответ: range(0, 5)
print(range(5)) # ответ: range(0, 5) |
Как вы видите, функция range взяла целое число и вернула объект range. Функция range также принимает начальное значение, конечное значение и значение шага. Вот еще два примера:
Pythona = range(5, 10) print(a) # range(5, 10) b = list(range(1, 10, 2)) print(b) # [1, 3, 5, 7, 9]
a = range(5, 10) print(a) # range(5, 10)
b = list(range(1, 10, 2)) print(b) # [1, 3, 5, 7, 9] |
В пером примере показано, что вы можете передать начальное и конечное значение, и функция range вернет числа, начиная с начального значения вплоть до (но не включая) последнее значение. Например, при запросе 5-10 мы получим 5-9. Во втором примере видно, как использовать функцию списка (list) для того, чтобы функция range вернула каждый второй элемент, между 1 и 10. Так что она начинает с 1, пропускает 2 и так далее. Теперь вы, наверное, гадаете, что же именно она будет делать с циклами? Что-ж, есть один простой способ показать, как работает цикл с использованием функции range! Давайте взглянем:
Pythonfor number in range(5): print(number)
for number in range(5): print(number) |
Что здесь произошло? Давайте почитаем слева на право, чтобы понять это. Для каждого числа в диапазоне 5 мы вводим число. Мы знаем, что если мы вызываем range со значением 5, мы получим список из 5 элементов. Так что каждый раз, проходя через цикл, она выводит каждый из элементов. Цикл for, показанный выше, может быть эквивалентом следующего:
Pythonfor number in [0, 1, 2, 3, 4]: print(number)
for number in [0, 1, 2, 3, 4]: print(number) |
Функция range лишь делает результат несколько меньшим. Цикл for может обходить любой итератор Python. Мы уже видели, как именно он может работать со списком. Давайте взглянем, может ли он выполнять итерацию со словарем.
Pythona_dict = {«one»:1, «two»:2, «three»:3} for key in a_dict: print(key)
a_dict = {«one»:1, «two»:2, «three»:3}
for key in a_dict: print(key) |
Когда вы используете for в словаре, вы увидите, что он автоматически перебирает ключи. Вам не нужно указывать ключ for в a_dict.keys() (впрочем, это также работает). Python делает только нужные нам вещи. Вы возможно думаете, почему ключи выводятся в другом порядке, отличном от того, какой был указан в словаре? Как мы знаем из соответствующей статьи, словари не упорядочены, так что мы можем выполнять итерацию над ними, при этом ключи могут быть в любом порядке. Теперь, зная, что ключи могут быть отсортированы, вы можете отсортировать их до итерации.
a_dict = {1:»one», 2:»two», 3:»three»} keys = a_dict.keys() keys = sorted(keys) for key in keys: print(key)
1 2 3 4 5 6 | a_dict = {1:»one», 2:»two», 3:»three»} keys = a_dict.keys()
keys = sorted(keys) for key in keys: print(key) |
Результат:
Python1 2 3
Давайте остановимся и разберемся с тем, что делает этот код. Во-первых, мы создали словарь, в котором ключи выступают в качестве целых чисел, вместо строк. Далее, мы извлекли ключи из словаря. Каждый раз, когда вы взываете метод keys(), он возвращает неупорядоченный список ключей. Если вы выведите их, и увидите, что они расположен в порядке по возрастанию, то это просто случайность. Теперь у нас есть доступ к ключам словаря, которые хранятся в переменной, под названием keys. Мы сортируем наш список, после чего используем цикл for в нем. Теперь мы готовы к тому, чтобы сделать все немного интереснее. Мы попробуем применить цикл в функции range, но нам нужно вывести только целые числа. Чтобы сделать это, нам нужно использовать условный оператор вместо параметра шага range. Это можно сделать следующим образом:
Pythonfor number in range(10): if number % 2 == 0: print(number)
for number in range(10): if number % 2 == 0: print(number) |
Результат:
Python0 2 4 6 8
Вы наверное гадаете, что вообще здесь происходит? Что еще за знак процента? В Python, % называется
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Python Форум Помощи
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Подписаться
Цикл while также используется для повторения частей кода, но вместо зацикливания на n количество раз, он выполняет работу до тех пор, пока не достигнет определенного условия. Давайте взглянем на простой пример:
Pythoni = 0 while i < 10: print(i) i = i + 1
i = 0 while i < 10: print(i) i = i + 1 |
Цикл while является своего рода условным оператором. Вот что значит этот код: пока переменная i меньше единицы, её нужно выводить на экран. Далее, в конце, мы увеличиваем её значение на единицу. Если вы запустите этот код, он выдаст от 0 до 9, каждая цифра будет в отдельной строке, после чего задача будет выполнена. Если вы удалите ту часть, в которой мы увеличиваем значение i, то мы получим
while i < 10: print(i) if i == 5: break i += 1
1 2 3 4 5 6 7 | while i < 10: print(i)
if i == 5: break
i += 1 |
В этой части кода мы добавили условное выражение для проверки того, равняется ли когда-либо переменная i цифре 5.
Если нет, тогда мы разрываем цикл. Как вы видите в выдаче кода, как только значение достигает пяти, код останавливается, даже если мы ранее указали while продолжать цикл, пока переменная не достигнет значения 10. Обратите внимание на то, что мы изменили то, как мы увеличиваем значение при помощи +=. Это удобный ярлык, который вы можете также использовать в других операциях, таких как вычитание -= и умножение *=. Встроенный break также известен как инструмент управления потока. Существует еще один, под названием continue, который в основном используется для пропуска итерации, или перейти к следующей итерации. Вот один из способов его применения:Pythoni = 0 while i < 10: if i == 3: i += 1 continue print(i) if i == 5: break i += 1
1 2 3 4 5 6 7 8 9 10 11 12 | i = 0
while i < 10: if i == 3: i += 1 continue
print(i) if i == 5: break
i += 1 |
Слегка запутанно, не так ли? Мы добавили второе условное выражение, которое проверяет, не равняется ли i трем. Если да, мы увеличиваем переменную и переходим к следующему циклу, который удачно пропускает вывод значения 3 на экран. Как и ранее, когда мы достигаем значения 5, мы разрываем цикл. Существует еще одна тема, касающаяся циклов, которую нам нужно затронуть – это оператор else.
Зачем нужен else при работе с циклами?
Оператор else в циклах выполняется только в том случае, если цикл выполнен успешно. Главная задача оператора else, это поиск объектов:
Pythonmy_list = [1, 2, 3, 4, 5] for i in my_list: if i == 3: print(«Item found!») break print(i) else: print(«Item not found!»)
1 2 3 4 5 6 7 8 9 | my_list = [1, 2, 3, 4, 5]
for i in my_list: if i == 3: print(«Item found!») break print(i) else: print(«Item not found!») |
В этом коде мы разорвали цикл, когда i равно 3. Это приводит к пропуску оператора else. Если вы хотите провести эксперимент, вы можете изменить условное выражение, чтобы посмотреть на значение, которое находится вне списка, и которое приведет оператор else к выполнению. Честно, ни разу не видел, чтобы кто-либо использовал данную структуру за все годы работы. Большая часть примеров, которые я видел, приведена блогерами, которые пытаются объяснить, как это работает. Я видел несколько людей, которые использовали эту структуру для провоцирования ошибки, когда объект не удается найти в искомом цикле. Вы можете почитать статью, в которой вопрос рассматривается весьма детально. Статья написана одним из разработчиков ядра Python.
Подведем итоги
Надеюсь, с этого момента вы осознали всю значимость циклов в Python. Они делают повторение очень простым, и весьма понятным. Вы будете сталкиваться с циклом for намного чаще, чем с циклом while. Если вы все еще не совсем понимаете, как это работает, настоятельно рекомендую перечитать эту статью, перед тем как продолжить.
Vasile Buldumac
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: [email protected]
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»
Практическое применение for/in/else циклов в Python.
Содержание:- Перебор ключей и значений словаря, используя
for/in
в Python; - Варианты перебора списков, используя
for/in
в Python;- Перебор значений нескольких списков одновременно;
- Перебор значений списка в обратном порядке;
- Перебор значений списка в отсортированном порядке;
- Изменение списка во время выполнения цикла;
- Использование оператора
else
в циклахfor/in
.
Перебор ключей и значений словаря, используя
for/in
в Python.При итерации по элементам словаря for/in
, ключ и соответствующее значение могут быть получены одновременно с использованием метода словаря dict.items()
:
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'} >>> for k, v in knights.items(): ... print(k, v) ... # gallahad the pure # robin the brave
Смотрите материал «Сортировка словаря по значению и ключу в Python», чтобы перебрать его в отсортированном виде по ключам или значениям.
Варианты перебора списков, используя
for/in
в Python.При итерации по последовательности с помощью инструкции for/in
индекс позиции и соответствующее значение могут быть получены одновременно с помощью встроенной функции enumerate()
.
>>> for i, v in enumerate(['tic', 'tac', 'toe']): ... print(i, v) ... # 0 tic # 1 tac # 2 toe
Перебор значений нескольких списков одновременно.
Чтобы выполнить цикл над двумя или более последовательностями одновременно, списки могут быть соединены с помощью встроенной функции zip()
.
>>> questions = ['name', 'quest', 'favorite color'] >>> answers = ['lancelot', 'the holy grail', 'blue'] >>> for q, a in zip(questions, answers): ... print('What is your {0}? It is {1}.'.format(q, a)) ... # What is your name? It is lancelot. # What is your quest? It is the holy grail. # What is your favorite color? It is blue.
Еще пример:
>>> lst1 = [0, 1, 2, 3, 4, 5] >>> lst2 = [5, 3, 2, 0, 4, 1] >>> lst3 = ['zero', 'one', 'two', 'three', 'four', 'five'] >>> for a, b, c in zip(lst1, lst2, lst3): ... print(f'{c}:\t{a} + {b} = {a + b}') ... # zero: 0 + 5 = 5 # one: 1 + 3 = 4 # two: 2 + 2 = 4 # three: 3 + 0 = 3 # four: 4 + 4 = 8 # five: 5 + 1 = 6
Перебор значений списка в обратном порядке.
Чтобы выполнить цикл над последовательностью в обратном направлении используйте встроенную функцию reversed()
.
>>> for i in reversed(range(1, 10, 2)): ... print(i) ... # 9 # 7 # 5 # 3 # 1
Перебор значений списка в отсортированном порядке.
Для циклического перебора последовательности в отсортированном порядке используйте встроенную функцию sorted()
, которая возвращает новый отсортированный список, оставляя исходную последовательность неизменной.
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] >>> for f in sorted(basket): ... print(f) ... # apple # banana # orange # pear
Изменение списка во время выполнения цикла.
Иногда возникает соблазн изменить список во время выполнения цикла. Не делайте этого, так как это может привести к непредсказуемым результатам. Зачастую проще и безопаснее создать список с новыми значениями, или по крайней мере изменяйте копию list.copy()
исходного списка.
Пример, с созданием списка для новых значений.
>>> import math # не изменяйте исходный список во время итерации >>> raw_data = [56. 2, float('NaN'), 51.7, 55.3, 52.5, float('NaN'), 47.8] # создаем список для отобранных значений >>> filtered_data = [] >>> for value in raw_data: ... if not math.isnan(value): ... filtered_data.append(value) ... >>> filtered_data # [56.2, 51.7, 55.3, 52.5, 47.8]
Использование оператора
else
в циклах for/in
.Оператор else
в циклах for/in
выполняется только если цикл закончился и не прервался оператором break
. Звучит как то бессмысленно. Как можно использовать такое поведение?
Цикл for/in/else
упрощает любой цикл, который использует логический флаг, подобный этому:
# флаг принятия дальнейшего решения found = False for divisor in range(2, n): if n % divisor == 0: # если найден делитель, то меняем # флаг на `True` и выходим из цикла found = True break # принимаем решение на основе значения флага if found: print(n, 'is composite') else: print(n, 'is prime')
Оператор else
в for/in
позволяет опустить флаг и сделать код выше компактнее:
for divisor in range(2, n): if n % divisor == 0: print(n, 'is composite') break else: # else сработает, если цикл не завершиться # по `break`, т. е. преждевременно print(n, 'is prime')
Обратите внимание, что для кода, в котором принимается решение, что делать, уже есть естественное место для его выполнения (перед оператором break
). Единственная новая функция здесь — это место для выполнения кода, когда не нашлось ни одного делителя divisor
.
Такое поведение for/in/else
работает только в сочетании с оператором break
. Но все равно нужны логические значения (флаги), если например, ищется последнее совпадение или необходимо отслеживать несколько условий параллельно.
Если единственной целью цикла for/in
является ответ да или нет (флаг принятия решения), то можно написать его намного короче с помощью встроенных функций any()
/all()
и выражение-генератор, которое дает логические значения:
if any(n % divisor == 0 for divisor in range(2, n)): print(n, 'is composite') else: print(n, "is prime")
Этот код эффективен, как цикл с прерыванием, т. к. в функции any()
происходит замыкание, а выражение-генератор выполняется только до тех пор, пока оно не вернет значение True
. Этот код даже быстрее, чем цикл.
Как сделать циклы Python более питоническими — dbader.org
Дэн Бейдер — Получайте бесплатные обновления новых сообщений здесь.
Настройте на Python циклы for и while в стиле C, рефакторинг их с использованием генераторов и других методов.
Один из самых простых способов определить разработчика с опытом работы с языками в стиле C, который только недавно освоил Python, — посмотреть, как он пишет циклы.
Например, всякий раз, когда я вижу такой фрагмент кода, это пример того, как кто-то пытается написать Python, как будто это C или Java 9.0010 :
my_items = ['а', 'б', 'в'] я = 0 пока я < len (my_items): печать (мои_элементы [я]) я += 1
Итак, что такого «непитоновского» в этом коде?
В этом примере кода можно улучшить две вещи:
- Во-первых, он отслеживает индекс
i
вручную, инициализируя его нулем, а затем осторожно увеличивая его при каждой итерации цикла. - И, во-вторых, он использует
len()
для получения размера контейнера, чтобы определить, как часто выполнять итерацию.
В Python вы можете писать циклы, которые автоматически выполняют обе эти обязанности. Это отличная идея, чтобы воспользоваться этим.
Если ваш код не должен отслеживать работающий индекс, гораздо сложнее написать, например, случайные бесконечные циклы. Это также делает код более кратким и, следовательно, более читабельным.
Как автоматически отслеживать индекс цикла
Чтобы реорганизовать цикл while
в примере кода, я начну с удаления кода, который вручную обновляет индекс. Хороший способ сделать это с вместо
- цикл в Python.
Используя встроенную функцию Python range()
, я могу автоматически генерировать индексы (без увеличения текущей переменной счетчика):
>>> диапазон (длина (my_items)) диапазон(0, 3) >>> список (диапазон (0, 3)) [0, 1, 2]
Тип диапазона
представляет собой неизменяемую последовательность чисел. Его преимущество перед обычным списком
заключается в том, что он всегда занимает один и тот же небольшой объем памяти.
на самом деле не хранят отдельные значения, представляющие числовую последовательность, — вместо этого они функционируют как итераторы и вычисляют значения последовательности на лету.
(Это верно для Python 3. В Python 2 вам нужно будет использовать встроенную функцию xrange()
, чтобы получить такое поведение экономии памяти, поскольку range()
создаст объект списка, содержащий все значения .)
Теперь, вместо увеличения i
на каждой итерации цикла, я мог бы написать рефакторинговую версию этого цикла следующим образом:
для i в диапазоне (len (my_items)): печать (мои_элементы [я])
Это лучше. Однако это все еще не super 9.0034 Pythonic — в большинстве случаев, когда вы видите код, который использует range(len(...))
для перебора контейнера, его можно улучшить и упростить еще больше.
Давайте посмотрим, как это можно сделать на практике.
💡 Циклы for Python — это циклы for-each
Как я уже упоминал, циклы for
в Python на самом деле являются циклами «для каждого», которые могут перебирать элементы из контейнера или последовательности напрямую, без необходимости искать их по индексу. Я могу воспользоваться этим и еще больше упростить цикл:
для элемента в my_items: печать (элемент)
Я бы посчитал это решение полностью Pythonic. Он приятный и чистый и читается почти как псевдокод из учебника. Мне не нужно следить за размером контейнера или текущим индексом для доступа к элементам.
Контейнер сам заботится о выдаче элементов для их обработки. Если контейнер заказал , такой же будет результирующая последовательность элементов. Если контейнер не заказан он вернет свои элементы в произвольном порядке, но цикл по-прежнему будет охватывать их все.
Что делать, если мне
нужен индекс товара? Конечно, вы не всегда сможете так переписать свои циклы. Что делать, если вам нужен индекс элемента, например? Существует Pythonic-способ поддерживать работающий индекс, который позволяет избежать конструкции range(len(...))
, которую я рекомендовал против.
В этом случае полезна встроенная функция enumerate()
:
>>> для i, элемент перечисления (my_items): ... напечатать (f'{i}: {item}') 0: а 1: б 2: с
Видите ли, итераторы в Python могут возвращать более одного значения. Они могут возвращать кортежи с произвольным количеством значений, которые затем можно распаковать прямо внутри оператора for
.
Это очень мощно. Например, вы можете использовать ту же технику для одновременного перебора ключей и значений словаря:
>>> электронные письма = { ... 'Боб': 'боб@example.com', ... 'Алиса': '[email protected]', ... } >>> для имени, электронной почты в emails.items(): ... print(f'{имя} → {электронная почта}') 'Боб → [email protected]' 'Алиса → alice@example. com'
Хорошо, а что, если у меня просто
есть для записи цикла в стиле C? Есть еще один пример, который я хотел бы показать вам. Что делать, если вам абсолютно необходимо написать цикл в стиле C. Например, что, если вы должны контролировать размер шага для индекса? Представьте, что у вас есть следующий исходный C или Java for
-loop:
для (int i = a; i < n; i+=s) { // ... }
Как этот шаблон будет переведен на Python?
Функция range()
снова приходит нам на помощь — она может принимать дополнительные параметры для управления начальным значением цикла ( a
), значение остановки ( n
) и размер шага ( s
).
Таким образом, наш пример цикла в стиле C может быть реализован следующим образом:
для i в диапазоне (a, n, s): # ...
Основные выводы
- Написание циклов в стиле C на Python считается непитоновским. По возможности избегайте управления индексами циклов и условиями остановки вручную.
- Python's
for
-loops - это на самом деле циклы "для каждого", которые могут перебирать элементы из контейнера или последовательности напрямую.
📺 Посмотрите видеоинструкцию по этой статье
» Подпишитесь на канал YouTube dbader.org для получения дополнительных руководств по Python.
Вложенные циклы Python [с примерами] — PYnative
В Python цикл внутри цикла называется вложенным циклом . В этом уроке мы узнаем о вложенных циклах в Python с помощью примеров.
Содержание
- Что такое вложенный цикл в Python?
- Python, вложенный для цикла
- Вложенный цикл для печати шаблона
- Цикл While внутри цикла for
- Практика: Печать прямоугольника Шаблон с 5 рядами и 3 столбцами звездочек
- Прервать вложенный цикл
- Продолжить вложенный цикл 900 19 однострочных вложенных циклов с использованием Понимание списка
- Вложенный цикл while в Python
- for Цикл внутри цикла While
- Когда использовать вложенный цикл в Python?
Что такое вложенный цикл в Python?
Вложенный цикл — это цикл внутри тела внешнего цикла. Внутренний или внешний цикл может быть любого типа, например цикл while или цикл for. Например, внешний цикл for
может содержать цикл while
и наоборот.
Внешний цикл может содержать более одного внутреннего цикла. Нет ограничений на цепочку петель.
Во вложенном цикле количество итераций будет равно количеству итераций во внешнем цикле, умноженному на количество итераций во внутреннем цикле.
В каждой итерации внешнего цикла внутренний цикл выполняет всю свою итерацию. Для каждой итерации внешнего цикла внутренний цикл перезапускается и завершает свое выполнение до того, как внешний цикл сможет перейти к следующей итерации.
Вложенные циклы обычно используются для работы с многомерными структурами данных, например для печати двумерных массивов, повторения списка, содержащего вложенный список.
Вложенный цикл — это часть оператора потока управления, который помогает вам понять основы Python.
Вложенный цикл for Python
В Python цикл for используется для перебора последовательности, например списка, строки, кортежа и других итерируемых объектов, таких как диапазон.
Синтаксис использования вложенного цикла for в Python
# внешний цикл for для элемента в последовательности # внутренний цикл for для элемента в последовательности: тело внутреннего цикла for тело внешнего цикла for
В этом примере мы используем цикл for внутри цикла for
. В данном примере нас печатает таблицу умножения первых десяти чисел.
- Внешний цикл
for
использует функцию range() для перебора первых десяти чисел - Внутренний цикл
for
будет выполняться десять раз для каждого внешнего числа - В теле внутреннего цикла мы вывести произведение внешнего числа на текущее число
- Внутренний цикл — это не что иное, как тело внешнего цикла.
Пример: Напишите вложенную программу цикла for
для печати таблицы умножения в Python
# внешний цикл для я в диапазоне (1, 11): # вложенный цикл # для итерации от 1 до 10 для j в диапазоне (1, 11): # напечатать умножение напечатать (я * j, конец = ' ') print()
Вывод :
1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 4956 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100
- В этой программе внешний цикл
for
повторяет числа от 1 до 10.range()
возвращает 10 чисел. Таким образом, общее количество итераций внешнего цикла равно 10. - В первой итерации вложенного цикла число равно 1. В следующей — 2. и так далее до 10.
- Далее, Для каждой итерации внешний цикл, внутренний цикл будет выполняться десять раз. Внутренний цикл также будет выполняться десять раз, потому что мы печатаем таблицу умножения до десяти.
- В каждой итерации внутреннего цикла мы вычисляли произведение двух чисел.
Вложенный цикл для печати шаблона
Другим наиболее распространенным применением вложенного цикла является печать различных шаблонов звезд и чисел.
Давайте посмотрим, как использовать вложенный цикл для печати следующего шаблона в Python.
Образец :
* * * * * * * * * * * * * * *
Программа :
строк = 5 # внешний цикл для я в диапазоне (1, строки + 1): # внутренний цикл для j в диапазоне (1, i + 1): распечатать("*", конец=" ") печать('')
- В этой программе внешний цикл — это количество строк, которые печатаются.
- Количество строк равно пяти, поэтому внешний цикл будет выполняться пять раз.
- Далее, внутренний цикл — это общее количество столбцов в каждой строке.
- Для каждой итерации внешнего цикла количество столбцов увеличивается на 1
- В первой итерации внешнего цикла количество столбцов равно 1, в следующей - 2 и так далее.
- Итерация внутреннего цикла равна количеству столбцов.
- В каждой итерации внутреннего цикла мы печатаем звездочку
Цикл While внутри цикла for
Очень часто и полезно использовать один тип цикла внутри другого. мы можем поместить цикл while внутри цикла for
.
Предположим, мы хотим повторить каждое имя из списка пять раз.
- Здесь мы будем повторять список, используя внешний цикл for
- В каждой итерации внешнего цикла for внутренний цикл for выполняется пять раз, чтобы вывести текущее имя пять раз
имен = ['Келли', 'Джесса', 'Эмма'] # внешний цикл для имени в именах: # внутренний цикл количество = 0 пока количество < 5: печать (имя, конец = '') # увеличить счетчик количество = количество + 1 print()
Вывод :
Келли Келли Келли Келли Келли Джесса Джесса Джесса Джесса Джесса Эмма Эмма Эмма Эмма Эмма
Практика: распечатайте шаблон прямоугольника с 5 рядами и 3 столбцами звезд
Решите приведенное ниже упражнение Python с вложенным циклом.
Печать следующего прямоугольника из звезд
*** *** *** *** ***
Решить больше циклических упражнений.
Показать раствор# 5 рядов для имени в диапазоне (5): № 3 столбец для j в диапазоне (3): печать('*', конец='') Распечатать()
Break Вложенный цикл
Оператор break используется внутри цикла для выхода из цикла. Если оператор break используется внутри вложенного цикла (цикл внутри другого цикла), он завершит самый внутренний цикл.
В следующем примере у нас есть два цикла. Внешний 9Цикл 0020 for повторяет первые четыре числа, используя функцию range()
, а внутренний цикл for
также повторяет первые четыре числа. Если внешний номер и текущий номер внутреннего цикла совпадают, то внутренний (вложенный) цикл разрывается.
Пример :
для i в диапазоне (4): для j в диапазоне (4): если j == i: перерыв print(i, j)
Вывод :
1 0 2 0 2 1 3 0 3 1 3 2
Как видно из вывода, нет строк, содержащих одинаковые числа.
Continue Вложенный цикл
Оператор continue пропускает текущую итерацию и переходит к следующей итерации . В Python, когда внутри цикла встречается оператор continue
, он пропускает все операторы, расположенные ниже него, и сразу же переходит к следующей итерации.
В следующем примере у нас есть два цикла. Внешний цикл for перебирает первый список, а внутренний цикл также перебирает второй список чисел.
Если внешний номер и текущий номер внутреннего цикла совпадают, перейти к следующей итерации внутреннего цикла.
Пример :
сначала = [2, 4, 6] секунда = [2, 4, 6] для я в первую очередь: для j в секунду: если я == j: продолжать print(i, '*', j, '= ', i * j)
Вывод :
2 * 4 = 8 2 * 6 = 12 4 * 2 = 8 4 * 6 = 24 6 * 2 = 12 6 * 4 = 24
Как вы можете видеть в выводе, одинаковые числа не умножаются друг на друга.
Например, если у вас есть два списка и вы хотите получить все их комбинации, для этого вам нужно использовать два вложенных цикла, как указано ниже.
первый = [2, 3, 4] секунда = [20, 30, 40] финал = [] для я в первую очередь: для j в секунду: final.append(i+j) print(final)
Вы можете написать более быстрый и компактный код, используя сжатие списка и вложенный цикл, как показано ниже.
первый = [2, 3, 4] секунда = [20, 30, 40] final = [i+j для i в первом для j во втором] печать (финал)
Как это написать:
- Сначала напишите внешний цикл
for
, который будет перебирать первый список, например[для i in first]
- Затем напишите внутренний цикл, который будет перебирать второй список после внешнего цикла, например
[для i в первом для j во втором]
- Наконец, вычислите сложение внешнего числа и внутреннего числа, например
[i+j для i в первом для j во втором]
- At наконец, сохраните результат в новом списке, например
final = [i+j для i в первом для j во втором]
Давайте посмотрим больше таких примеров.
В этом примере мы будем использовать два цикла for
для понимания списка, и конечным результатом будет список списков. мы не будем включать одни и те же числа в каждый список. мы будем фильтровать их, используя условие if.
final = [[x, y] для x в [10, 20, 30] для y в [30, 10, 50], если x != y] print(final)
Вывод :
[[10, 30], [10, 50], [20, 30], [20, 10], [20, 50], [30, 10], [ 30, 50]]
Вложенный цикл while в Python
В Python оператор цикла while повторно выполняет блок кода, пока выполняется определенное условие. Мы используем w цикл while, когда число итераций не фиксировано.
В этом разделе мы увидим, как использовать цикл while внутри другого цикла while.
Синтаксис для записи вложенного оператора цикла while в Python выглядит следующим образом:
выражение while: пока выражение: заявления) заявление(я)
Пример :
В этом примере мы будем печатать первые 10 чисел в каждой строке 5 раз.
я = 1 пока я <= 5: дж = 1 в то время как j <= 10: печать (j, конец = '') дж = дж + 1 я = я + 1 print()
Вывод :
12345678910 12345678910 12345678910 12345678910 12345678910
for внутри цикла While
Иногда полезно использовать один тип цикла внутри другого. мы можем поставить на 9Цикл 0021 внутри цикла
, а цикл
.
Предположим, мы хотим напечатать все совершенные числа от 1 до 100
- Здесь мы будем повторять первые 100 чисел, используя цикл
while
- В каждой итерации внешнего цикла
while
, внутреннийдля Цикл
выполняется от 1 до текущего внешнего числа, чтобы проверить, является ли текущее число совершенным числом.
print('Показать совершенное число от 1 до 100') п = 2 # внешний цикл в то время как n <= 100: х_сумма = 0 # внутренний цикл for для i в диапазоне (1, n): если n % i == 0: х_сумма += я если x_sum == n: print('Идеальное число:', n) п += 1
Когда использовать вложенный цикл в Python?
- Вложенные циклы удобны, когда у вас есть вложенные массивы или списки, которые нужно зациклить на одной и той же функции.