Как добавить 2 условия в цикл
Перейти к содержимому

Как добавить 2 условия в цикл

  • автор:

Цикл while с двойным условием в python

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

number = int(input('Введите число: ')) while number >= 10 and number  

Отслеживать
задан 22 апр 2020 в 12:07
21 1 1 серебряный знак 2 2 бронзовых знака
А как число может быть одновременно больше 10 и меньше 0?
22 апр 2020 в 12:10

Я просто не нашел другого способа как заставить ввести число от 1 до 9 включительно) Как одновременно исключить ноль, отрицательные числа, 10 и то что больше 10

22 апр 2020 в 12:18

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Очевидно, что число не может быть одновременно больше 10 и меньше 0. Замените and на or .

Предположим, что number равно 15. Тогда имеем следующее:

По таблице истинности True AND False дает False, поэтому в цикл не попадает. То же самое, если число меньше 0.

А вот True OR False как раз дает True и выполнение заходит в цикл.

Отслеживать
ответ дан 22 апр 2020 в 12:10
26.7k 7 7 золотых знаков 32 32 серебряных знака 49 49 бронзовых знаков

Все стало работать) Но честно говоря непонятно почему это работает если именно and делает так, чтобы соблюдались оба условия, а or одно из них

22 апр 2020 в 12:17

Именно потому так и работает. Если and, что number должно быть больше 10 И ОДНОВРЕМЕННО меньше 0. А если or, то больше 10 ИЛИ меньше 0.

22 апр 2020 в 12:19
я немного дополнил объяснение.
22 апр 2020 в 12:44

Для большей понятности можно обратить условие, написав отрицание через not и взяв в скобки верное условие:

