Python цикл for — for i in range ~ PythonRu
Циклы являются одной из основных управляющих конструкций в любом языке программирования, и Python не является исключением.
В этой статье мы рассмотрим несколько примеров использования циклов for с функцией range() в Python.
Циклы for в Python
Циклы for повторяют определённый код для некоторого набора значений.
Из документации Python можно узнать, что в нем циклы for работают несколько иначе, чем в таких языках, как JavaScript или C.
Цикл for присваивает итерируемой переменной каждое значение из предоставленного списка, массива или строки и повторяет код в теле цикла for для каждого установленного таким образом значения переменной-итератора.
В приведенном ниже примере мы используем цикл for для вывода каждого числа в нашем массиве.
Копировать Скопировано Use a different Browser
# Простой пример цикла for for i in [0, 1, 2, 3, 4, 5]: print(i, end="; ") # выведет: 0; 1; 2; 3; 4; 5;
В тело цикла for можно включить и более сложную логику. В следующем примере мы выводим результат небольшого вычисления, основанного на значении переменной i.
Копировать Скопировано Use a different Browser
# Пример посложнее for i in [0, 1, 2, 3, 4, 5]: x = (i-2)*(i+2) - i**2 + 4 print(x, end="; ") # выведет: 0; 0; 0; 0; 0; 0;
Когда значения в массиве для нашего цикла for представляют собой некоторую закономерную последовательность, мы можем использовать функцию Python range() вместо того, чтобы вписывать содержимое нашего массива вручную.
Функция Range в Python
Функция range() возвращает последовательность целых чисел на основе переданных ей аргументов. Дополнительную информацию можно найти в документации Python по функции range().
Копировать Скопировано Use a different Browser
range(stop) range(start, stop[, step])
Аргумент start — это первое значение в диапазоне. Если функция range() вызывается только с одним аргументом, то Python считает, что start = 0.
Аргумент stop — это верхняя граница диапазона. Важно понимать, что само граничное значение не включается в последовательность.
В примере ниже у нас есть диапазон, начинающийся со значения по умолчанию, равному 0, и включающий целые числа меньше 6.
Копировать Скопировано Use a different Browser
# Использование range() с единственным аргументом for i in range(6): print(i, end="; ") # выведет: 0; 1; 2; 3; 4; 5;
В следующем примере мы задаем start = -2 и включаем целые числа меньше 4.
Копировать Скопировано Use a different Browser
# В этот раз передаются два аргумента for i in range(-2, 4): print(i, end="; ") # выведет: -2; -1; 0; 1; 2; 3;
Необязательное значение step (шаг) управляет приращением между значениями последовательности. По умолчанию step = 1.
В нашем последнем примере мы используем диапазон целых чисел от -2 до 6 и задаем step = 2.
Копировать Скопировано Use a different Browser
# Здесь используются все аргументы range() for i in range(-2, 6, 2): print(i, end="; ") # выведет: -2; 0; 2; 4;
Заключение
В этой статье мы рассмотрели циклы for в Python и функцию range().
Циклы for обеспечивают повторное выполнение блока кода для всех значений в указанном списке, массиве, строке или последовательности, определенной с помощью функции range().
Как было показано, мы можем использовать range(), чтобы упростить написание цикла for. При вызове данной функции вы обязаны указать stop значение, также вами могут быть определены начальное значение и шаг между целыми числами в возвращаемом диапазоне.
Максим
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.
Python Q https://yandex.ru/q/loves/python Online
Python QCEO [email protected]://secure.gravatar.com/avatar/b16f253879f7349f64830c64d1da4415?s=96&d=mm&r=gCEO PythonruPythonАлександрРедакторhttps://t.me/cashncarryhttps://pythonru.com/https://yandex.ru/q/profile/cashnc/PythonRu. [email protected] Zabrodin2018-10-26OnlinePython, Programming, HTML, CSS, JavaScriptПопулярное
цикл for : Синтаксис, блок-схема
Синтаксис цикла for
Рис. 1. Синтаксис цикла for.И когда вы пишете цикл for, вы должны создать круглую скобку, а внутри круглой скобки вы пишете три выражения.
Все три выражения не являются обязательными, но вы можете написать 3 выражения, и эти выражения будут разделены точкой с запятой. Две точки с запятой создают для вас три блока внутри скобок. Итак, эти две точки с запятой обязательны, но оставить ли этот блок пустым или заполненным, зависит от вашей логики.
- Оператор for имеет 3 блока, разделенных двумя точками с запятой.
- Две точки с запятой обязательны.
- Но вы можете оставить любой блок пустым.
- Даже вы можете оставить все блоки пустыми, что создаст бесконечный цикл.
{ } это тело цикла for, в котором вы пишете операторы.
- Блок 1 выполняется только один раз, поэтому вы должны помнить об этом.
- Блок 2 (я имею в виду выражение внутри блока 2) используется для того, чтобы продолжить цикл или разорвать цикл, что означает, что выражение в блоке 2 оценивается как истинное или ложное. Таким образом, этот блок решает, разорвать ли цикл или продолжить цикл.
- Блок 3 ничего не решает. В блок 3 можно поместить любое выражение. Таково значение этих блоков.
Теперь возникает вопрос, когда выполняется выражение блока 1, когда выполняется выражение блока 2 и когда выполняется выражение блока 3. Таким образом, они выполняются в определенном порядке. Давайте это поймем.
Когда цикл for запускается в первый раз, блок 1 выполняется один раз. И после этого оценивается блок 2. Если результат оценки истинен, то выполняется только тело цикла. Предположим, если оценка ложна, цикл прерывается.
Итак, сначала выполняется блок 1, а затем оценивается блок 2. Оценка блока 2 верна, цикл выполняется один раз, после чего выполняется блок 3. Это означает, что выражение в блоке 3 выполняется. И после этого снова сравнивается блок 2. Если оно истинно, снова выполняется цикл, и снова выполняется блок 3, вот так.
Это может немного сбивать с толку, но есть блок-схема, чтобы лучше понять это.
Блок-схема цикла for
Блок-схема цикла for показана на рисунке 2.
Рисунок 2. Блок-схема цикла for
Сначала выполните блок 1 только один раз, затем проверьте результат блока 2. Если он неверен, цикл делается, то есть петля разрывается.
Предположим, если блок 2 верен, то выполнить тело и затем выполнить блок 3. И снова вернуться, чтобы проверить результат блока 2. Если верно, снова выполнить тело, после выполнения тела следует помнить, что происходит выполнение блока 3.
Эту особенность цикла for мы можем использовать для итераций.
Рисунок 3. Итерации
Мы обычно используем блок 1 для инициализации, потому что он выполняется только один раз.
После этого выражение оценки сохраняем в блоке 2. Например, i<10 — это оценка. Итак, это оценочное выражение мы сохраняем в блоке 2. А в блоке 3 мы обычно увеличиваем итератор. Здесь, в данном случае, «i» — это итератор. Мы используем блок 3 для увеличения или уменьшения итератора.
Курсы FastBit Embedded Brain Academy
Щелкните здесь: https://fastbitlab.com/course1
11.13 — Циклы For-each — Изучение C++
В уроке 11.3 — Массивы и циклы мы показал примеры, в которых мы использовали цикл for для перебора каждого элемента массива.
Например:
#include#include <итератор> // std::size основной () { constexpr целое количество баллов[]{ 84, 92, 76, 81, 56}; constexpr int numStudents{ std::size(scores) }; int maxScore { 0 }; // отслеживаем наш самый большой счет for (int student{ 0 }; student < numStudents; ++student) { если (баллы [ученик] > maxScore) { maxScore = баллы[ученик]; } } std::cout << "Лучший результат: " << maxScore << '\n'; вернуть 0; }
Хотя циклы for обеспечивают удобный и гибкий способ перебора массива, их также легко испортить и они склонны к ошибкам «не за единицой».
Существует более простой и безопасный тип цикла, называемый циклом for-each (также называемый циклом for на основе диапазона ) для случаев, когда мы хотим выполнить итерацию по каждому элементу массива (или другого типа списка). состав).
Циклы for-each
Оператор for-each имеет следующий синтаксис:
for (element_declaration : array) заявление;
При обнаружении этого оператора цикл будет перебирать каждый элемент массива, присваивая значение текущего элемента массива переменной, объявленной в element_declaration. Для достижения наилучших результатов element_declaration должен иметь тот же тип, что и элементы массива, иначе произойдет преобразование типов.
Давайте рассмотрим простой пример, в котором используется цикл for-each для вывода всех элементов массива с именем fibonacci:
#includeосновной () { constexpr int fibonacci[]{ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 }; for (int number : fibonacci) // итерация по массиву fibonacci { std::cout << число << ' '; // мы обращаемся к элементу массива для этой итерации через переменную number } std::cout << '\n'; вернуть 0; }
Это печатает:
0 1 1 2 3 5 8 13 21 34 55 89
Давайте подробнее рассмотрим, как это работает. Сначала выполняется цикл for , и номер переменной устанавливается равным значению первого элемента, который имеет значение 0. Программа выполняет оператор, который печатает 0. Затем снова выполняется цикл for , и номер устанавливается к значению второго элемента, который имеет значение 1. Оператор выполняется снова, что печатает 1. Цикл for продолжает итерацию по каждому из чисел по очереди, выполняя оператор для каждого, пока не останется элементов осталось в массиве для повторения. В этот момент цикл завершается, и программа продолжает выполнение (возвращая операционной системе 0).
Обратите внимание, что номер переменной не является индексом массива. Ему присваивается значение элемента массива для текущей итерации цикла.
Для каждого цикла и ключевого слова auto
Поскольку element_declaration должен иметь тот же тип, что и элементы массива, это идеальный случай для использования ключевого слова auto
, и пусть C++ выводит тип элементов массива для нас .
Вот приведенный выше пример с использованием auto:
#includeосновной () { constexpr int fibonacci[]{ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89}; for (auto number : fibonacci) // тип автоматический, поэтому тип числа выводится из массива fibonacci { std::cout << число << ' '; } std::cout << '\n'; вернуть 0; }
Циклы и ссылки for-each
В следующем примере объявления элементов for-each объявляются по значению:
std::string array[]{ "peter", "likes", "frozen", " йогурт" }; for (auto element : array) // элемент будет копией текущего элемента массива { std::cout << элемент << ' '; }
Это означает, что каждый итерируемый элемент массива будет скопирован в переменный элемент. Копирование элементов массива может быть дорогостоящим, и в большинстве случаев мы просто хотим сослаться на исходный элемент. К счастью, для этого мы можем использовать ссылки:
std::string array[]{ "peter", "likes", "frozen", "yogurt" }; for (auto& element: array) // Амперсанд делает элемент ссылкой на фактический элемент массива, предотвращая создание копии { std::cout << элемент << ' '; }
В приведенном выше примере element будет ссылкой на текущий итерируемый элемент массива, что позволяет избежать необходимости создания копии.
Также любые изменения в элементе повлияют на повторяющийся массив, что невозможно, если элемент является обычной переменной. И, конечно же, хорошей идеей будет сделать вашу ссылку const
, если вы собираетесь использовать ее только для чтения:
std::string array[]{ "peter", "likes" , "Замороженный йогурт" }; for (const auto& element: array) // элемент является константной ссылкой на текущий итерируемый элемент массива { std::cout << элемент << ' '; }
Передовая практика
В объявлениях элементов циклов for-each, если ваши элементы не являются фундаментальными типами, используйте ссылки или ссылки const
по соображениям производительности.
Переписывание примера максимального количества баллов с использованием цикла for-each
Вот пример в начале урока, переписанный с использованием для каждого цикла :
#includeосновной () { constexpr int scores[]{ 84, 92, 76, 81, 56 }; int maxScore { 0 }; // отслеживаем наш самый большой счет for (auto score : scores) // итерация по массиву scores, присваивая каждое значение по очереди переменной score { если (оценка > maxScore) { maxScore = оценка; } } std::cout << "Лучший результат: " << maxScore << '\n'; вернуть 0; }
Обратите внимание, что в этом примере нам больше не нужно вручную индексировать массив или получать его размер. Мы можем получить доступ к элементу массива напрямую через переменную score. Массив должен иметь информацию о размере. Массив, преобразованный в указатель, нельзя использовать в цикле for-each.
Циклы For-each и не-массивы
Циклы For-each работают не только с фиксированными массивами, они работают со многими типами спископодобных структур, таких как векторы (например, std::vector
) , связанные списки, деревья и карты. Мы еще не рассмотрели ни один из них, поэтому не беспокойтесь, если вы не знаете, что это такое. Просто помните, что циклы for each обеспечивают гибкий и универсальный способ перебора не только массивов.
#include#include <вектор> основной () { std::vector fibonacci{ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 }; // обратите внимание на использование здесь std::vector вместо фиксированного массива // До С++17 // std::vector fibonacci{ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 }; для (автоматический номер: Фибоначчи) { std::cout << число << ' '; } std::cout << '\n'; вернуть 0; }
For-each не работает с указателями на массив
Чтобы выполнить итерацию по массиву, for-each необходимо знать размер массива, что означает знание размера массива. Поскольку массивы, распавшиеся на указатель, не знают своего размера, циклы for-each с ними работать не будут!
#includeint sumArray(const int array[]) // массив является указателем { целая сумма { 0 }; for (auto number : array) // ошибка компиляции, размер массива неизвестен { сумма += число; } сумма возврата; } основной () { constexpr целочисленный массив[]{ 9, 7, 5, 3, 1}; std::cout << sumArray (массив) << '\n'; // здесь массив распадается на указатель вернуть 0; }
Точно так же динамические массивы не будут работать с циклами for-each по той же причине.
Могу ли я получить индекс текущего элемента?
Циклы For-each делают , а не , обеспечивают прямой способ получить индекс массива текущего элемента. Это связано с тем, что многие структуры, с которыми могут использоваться циклы for-each (например, связанные списки), не индексируются напрямую!
Начиная с C++20, циклы for на основе диапазона могут использоваться с оператором инициализации точно так же, как оператор инициализации в обычных циклах for. Мы можем использовать оператор init для создания ручного счетчика индексов, не загрязняя функцию, в которой находится цикл for.
Оператор инициализации помещается прямо перед переменной цикла:
for (оператор инициализации; element_declaration : array) заявление;
В следующем коде у нас есть два массива, которые связаны по индексу. Например, ученик с именем имен[3]
имеет оценку баллов[3]
. Всякий раз, когда обнаруживается учащийся с новым высоким баллом, мы печатаем его имя и разницу в баллах с предыдущим высоким баллом.
#include#include основной () { constexpr std::string_view names[]{ "Алекс", "Бетти", "Кэролайн", "Дэйв", "Эмили" }; // Имена студентов constexpr int scores[]{ 84, 92, 76, 81, 56 }; int maxScore { 0 }; for (int i{ 0 }; auto score : scores) // i — индекс текущего элемента { если (оценка > maxScore) { std::cout << names[i] << " превзойти предыдущий лучший результат " << maxScore << " на " << (score - maxScore) << " очков!\n"; maxScore = оценка; } ++я; } std::cout << "Лучший результат: " << maxScore << '\n'; вернуть 0; }
Результат
Алекс побил предыдущий лучший результат 0 на 84 очка! Бетти побила предыдущий лучший результат 84 на 8 очков! Лучший результат был 92
int i{0};
- это оператор инициализации, он выполняется только один раз при запуске цикла. В конце каждой итерации мы увеличиваем i
, как в обычном цикле for. Однако если бы мы использовали continue
внутри цикла, то ++i
было бы пропущено, что привело бы к неожиданным результатам. Если вы используете continue
, вам нужно убедиться, что i
увеличивается до того, как встретится continue
.
До C++20 индексную переменную i
нужно было объявлять вне цикла, что могло привести к конфликту имен, когда мы хотели определить другую переменную с именем i
позже в функции.
Заключение
Циклы For-each обеспечивают превосходный синтаксис для перебора массива, когда нам нужно получить доступ ко всем элементам массива в прямом последовательном порядке. Его следует предпочесть стандартному циклу for в тех случаях, когда его можно использовать. Чтобы предотвратить создание копий каждого элемента, объявление элемента может быть ссылкой.
Время викторины
Это должно быть легко.