Как сделать цикл без цикла?
Часто на собеседованиях на младшие позиции компании хотят проверить, как у вас с нестандартным мышлением и решениями в условиях ограничений. Проще говоря — как вы ведёте себя в необычных ситуациях.
Пример такой задачи:
👉 Представьте, что в вашем языке программирования пропали все циклы. Как вы организуете в этом случае три классических цикла: for, while и until? Можно на примере Python или любого другого языка.
Чтобы решить эту задачу, нужно вспомнить, что цикл — это повторение одного и того же несколько раз. Сколько именно раз — зависит от вида цикла.
В каждом цикле есть два важных параметра:
- Переменная цикла, которая должна как-то меняться в процессе.
- Условие цикла, по которому этот цикл закончится.
Получается, что в нашем решении обязательно должны быть эти два компонента, чтобы сымитировать работу цикла. Запомним это и подумаем дальше.
Раз нам нельзя использовать циклы, то попробуем сделать так:
- Выполняем нужные команды.
- Проверяем условия и смотрим, нужно остановиться или продолжаем дальше.
- Если продолжаем — снова выполняем нужные команды
Но как нам выполнить команды снова, если мы не знаем точного количества повторений и нельзя использовать циклы? Используем для этого рекурсию — это когда функция внутри вызывает сама себя. А условие цикла будем проверять с помощью условного оператора if.
Попробуем так сделать простой цикл for, который выведет числа от 1 до 5:
# функция, внутри которой сделаем рекурсию # на входе — три переменные: переменная цикла, конец и шаг цикла def loop_for(a,b,c): # если ещё не достигли конца цикла if a<=b: # выводим текущее значение переменной цикла print(a) # увеличиваем её на шаг цикла a+=c # запускаем рекурсию и передаём ей текущие параметры цикла loop_for(a,b,c) # запускаем цикл for loop_for(1,5,1)На экране числа от 1 до 5, значит, цикл работает правильно
Теперь сделаем цикл с предусловием while-do, когда сначала проверяется условие, и если оно верное — выполняются команды цикла. Но у нас и так текущий код делает почти то же самое, и единственное, что нужно в нём поправить, — убрать переменную с шагом цикла. А всё потому, что в цикле с предусловием нет обязательного шага цикла — его можно организовать и без него, главное, чтобы условие проверялось до выполнения тела цикла, а не после.
# функция, внутри которой сделаем рекурсию # на входе — две переменные, которые отвечают за условие цикла def loop_while(a,b): # если ещё не достигли конца цикла if a<=b: # выводим текущее значение переменной цикла print(a) # меняем значение переменной из условия цикла, чтобы он не был бесконечным a+=1 # запускаем рекурсию и передаём ей текущие параметры цикла loop_while(a,b) # запускаем цикл while loop_while(6,10)
Последнее, что нам осталось сделать, — написать цикл с постусловием until. Он работает так: сначала выполняется тело цикла, а потом проверяется условие, и цикл работает до тех пор, пока условие ложно. Как только условие цикла станет истинным — цикл прекращается.
Чтобы сделать такое, нам нужно поставить проверку условия в самый конец, а до этого выполнить все остальные команды:
# функция, внутри которой сделаем рекурсию # на входе — две переменные, которые отвечают за условие цикла def loop_until(a,b): # выводим текущее значение переменной цикла print(a) # меняем значение переменной из условия цикла, чтобы он не был бесконечным a+=1 # если условие истинно if a>b: # выходим из цикла pass # иначе, если условие оказалось ложным else: # запускаем рекурсию и передаём ей текущие параметры цикла loop_until(a,b) # запускаем цикл until loop_until(11,15)
Попробуйте сделать то же самое на JavaScript и поделитесь своими результатами в комментариях.
Условия внутри тела цикла | Основы Python
Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером
В теле цикла, как и в теле функции, можно выполнять инструкции. Поэтому внутри цикла можно использовать все изученное ранее, например — условные конструкции.
Представьте функцию, которая считает, сколько раз входит буква в предложение. Пример ее работы:
count_chars('Fear cuts deeper than swords.', 'e') # 4 # Если вы ничего не нашли, то результат — 0 совпадений count_chars('Sansa', 'y') # 0
Перед тем как посмотреть содержимое функции, подумайте:
- Является ли эта операция агрегацией?
- Какой будет проверка на вхождение символа?
def count_chars(string, char): index = 0 count = 0 while index < len(string): if string[index] == char: # Считаем только подходящие символы count = count + 1 # Счетчик увеличивается в любом случае index = index + 1 return count
Это агрегирующая задача. Несмотря на то, что она считает не все символы, чтобы подсчитать сумму, приходится анализировать каждый символ. Ключевое отличие этого цикла от рассмотренных — внутри тела есть условие.
Переменная count
увеличивается только в том случае, когда рассматриваемый символ совпадает с ожидаемым. В остальном — это типичная агрегатная функция, которая возвращает количество нужных символов.
Пограничные случаи
Функция my_substr()
, которую вы реализовали в прошлом уроке, содержит много ошибок. Она прошла проверку, так как в ней не было пограничных случаев. Функция работала с нормальными аргументами. А теперь представим, что ей передали такие варианты длины:
0
- Отрицательное число
- Число, которое превышает реальный размер строки
Функция my_substr()
не рассчитана на такие варианты. Код будет запускаться в разных ситуациях, с разными комбинациями условий и данных. Нельзя быть уверенным, что аргументы всегда будут корректными, поэтому нужно учитывать все случаи.
Ошибки в пограничных случаях — частая причина логических ошибок в программах. Программисты всегда забывают что-нибудь учесть. Такие ошибки часто проявляются не сразу и могут долго не приводить к видимым проблемам.
Программа продолжает работать, но в какой-то момент обнаруживается, что в результатах есть ошибки. Часто причина в динамической типизации Python.
Вы научитесь справляться с такими ошибками с опытом.
Представим расширенную функцию my_substr()
. Она принимает три аргумента: строку, индекс и длину извлекаемой подстроки. Функция возвращает подстроку указанной длины, начиная с указанного индекса. Примеры вызова:
string = 'If I look back I am lost' print(my_substr(string, 0, 1)) # => 'I' print(my_substr(string, 3, 6)) # => 'I look'
Какие пограничные случаи стоит учитывать:
- Отрицательная длина извлекаемой подстроки
- Отрицательный заданный индекс
- Заданный индекс выходит за границу всей строки
- Длина подстроки в сумме с заданным индексом выходит за границу всей строки
Когда функция реализуется, каждый пограничный случай будет отдельным куском кода.
Скорее всего, он будет реализовываться с помощьюif
.Чтобы написать функцию my_substr()
и защититься от этих случаев, стоит реализовать отдельную функцию, которая будет проверять аргументы на корректность.
Возврат из циклов
Работа с циклами обычно сводится к двум сценариям:
- Агрегация. Накопление результата во время итераций и работа с ним после цикла. Переворот строки относится к такому варианту
- Выполнение цикла до достижения необходимого результата и выход. Например, задача поиска простых чисел — которые делятся без остатка только на себя и на единицу
Рассмотрим алгоритм проверки простоты числа. Будем делить искомое число x
на все числа из диапазона от двух до x - 1
и смотреть остаток. Если в этом диапазоне не найден делитель, который делит число x
без остатка, значит, перед нами простое число.
В этом случае достаточно проверять числа не до x - 1
, а до половины числа. Например, 11 не делится на 2, 3, 4, 5. Но и дальше не будет делиться на числа больше своей половины. Значит, можно оптимизировать алгоритм и проверять деление только до x / 2
:
def is_prime(number): if number < 2: return False divider = 2 while divider <= number / 2: if number % divider == 0: return False divider += 1 return True print(is_prime(1)) # => False print(is_prime(2)) # => True print(is_prime(3)) # => True print(is_prime(4)) # => False
Представим, что по алгоритму последовательного деления на числа до x / 2
нашлось одно, которое делит без остатка. Значит, переданный аргумент — не простое число, и дальнейшие вычисления не имеют смысла. В этом месте стоит возврат False
.
Если цикл отработал целиком, и не нашлось число, которое делит без остатка, значит, число — простое.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты.
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Электронная почта *
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Наши выпускники работают в компаниях:
Рекомендуемые программы
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Профессия
с нуля
Python-разработчик
Разработка веб-приложений на Django
26 января 10 месяцев
Профессия
В разработке с нуля
Аналитик данных
Сбор, анализ и интерпретация данных
16 марта 8 месяцев
Для перемещения по курсу нужно зарегистрироваться
1. Введение ↳ теория
2. Hello, World! ↳ теория / тесты / упражнение
3. Инструкции ↳ теория / тесты / упражнение
4. Арифметические операции ↳ теория / тесты / упражнение
5. Ошибки оформления — синтаксис и линтер ↳ теория / тесты / упражнение
6. Строки ↳ теория / тесты / упражнение
7. Переменные ↳ теория / тесты / упражнение
8. Выражения в определениях ↳ теория / тесты / упражнение
9. Именование ↳ теория / тесты / упражнение
10. Интерполяция ↳ теория / тесты / упражнение
11. Извлечение символов из строки ↳ теория / тесты / упражнение
12. Срезы строк ↳ теория / тесты / упражнение
13. Типы данных ↳ теория / тесты / упражнение
14. Неизменяемость и примитивные типы ↳ теория / тесты / упражнение
15. Функции и их вызов ↳ теория / тесты / упражнение
16. Сигнатура функции ↳ теория / тесты / упражнение
17. Вызов функции — выражение ↳ теория / тесты / упражнение
18. Детерминированность ↳ теория / тесты / упражнение
19. Стандартная библиотека ↳ теория / тесты / упражнение
20. Свойства и методы ↳ теория / тесты / упражнение
21. Цепочка методов ↳ теория / тесты / упражнение
22. Определение функций ↳ теория / тесты / упражнение
23. Возврат значений ↳ теория / тесты / упражнение
24. Параметры функций ↳ теория / тесты / упражнение
25. Необязательные параметры функций ↳ теория / тесты / упражнение
26. Именованные аргументы ↳ теория / тесты / упражнение
27. Окружение ↳ теория / тесты / упражнение
28. Логика ↳ теория / тесты / упражнение
29. Логические операторы ↳ теория / тесты / упражнение
30. Результат логических операций ↳ теория / тесты / упражнение
31. Условные конструкции ↳ теория / тесты / упражнение
32. Цикл while ↳ теория / тесты / упражнение
33. Агрегация данных ↳ теория / тесты / упражнение
34. Обход строк ↳ теория / тесты / упражнение
35. Условия внутри тела цикла ↳ теория / тесты / упражнение
36. Цикл for ↳ теория / тесты / упражнение
37. Отладка ↳ теория / тесты / упражнение
38. Модули ↳ теория / тесты / упражнение
39. Модули поглубже ↳ теория / тесты / упражнение
40. Пакеты ↳ теория / тесты / упражнение
41. Модуль random ↳ теория / тесты / упражнение
42. Кортежи ↳ теория / тесты / упражнение
43. История развития языка Python ↳ теория / тесты
Порой обучение продвигается с трудом. Сложная теория, непонятные задания… Хочется бросить. Не сдавайтесь, все сложности можно преодолеть. Рассказываем, как
Не понятна формулировка, нашли опечатку?
Выделите текст, нажмите ctrl + enter и опишите проблему, затем отправьте нам. В течение нескольких дней мы улучшим формулировку или исправим опечатку
Что-то не получается в уроке?
Загляните в раздел «Обсуждение»:
- Изучите вопросы, которые задавали по уроку другие студенты — возможно, ответ на ваш уже есть
- Если вопросы остались, задайте свой. Расскажите, что непонятно или сложно, дайте ссылку на ваше решение. Обратите внимание — команда поддержки не отвечает на вопросы по коду, но поможет разобраться с заданием или выводом тестов
- Мы отвечаем на сообщения в течение 2-3 дней. К «Обсуждениям» могут подключаться и другие студенты. Возможно, получится решить вопрос быстрее!
Подробнее о том, как задавать вопросы по уроку
Python для циклов: руководство для детей
Когда мы пишем программы, мы реализуем алгоритмы для представления задач и решения проблем. Алгоритмы обычно состоят из секвенирования, выбора и итерации. Последовательность — это порядок выполнения команд, а выбор определяет, какие задачи должны выполняться в зависимости от конкретных условий. Итерация позволяет нам повторять команды, а также полезна при работе со списками и строками. Один из способов повторения команд в Python — использование цикла for. Давайте посмотрим, как работает цикл for Python и как мы можем использовать его в наших программах.
Узнайте все о Python с помощью отмеченного наградами живого онлайн-курса под руководством эксперта, разработанного профессионалами из Google, Стэнфорда и Массачусетского технологического института.
Как использовать Python для циклов
Цикл for используется для перебора последовательности, будь то список, строка или диапазон значений. Мы можем использовать цикл for для выполнения набора операторов для каждого элемента в списке, буквы в строке или значения в диапазоне значений.
Общий синтаксис цикла for:
Начнем с написания ключевого слова for, за которым следует имя переменной, которую мы хотим использовать для ссылки на каждый элемент, который мы просматриваем. Затем мы записываем ключевое слово, за которым следует имя списка или строки, которую мы хотим пройти. Оператор двоеточия ( : ) используется для указания блока кода с отступом.
Код, который мы хотим выполнить, находится под заголовком цикла for. Этот код выполняется один раз для каждого элемента в списке или строке, которую мы просматриваем.
Давайте используем цикл for для обхода списка имен. Мы можем печатать каждое имя по мере прохождения списка.
В этом цикле for мы печатаем каждое имя из списка имен. Когда мы запускаем наш код, мы видим каждое отображаемое имя.
Строки представляют собой последовательность символов. Это означает, что мы можем использовать цикл for для перебора букв в строке. Например, давайте напечатаем каждую букву в строке «Программирование — это весело», используя цикл for следующим образом:
Когда мы запускаем этот код, мы видим, что каждый символ отображается в отдельной строке.
Иногда нам может понадобиться остановить цикл до того, как он просмотрит все элементы списка. Мы можем использовать оператор break, чтобы остановить цикл, когда будет найден определенный элемент.
Например, если мы хотим напечатать каждое имя, пока не дойдем до «Ava», мы можем использовать оператор break внутри оператора if, чтобы проверить, является ли имя «Ava», и разорвать цикл, если это правда. Мы прекращаем поиск в остальной части списка, когда находим «Аву».
Когда мы запускаем этот код, мы видим, что печатаются «Миа», «Лука» и «Ава». Остальные элементы в списке имен не печатаются.
Что, если мы поменяем порядок этих утверждений?
Если мы напечатаем после оператора if, то будут напечатаны только «Миа» и «Лука». Оператор break выходит из цикла до достижения функции печати.
Python также имеет оператор continue, который мы можем использовать, чтобы остановить текущую итерацию цикла и перейти к следующей. Например, если мы находим определенное имя в списке, мы можем перейти к следующему имени в списке, а не печатать его.
«Изабелла» не печатается после «Джейден», поскольку оператор continue останавливает текущую итерацию цикла, пропуская функцию печати.
Цикл for можно использовать для повторения блока кода заданное количество раз с помощью функции range(). Функция range() по умолчанию возвращает последовательность чисел, начинающуюся с 0. По умолчанию он увеличивает значение на 1 и останавливается на указанном числе.
Обратите внимание, что функция range() повторяется до указанного числа, но не включает его.
Мы можем указать значение, с которого должна начинаться функция range(), добавив параметр. Первый параметр указывает значение, с которого нужно начать, а второй параметр указывает значение, на котором необходимо остановиться.
Наконец, мы также можем изменить степень увеличения значения, добавив третий параметр в функцию range(). По умолчанию он увеличивается на 1, но мы можем изменить его, чтобы увеличить на другую величину. Первый параметр указывает значение, с которого нужно начать, второй параметр указывает значение, на котором следует остановиться, а третий параметр указывает, на сколько увеличить.
Когда у нас есть несколько списков, которые мы хотим просмотреть одновременно, мы можем использовать вложенные циклы for. Вложенный цикл — это цикл внутри другого цикла. Внутренний цикл завершит все свои итерации, прежде чем перейти к следующей итерации внешнего цикла.
Использование циклов for в Python
Цикл for — это мощный инструмент для повторения блока кода и работы со списками и строками. Циклы составляют фундаментальный строительный блок для написания алгоритмов и упрощения нашего кода. Вы можете узнать больше о различных способах использования циклов for в нашем отмеченном наградами онлайн-курсе Python для искусственного интеллекта и лагерях Python, разработанных профессионалами из Google, Стэнфорда и Массачусетского технологического института! Присоединяйтесь к нашему бесплатному классу Python, чтобы начать работу с интерактивным руководством эксперта.
Автор Джамила Коккиола, которая всегда была очарована технологиями и их влиянием на мир. Технологии, которые появились, когда она училась в старшей школе, показали ей все способы использования программного обеспечения для соединения людей, поэтому она научилась программировать, чтобы создавать свои собственные! Она сделала карьеру в разработке программного обеспечения и приложений, прежде чем решила стать учителем, чтобы помочь ученикам увидеть важность, преимущества и удовольствие от компьютерных наук.
Python While Loop (учебник с примерами)
Циклы используются для повторного выполнения кода до тех пор, пока не будет выполнено желаемое условие. В этом уроке вы узнаете о цикле Python while
.
Пока цикл: Введение |
Пока цикл: Синтаксис |
Пока цикл: блок-схема |
Бесконечный цикл while |
Пример цикла |
Оператор if и цикл while |
В Python есть только два типа циклов.
- Пока цикл
- Для петли
Циклы бывают бесконечными или условными. Цикл Python в то время как
продолжает повторять блок кода, определенный внутри него, до тех пор, пока не будет выполнено желаемое условие.
Цикл while
содержит логическое выражение, и код внутри цикла выполняется многократно, пока логическое выражение истинно.
Цикл в Python — Синтаксис
в то время как (выражение) оператор(ы)
Как видно из синтаксиса, цикл while
выполняется до тех пор, пока логическое выражение не вернет TRUE
. Операторы, которые выполняются внутри while, могут быть одной строкой кода или блоком из нескольких операторов.
Блок-схема цикла while Python
Важно отметить, что цикл while
контролируется входом, что означает, что цикл никогда не будет выполняться, а
0062, а цикл пропускается, если начальный тест возвращает FALSE
.
Например, следующий код внутри цикла while никогда не будет выполнен, потому что первоначальный тест вернет FALSE
.
я = 5 в то время как (я > 8): print('Это цикл while') i++
Здесь в этой программе , а цикл
не будет выполняться, потому что в начальном тесте i > 8
вернет FALSE
, так как значение i
равно 5.
Бесконечный цикл while в Python
Хотя цикл пропускается, если начальный тест возвращает FALSE
, он также всегда повторяется бесконечно, если выражение всегда возвращает TRUE
.
Например, цикл while
в следующем коде никогда не выйдет из цикла, а цикл while
будет повторяться вечно.
я = 5 в то время как (я = 5): print('Бесконечный цикл')
В этом примере значение i
всегда будет 5, поэтому выражение всегда будет возвращать ИСТИНА
, что приводит к повторению , в то время как
зацикливается бесконечно. Программа никогда не остановится и будет продолжать печатать «бесконечный цикл» вечно.
#программа для отображения от 1 до 9 я = 1 в то время как (я < 10): печать (я) i = i+1
Вывод
Эта программа сначала проверит, меньше ли значение i
10 или нет. Если это TRUE
, затем будет напечатано значение i
, а значение i
будет увеличено на 1. Этот процесс будет повторяться до тех пор, пока значение i
не станет меньше 10, т.е. 9.
Следовательно, он будет генерировать следующий вывод.
1 2 2 4 5 6 7 8 9Python: использование оператора If с циклом while
До сих пор мы обсуждали повторение блока кода в цикле в то время как
до тех пор, пока не будет выполнено условие.
Что, если мы хотим наложить другое условие внутри цикла while и выйти из цикла while, даже не выполняя условие в выражении цикла while?
Для этого мы можем использовать оператор if else
для проверки условия и break
ключевое слово, чтобы выйти из цикла while
, даже не завершая выражение в цикле while
.
Вот пример, иллюстрирующий это.
а = 1 б = 1 пока (а<10): печать («Итерация», а) а = а + 1 б = б + 1 если (б == 4): сломать print('Пока цикл завершен')
Вывод
Этот скрипт выдаст следующий вывод.
Итерация 1 Итерация 2 Итерация 3 Цикл while завершен
Объяснение
В приведенной выше программе цикл while
должен повторяться 9 раз, пока значение a
не станет меньше 10.
В первых трех итерациях 6 3 0 9 0 9 2 Итерация 2 и Итерация 3
печатается в консоли.
До этого момента значение a
и b
равно 3, поэтому оператор if
не выполняется. После 3-й итерации значение a
и b
становится равным 4, а выражение в if оператор
возвращает TRUE
, запуская оператор break
, поскольку значение b
равно 4.