while not (number >= 1 and number  

Т.е. цикл будет выполняться, пока не выполнилось искомое условие, что число "от 1 до 9 включительно".

P.S. Есть три отрезка, которым может принадлежать проверяемое число:

  • Числа < 1
  • Числа от 1 до 9
  • Числа > 9

Число может принадлежать одному из этих отрезков. Когда вы проверяете число на принадлежность отрезку [1,9] вы можете писать условия через и/and , потому что это один отрезок но когда вы проверяете, что число находится в одном из двух разных отрезков (меньше 1 либо, больше 9) вы не можете использовать и/and , а только или/or - это два разных отрезка, число не может принадлежать сразу и тому отрезку и другому.

Как сделать цикл for с двумя условиями?

Начал изучать js и столкнулся с такой проблемой - цикл for с двумя условиями. То есть надо, чтобы цикл итерировался одновременно с двумя условиями и можно ли при этом использовать "логическое И(&&)?

Суть задачи: x = 15, x12. Надо вывести в консоль x и y.
Знаю, что ничего не выйдет, но нужно именно сама суть for с двумя условиями.

Составил такой код, но не понимаю, почему он не работает:

for (let x=15; x12; y++)
  • Вопрос задан более года назад
  • 908 просмотров

3 комментария

Простой 3 комментария

Циклы while и for

При написании скриптов зачастую встаёт задача сделать однотипное действие много раз.

Например, вывести товары из списка один за другим. Или просто перебрать все числа от 1 до 10 и для каждого выполнить одинаковый код.

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

Циклы for…of и for…in

Небольшое объявление для продвинутых читателей.

В этой статье рассматриваются только базовые циклы: while , do..while и for(..;..;..) .

Если вы пришли к этой статье в поисках других типов циклов, вот указатели:

  • См. for…in для перебора свойств объекта.
  • См. for…of и Перебираемые объекты для перебора массивов и перебираемых объектов.

В противном случае, продолжайте читать.

Цикл «while»

Цикл while имеет следующий синтаксис:

while (condition) < // код // также называемый "телом цикла" >

Код из тела цикла выполняется, пока условие condition истинно.

Например, цикл ниже выводит i , пока i < 3 :

let i = 0; while (i < 3) < // выводит 0, затем 1, затем 2 alert( i ); i++; >

Одно выполнение тела цикла по-научному называется итерация. Цикл в примере выше совершает три итерации.

Если бы строка i++ отсутствовала в примере выше, то цикл бы повторялся (в теории) вечно. На практике, конечно, браузер не позволит такому случиться, он предоставит пользователю возможность остановить «подвисший» скрипт, а JavaScript на стороне сервера придётся «убить» процесс.

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

Например, while (i) – более краткий вариант while (i != 0) :

let i = 3; while (i) < // когда i будет равно 0, условие станет ложным, и цикл остановится alert( i ); i--; >

Фигурные скобки не требуются для тела цикла из одной строки

Если тело цикла состоит лишь из одной инструкции, мы можем опустить фигурные скобки :

let i = 3; while (i) alert(i--);

Цикл «do…while»

Проверку условия можно разместить под телом цикла, используя специальный синтаксис do..while :

do < // тело цикла >while (condition);

Цикл сначала выполнит тело, а затем проверит условие condition , и пока его значение равно true , он будет выполняться снова и снова.

let i = 0; do < alert( i ); i++; >while (i < 3);

Такая форма синтаксиса оправдана, если вы хотите, чтобы тело цикла выполнилось хотя бы один раз, даже если условие окажется ложным. На практике чаще используется форма с предусловием: while(…) .

Цикл «for»

Более сложный, но при этом самый распространённый цикл — цикл for .

Выглядит он так:

for (начало; условие; шаг) < // . тело цикла . >

Давайте разберёмся, что означает каждая часть, на примере. Цикл ниже выполняет alert(i) для i от 0 до (но не включая) 3 :

for (let i = 0; i < 3; i++) < // выведет 0, затем 1, затем 2 alert(i); >

Рассмотрим конструкцию for подробней:

часть
начало let i = 0 Выполняется один раз при входе в цикл
условие i < 3 Проверяется перед каждой итерацией цикла.
Если оно вычислится в false , цикл остановится.
тело alert(i) Выполняется снова и снова, пока условие вычисляется в true .
шаг i++ Выполняется после тела цикла на каждой итерации перед проверкой условия.

В целом, алгоритм работы цикла выглядит следующим образом:

Выполнить начало → (Если условие == true → Выполнить тело, Выполнить шаг) → (Если условие == true → Выполнить тело, Выполнить шаг) → (Если условие == true → Выполнить тело, Выполнить шаг) → . 

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

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

Вот в точности то, что происходит в нашем случае:

// for (let i = 0; i < 3; i++) alert(i) // Выполнить начало let i = 0; // Если условие == true → Выполнить тело, Выполнить шаг if (i < 3) < alert(i); i++ >// Если условие == true → Выполнить тело, Выполнить шаг if (i < 3) < alert(i); i++ >// Если условие == true → Выполнить тело, Выполнить шаг if (i < 3) < alert(i); i++ >// . конец, потому что теперь i == 3

Встроенное объявление переменной

В примере переменная счётчика i была объявлена прямо в цикле. Это так называемое «встроенное» объявление переменной. Такие переменные существуют только внутри цикла.

for (let i = 0; i < 3; i++) < alert(i); // 0, 1, 2 >alert(i); // ошибка, нет такой переменной

Вместо объявления новой переменной мы можем использовать уже существующую:

let i = 0; for (i = 0; i < 3; i++) < // используем существующую переменную alert(i); // 0, 1, 2 >alert(i); // 3, переменная доступна, т.к. была объявлена снаружи цикла

Пропуск частей «for»

Любая часть for может быть пропущена.

Для примера, мы можем пропустить начало если нам ничего не нужно делать перед стартом цикла.

let i = 0; // мы уже имеем объявленную i с присвоенным значением for (; i < 3; i++) < // нет необходимости в "начале" alert( i ); // 0, 1, 2 >

Можно убрать и шаг :

let i = 0; for (; i

Это сделает цикл аналогичным while (i < 3) .

А можно и вообще убрать всё, получив бесконечный цикл:

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

Прерывание цикла: «break»

Обычно цикл завершается при вычислении условия в false .

Но мы можем выйти из цикла в любой момент с помощью специальной директивы break .

Например, следующий код подсчитывает сумму вводимых чисел до тех пор, пока посетитель их вводит, а затем – выдаёт:

let sum = 0; while (true) < let value = +prompt("Введите число", ''); if (!value) break; // (*) sum += value; >alert( 'Сумма: ' + sum );

Директива break в строке (*) полностью прекращает выполнение цикла и передаёт управление на строку за его телом, то есть на alert .

Вообще, сочетание «бесконечный цикл + break » – отличная штука для тех ситуаций, когда условие, по которому нужно прерваться, находится не в начале или конце цикла, а посередине или даже в нескольких местах его тела.

Переход к следующей итерации: continue

Директива continue – «облегчённая версия» break . При её выполнении цикл не прерывается, а переходит к следующей итерации (если условие все ещё равно true ).

Её используют, если понятно, что на текущем повторе цикла делать больше нечего.

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

for (let i = 0; i < 10; i++) < // если true, пропустить оставшуюся часть тела цикла if (i % 2 == 0) continue; alert(i); // 1, затем 3, 5, 7, 9 >

Для чётных значений i , директива continue прекращает выполнение тела цикла и передаёт управление на следующую итерацию for (со следующим числом). Таким образом alert вызывается только для нечётных значений.

Директива continue позволяет избегать вложенности

Цикл, который обрабатывает только нечётные значения, мог бы выглядеть так:

for (let i = 0; i < 10; i++) < if (i % 2) < alert( i ); >>

С технической точки зрения он полностью идентичен. Действительно, вместо continue можно просто завернуть действия в блок if .

Однако мы получили дополнительный уровень вложенности фигурных скобок. Если код внутри if более длинный, то это ухудшает читаемость, в отличие от варианта с continue .

Нельзя использовать break/continue справа от оператора „?“

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

Например, если мы возьмём этот код:

if (i > 5) < alert(i); >else

…и перепишем его, используя вопросительный знак:

(i > 5) ? alert(i) : continue; // continue здесь приведёт к ошибке

…то будет синтаксическая ошибка.

Это ещё один повод не использовать оператор вопросительного знака ? вместо if .

Метки для break/continue

Бывает, нужно выйти одновременно из нескольких уровней цикла сразу.

Например, в коде ниже мы проходимся циклами по i и j , запрашивая с помощью prompt координаты (i, j) с (0,0) до (2,2) :

for (let i = 0; i < 3; i++) < for (let j = 0; j < 3; j++) < let input = prompt(`Значение на координатах ($,$)`, ''); // Что если мы захотим перейти к Готово (ниже) прямо отсюда? > > alert('Готово!');

Нам нужен способ остановить выполнение, если пользователь отменит ввод.

Обычный break после input лишь прервёт внутренний цикл, но этого недостаточно. Достичь желаемого поведения можно с помощью меток.

Метка имеет вид идентификатора с двоеточием перед циклом:

labelName: for (. )

Вызов break в цикле ниже ищет ближайший внешний цикл с такой меткой и переходит в его конец.

outer: for (let i = 0; i < 3; i++) < for (let j = 0; j < 3; j++) < let input = prompt(`Значение на координатах ($,$)`, ''); // если пустая строка или Отмена, то выйти из обоих циклов if (!input) break outer; // (*) // сделать что-нибудь со значениями. > > alert('Готово!');

В примере выше это означает, что вызовом break outer будет разорван внешний цикл до метки с именем outer .

Таким образом управление перейдёт со строки, помеченной (*) , к alert('Готово!') .

Можно размещать метку на отдельной строке:

outer: for (let i = 0; i

Директива continue также может быть использована с меткой. В этом случае управление перейдёт на следующую итерацию цикла с меткой.

Метки не позволяют «прыгнуть» куда угодно

Метки не дают возможности передавать управление в произвольное место кода.

Например, нет возможности сделать следующее:

break label; // не прыгает к метке ниже label: for (. )

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

label: < // . break label; // работает // . >

…Хотя в 99.9% случаев break используется внутри циклов, как мы видели в примерах выше.

К слову, continue возможно только внутри цикла.

Итого

Мы рассмотрели 3 вида циклов:

  • while – Проверяет условие перед каждой итерацией.
  • do..while – Проверяет условие после каждой итерации.
  • for (;;) – Проверяет условие перед каждой итерацией, есть возможность задать дополнительные настройки.

Чтобы организовать бесконечный цикл, используют конструкцию while (true) . При этом он, как и любой другой цикл, может быть прерван директивой break .

Если на данной итерации цикла делать больше ничего не надо, но полностью прекращать цикл не следует – используют директиву continue .

Обе этих директивы поддерживают метки, которые ставятся перед циклом. Метки – единственный способ для break/continue выйти за пределы текущего цикла, повлиять на выполнение внешнего.

Заметим, что метки не позволяют прыгнуть в произвольное место кода, в JavaScript нет такой возможности.

Программирование в "Эврике"

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

В следующей программе цикл while используется подобно циклу for для вывода на экран всех чисел от 1 до 10:

i=1 while i

В этой программе переменной i присваивается значение 1. Затем начинается цикл (ключевое слово while ) с проверяемым условием i

Как только проверяемое условие станет ложно (это произойдет, когда переменная i станет равна 11), цикл завершит работу и управление будет передано следующей инструкции после блока цикла. Поэтому после завершения цикла переменная i будет иметь значение 11.

В общем виде синтаксис цикла с условием в языке Питон такой:

while условие: инструкция 1 инструкция 2 . инструкция n 
  1. Условие, определяющее, будет ли выполняться тело цикла. Это условие записывается после слова while и может быть произвольным арифметическим выражением, в котором должен быть хотя бы один из операторов == , != , < , >, = и могут использоваться логические операторы and , or , not . После условия ставится двоеточие.
  2. Тело цикла, состоящее из одной или нескольких инструкций, записанных с отступом одинаковой величины.
  3. Инструкции, изменяющие значения переменных, входящих в проверяемое условие. В рассмотренном примере это инструкция i=i+1 . Если бы этой инструкции не было, то значение переменной i не менялось бы и проверяемое условие всегда было бы истинным, что привело бы к бесконечному циклу. Для прерывания работы программы, попавшей в бесконечный цикл, используется комбинация клавиш Ctrl+C .
n=input("Введите натуральное число") i=0 while 2**i

В этом примере переменная i внутри цикла увеличивается на 1, пока значение 2**i не превосходит n . После окончания цикла величина 2**i будет больше n , и соответствующее значение i будет напечатано на экране. Внутри цикла могут быть различные другие инструкции, в том числе инструкции if , while и for . В этом случае говорят о вложенных циклах, или об условной инструкции, вложенной в цикл. Тело вложенного цикла выделяется от цикла, в который оно вложено, большей величиной отступа. Рассмотрим два примера. В первом примере программа печатает на экран все натуральные делители данного натурального числа n . Для этого используется цикл, в котором переменная i меняется от 1 до n , а внутри цикла проверяется условие, и если остаток от деления n на i равен 0, то печатается значение i :

n=input("Введите число, для которого необходимо вывести делители") i=1 while i

В следующем примере на экран печатается таблица умножения всех однозначных чисел. Для этого организовано два цикла: в одном переменная i меняется от 1 до 9, внутри этого цикла (то есть при каждом новом значении i ) переменная j также меняется от 1 до 9. В блоке вложенного цикла на экран печатаются значения переменных i , j и их произведение:

i=1 while i for i in range(1,10): for j in range(1,10): print i, "*", j, " heading">Инструкции управления циклом 

В циклах while и for можно использовать две инструкции, управляющие циклом.

Инструкция break прерывает выполнение цикла. Управление передается на следующую инструкцию после тела цикла.

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

Например, допустим, что нам необходимо перебрать в цикле все натуральные числа, меньшие n и не делящиеся на 3. Для этого можно перебрать все числа, проверить их остаток от деления на 3, и если число делится на 3, выполнить инструкцию continue, которая пропустит оставшиеся до конца цикла инструкции и перейдет к следующему числу:

for in range(n): if i%3==0: continue print i # а далее выполняем прочие необходимые действия

Инструкции break и continue следует использовать только внутри условных инструкций. Безусловные инструкции break и continue , как правило, бессмысленны. Также в циклах while и for можно указать else -блок после основного блока цикла. else -блок в циклах выполняется один раз после завершения работы цикла, но только в случае, если цикл не был прерван инструкцией break . Поясним это на программе, которая по введенному целому числу n>1 определяет, является ли оно простым или составным.

n=input("Введите целое число, больше 1 ") # 1 Считали число n for d in range(2, n): # 2 d меняется от 2 до n-1 if n % d == 0: # 3 Проверка: n делится на d? print n, "имеет делитель", d # 4 break # 5 Завершаем цикл for else: # 6 Это else-блок цикла print n, "простое число" # 7

Поясним эту программу. После ввода с клавиатуры числа n в программе организовывается цикл по переменной d , принимающей значения от 2 до n-1 (строка 2). Далее в теле цикла проверяется, является ли d делителем n (строка 3). Если является делителем, то на экран выводится соответствующее сообщение (строка 4) и при помощи инструкции break завершается выполнение цикла (строка 5). После тела цикла for идет else -блок. То, что инструкция else (строка 6) относится к циклу for (строка 2), а не к инструкции if (строка 3), определяется по величине отступа перед инструкцией else : отступ перед ней такой же, как и перед инструкцией for . Поэтому если цикл не был прерван инструкцией break , то есть для числа n не будет найден нетривиальный делитель, то будет выполнен else -блок, то есть на экран будет напечатано сообщение о том, что n — простое число (строка 7).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *