Как заменить for на while: Замените for на while

Содержание

Интерактивный учебник языка Python

1. Цикл while

Цикл while (“пока”) позволяет выполнить одну и ту же последовательность действий, пока проверяемое условие истинно. Условие записывается до тела цикла и проверяется до выполнения тела цикла. Как правило, цикл while используется, когда невозможно определить точное значение количества проходов исполнения цикла.

Синтаксис цикла while в простейшем случае выглядит так:

while условие:
    блок инструкций

При выполнении цикла while сначала проверяется условие. Если оно ложно, то выполнение цикла прекращается и управление передается на следующую инструкцию после тела цикла while. Если условие истинно, то выполняется инструкция, после чего условие проверяется снова и снова выполняется инструкция. Так продолжается до тех пор, пока условие будет истинно. Как только условие станет ложно, работа цикла завершится и управление передастся следующей инструкции после цикла.

Например, следующий фрагмент программы напечатает на экран квадраты всех целых чисел от 1 до 10. Видно, что цикл while может заменять цикл for ... in range(...):

	
i = 1
while i <= 10:
    print(i ** 2)
    i += 1

В этом примере переменная i внутри цикла изменяется от 1 до 10. Такая переменная, значение которой меняется с каждым новым проходом цикла, называется счетчиком. Заметим, что после выполнения этого фрагмента значение переменной i будет равно 11, поскольку именно при i == 11 условие i <= 10 впервые перестанет выполняться.

Вот еще один пример использования цикла while для определения количества цифр натурального числа n:

5678
n = int(input())
length = 0
while n > 0:
    n //= 10  # это эквивалентно n = n // 10
    length += 1
print(length)

В этом цикле мы отбрасываем по одной цифре числа, начиная с конца, что эквивалентно целочисленному делению на 10 (

n //= 10), при этом считаем в переменной length, сколько раз это было сделано.

В языке Питон есть и другой способ решения этой задачи: length = len(str(i)).

2. Инструкции управления циклом

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

	
i = 1
while i <= 10:
    print(i)
    i += 1
else:
    print('Цикл окончен, i =', i)

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

else исполняться не будет. Разумеется, инструкцию break осмыленно вызывать только внутри инструкции if, то есть она должна выполняться только при выполнении какого-то особенного условия.

Приведем пример программы, которая считывает числа до тех пор, пока не встретит отрицательное число. При появлении отрицательного числа программа завершается. В первом варианте последовательность чисел завершается числом 0 (при считывании которого надо остановиться).

3
6
-1
4
0
a = int(input())
while a != 0:
    if a < 0:
        print('Встретилось отрицательное число', a)
        break
    a = int(input())
else:
    print('Ни одного отрицательного числа не встретилось')
Во втором варианте программы сначала на вход подается количество элементов последовательности, а затем и сами элементы. В таком случае удобно воспользоваться циклом for. Цикл for также может иметь ветку
else
и содержать инструкции break внутри себя.
3
6
2
4
n = int(input())
for i in range(n):
    a = int(input())
    if a < 0:
        print('Встретилось отрицательное число', a)
        break    
else:
    print('Ни одного отрицательного числа не встретилось')

Другая инструкция управления циклом — continue (продолжение цикла). Если эта инструкция встречается где-то посередине цикла, то пропускаются все оставшиеся инструкции до конца цикла, и исполнение цикла продолжается со следующей итерации.

Если инструкции break и continue содержатся внутри нескольких вложенных циклов, то они влияют лишь на исполнение самого внутреннего цикла. Вот не самый интеллектуальный пример, который это демонстрирует:
	
for i in range(3):
    for j in range(5):
        if j > i:
            break
        print(i, j)
Увлечение инструкциями break и
continue
не поощряется, если можно обойтись без их использования. Вот типичный пример плохого использования инструкции break (данный код считает количество знаков в числе).
567
n = int(input())
length = 0
while True:
    length += 1
    n //= 10
    if n == 0:
        break
print('Длина числа равна', length)
Гораздо лучше переписать этот цикл так:
567
n = int(input())
length = 0
while n != 0:
    length += 1
    n //= 10
print('Длина числа равна', length)
Впрочем, на Питоне можно предложить и более изящное решение:
567
n = int(input())
print('Длина числа равна', len(str(n)))

3. Множественное присваивание В Питоне можно за одну инструкцию присваивания изменять значение сразу нескольких переменных. Делается это так: Этот код можно записать и так: Отличие двух способов состоит в том, что множественное присваивание в первом способе меняет значение двух переменных одновременно.

Если слева от знака «=» в множественном присваивании должны стоять через запятую имена переменных, то справа могут стоять произвольные выражения, разделённые запятыми. Главное, чтобы слева и справа от знака присваивания было одинаковое число элементов.

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

	
a = 1
b = 2
tmp = a
a = b
b = tmp
print(a, b)  
# 2 1
В Питоне то же действие записывается в одну строчку:
	
a = 1
b = 2
a, b = b, a
print(a, b)  
# 2 1

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

Kotlin. Циклы for, while, do-while, forEach, repeat()

Статья проплачена кошками — всемирно известными производителями котят.

Если статья вам понравилась, то можете поддержать проект.

for

Цикл for в Kotlin имеет другой синтаксис. Применим в тех случаях, когда есть итератор — массив, Map и т.д. Стандартный вариант, когда нужно пробежаться по заданному числу элементов, описывается следующим образом.


for(i in 1..5){
    println(i)
}

Оператор in и его брат !in проверяют вхождение или отсутствие вхождения в диапазон.

В выражении 1..5 мы указываем диапазон от 1 до 5 (пять входит в диапазон). Переменная последовательно примет значение


1
2
3
4
5

Диапазон можно заменить переменной.


val range = 1..5
for(i in range){
    println("Элемент $i")
}

Вместо диапазона можно указать массив.


val cats = arrayListOf<String>()
cats.add("Мурзик")
cats.add("Васька")
cats.add("Барсик")
    
for(cat in cats){
    println("Кот $cat")
}

// Результат
Кот Мурзик
Кот Васька
Кот Барсик

Этот же пример можно переписать, используя индекс:


for (index in cats.indices){
    println("Кот ${cats[index]}")
}

Проверим, является ли символ не цифрой.


fun isNotDigit(c: Char) = c !in '0'..'9'

println(isNotDigit('3')) // false, это всё-таки цифра

С помощью index, element и withIndex() можно получить индекс и его значение в массиве.


val cats = arrayListOf("Barsik", "Murzik", "Vaska")
for( (index, element) in cats.withIndex()){
    println("$index: $element")
}

Получим.


0: Мурзик
1: Васька
2: Барсик

А как быть с вариантами, когда нужно счётчик не увеличивать на единицу, а уменьшать на 2? Используем ключевые слова

downTo и step.


for(i in 10 downTo 1 step 2){
    print("$i ")
}
// выводит: 10 8 6 4 2

Без указания шага значения будут уменьшаться на единицу.


for(i in 10 downTo 1){
    print("$i ")
}

// 10 9 8 7 6 5 4 3 2 1 

for (letter in 'Z' downTo 'A') print(letter)
// ZYXWVUTSRQPONMLKJIHGFEDCBA

Очень часто в циклах встречается выражение size-1, чтобы не выйти за пределы массива. Можно заменить на until.


for(i in 0..cats.size - 1){
    println(cats[i])
}
    
for(i in 0 until cats.size){
    println(cats[i])
}

Хотим выйти из цикла при достижении какого-то значения.


for (i in 1..5) {
    println(i)
	// прекращаем перебор, когда достигнем значения 3
    if (i == 3)
        break
}

// Получим
1
2
3

Ключевое слово continue позволяет продолжить перебор, при этом можно что-то сделать во время перебора, например, мяукнуть. Число 5 при этом не выводится.


println("For loop 1 to 10 continue if number is 5")
for (i in 1..10) {
    if (i == 5) {
        println("Meow")
        continue
    }
    println(i)
}

// Результат
For loop 1 to 10 continue if number is 5
1
2
3
4
Meow
6
7
8
9
10

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

Часто используют два цикла for. Простейший вариант.


// первый цикл
for(x in 1..3){
    // второй вложенный цикл
    for(y in 1..3){
        print("$x $y \n")
    }
}

// результат
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3

Если мы хотим досрочно прервать на каком-то этапе цикл, то можем добавить аннотацию

outerLoop@ к первому циклу и внутри второго цикла вызвать break@outerLoop. Как только значения станут равными (2 2), цикл завершится досрочно.


// первый цикл
outerLoop@ for (x in 1..3) {
    // второй вложенный цикл
    for (y in 1..3) {
        print("$x $y \n")
        if (x == 2 && y == 2)
            break@outerLoop
    }
}

// результат
1 1
1 2
1 3
2 1
2 2

forEach

Пройтись по всем элементам коллекции.


val daysOfWeek = listOf("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday")
daysOfWeek.forEach{
    println(it)
}

repeat()

Встроенная функция для повторения команд заданное число раз.


repeat(3){
    println("Васька! Иди жрать!")
}

while

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


var i = 1
while (i 

Обратите внимание, что внутри цикла мы получим числа от 0 до 8, но если проверить, чему равно значение переменной после цикла, то увидим, что оно больше.

Прервать цикл можно через break.


var i = 1
while (i 

do-while

Выполняем какую-то работу, пока выполняется какое-то условие — выводим число, которое увеличивается на единицу, пока число меньше 10.


var i = 1
do {
    println(i)
    i++
} while (i 

Можно прервать цикл через break. Когда число станет равным 5, цикл прекратится.


var i = 1

do {
    println(i)
    if (i == 5)
        break
    i++
} while (i 

Дополнительные материалы

for для строки

Реклама

заменить фразу — Translation into English — examples Russian

Suggestions: предлагает заменить фразу

These examples may contain rude words based on your search.

These examples may contain colloquial words based on your search.

Во втором предложении заменить фразу «ликвидация нищеты» фразой «искоренение нищеты и голода».

In the second sentence, replace the words «poverty eradication» with the words «the eradication of poverty and hunger».

В подпункте (а) заменить фразу «другим совещаниям» фразой «другим соответствующим совещаниям».

In subparagraph (a), replace the words «other meetings» with the words «other relevant meetings».

В пункте 35 заменить фразу «о расширении использования платных автодорог» фразой «о введении платы за пользование автодорогами».

In Paragraph 35, replace the phrase «an enlarged use of toll roads» with the following: «the introduction of road pricing».

Было предложено заменить фразу «выделить достаточно времени» формулировкой «приложить необходимые усилия, чтобы обеспечить условия для проведения процедур УСО».

A suggestion was made to replace the phrase «to make available sufficient time» with the phrase «to apply appropriate diligence to enable ODR proceedings».

В последнем предложении заменить фразу «редакторам международных новостей» фразой «заинтересованным средствам массовой информации».

In the last sentence, replace the words «international news editors» with the words «interested mass media».

Статья 7.2: в конце первого предложения заменить фразу «характеру и функциям Суда» на «критериям в этом вопросе, принятым Ассамблеей государств-участников в соответствии со статьей 116 Статута».

At the end of the first sentence, replace the words «the nature and functions of the Court» by «the criteria which the Assembly of States Parties may adopt on the subject in accordance with article 116 of the Statute».

В показателе достижения результатов (е) заменить фразу «Объем финансирования, обеспечиваемого» фразой «Число мероприятий Структуры «ООН-женщины» по мобилизации ресурсов».

In indicator of achievement (e), replace the words «Amount of funds secured through» with the words «Number of activities of UN-Women to mobilize resources from».

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

In the second sentence, replace the words «while taking into account intergovernmental discussions» with the words», in coordination with the national authorities of the affected State, as appropriate».

Во втором предложении заменить фразу «основой координирующей роли ЮНКТАД в работе, касающейся» фразой «основой работы ЮНКТАД».

In the second sentence, replace the words «the focal role of UNCTAD with regard to work concerning» with the words «UNCTAD’s work on».

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

In the third sentence, replace the words «multilateral principles and norms» with the words «multilaterally negotiated principles and norms».

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

In the second sentence, replace the words «substantive and technical support as well as political advice» with the words «substantive organizational and technical support».

р) пункт 1.14: заменить фразу «организационной и основной секретариатской поддержки многосторонним органам» фразой «основного и секретариатского обслуживания многосторонних органов»;

(p) Paragraph 1.14 Replace the words «organizational and substantive secretariat support» with «substantive and secretariat services»;

В показателе достижения результатов (d) в тексте заменить фразу «на основе рекомендации ЭСКЗА» фразой «при содействии ЭСКЗА по просьбе стран-членов».

In indicator of achievement (d), replace the phrase «based on ESCWA recommendations» with the phrase «with ESCWA assistance upon the request of member countries».

В ожидаемом достижении (с) заменить фразу «усиление приверженности стран ликвидации» фразой «усиление международной поддержки работы, способствующей ликвидации».

In expected accomplishment (c), replace the words «Strengthened commitment by countries to eliminate» with the words «Enhanced international support for efforts that contribute to eliminating».

В подпункте (а) после слова «соглашений» заменить фразу «об ограничении вооружений и разоружении» фразой «о разоружении и ограничении вооружений».

In subparagraph (a), after the word «multilateral», replace the phrase «arms limitation and disarmament» with the phrase «disarmament and arms limitation».

В первом предложении заменить фразу «Всемирной коалицией в интересах Африки» фразой «Всемирной коалицией в интересах Африки и Форумом по вопросам партнерских отношений с Африкой».

In the first sentence, replace the words «and the Global Coalition for Africa» with the words «the Global Coalition for Africa and the Africa Partnership Forum».

В подпункте (а) заменить фразу «политики в процессе развития» фразой «политики, укрепления институционального потенциала и регулятивных механизмов в процессе развития».

In item (a), replace the words «policies in the development process» with the words «policies, strengthened institutional capacities and regulatory framework in the development process».

Во втором предложении пункта 24.19(а) заменить фразу «в целях подготовки надлежащих предложений в отношении методов работы для рассмотрения соответствующими органами» фразой «в целях подготовки надлежащих предложений в отношении методов работы для рассмотрения заинтересованными органами».

In the second sentence of paragraph 24.19 (a), replace the words «with a view to developing appropriate proposals on the methods of work for review by the bodies concerned» with «to the bodies concerned».

В конце первого предложения заменить фразу «в деятельность по сбору средств для использования ИКТ в интересах социально-экономического развития» следующим текстом: «в деятельность, направленную на использование достижений науки и техники, особенно ИКТ, в интересах социально-экономического развития».

At the end of the first sentence, replace the phrase «fund-raising efforts aimed at harnessing ICT for socio-economic development» with the phrase, «efforts aimed at harnessing science and technology, particularly ICT, for socio-economic development».

Во второй строке слово «шести» заменить словом «пяти» и заменить фразу «Координации деятельности, связанной с разминированием, Миссии по поддержанию мира» фразой «Координации деятельности, связанной с разминированием».

In the first sentence, replace the word «six» with the word «five» and replace the words «Mine Action Coordination and Peacekeeping Missions» with the words «and Mine Action Coordination».

PowerShell: прощай, Goto | Windows IT Pro/RE

Когда более 30 лет назад в MS-DOS появились пакетные файлы, язык программирования BASIC был основным языком программирования для микрокомпьютеров. Оператор Goto используют в языке BASIC, чтобы упростить повторение строк кода, поэтому разработчики Microsoft добавили команду Goto к «языку» пакетных файлов с целью обеспечить функцию того же типа. В листинге 1 показан простой пакетный файл, в котором команда Goto используется для перехода к метке пакетного файла, чтобы повторить команду Echo пять раз.

Когда «язык» пакетных файлов был обновлен в Cmd.exe на платформе Windows NT, Microsoft усовершенствовала команду Call, чтобы метка в пакетном файле могла действовать как простая подпрограмма, аналогично старому оператору GOSUB в языке BASIC. В листинге 2 показан пример такого использования команды Call.

При выполнении пакетного файла в листинге 2 выводится фраза Hello, Ken, а затем End of batch file. Команда Call позволяет перейти к команде с меткой, а затем выполнение возвращается строке, следующей после команды Call. Кроме того, в подпрограммах пакетного файла нет встроенного способа передачи значений без переменных среды и неинтуитивных синтаксических приемов Cmd.exe.

Дело в том, что команды Goto и Call пакетного файла позволяют повторять строки кода, но это делается неструктурированным способом. То есть команда Goto или Call обеспечивает произвольный переход к любой метке в пакетном файле. Пакетный файл становится более сложным, использование Goto или Call в конечном итоге ведет к превращению кода в «спагетти», так как отслеживать логику пакетного файла становится все труднее.

Авторы PowerShell полностью обошли проблему «спагетти-кода». В PowerShell нет ни команды Goto, ни команды Call, потому что они не нужны. Вместо них в PowerShell появились структурированные программные инструкции, заменившие как Goto (для итерации), так и Call (для подпрограмм).

Итерации PowerShell

Итерация (или цикл) — это повторение кода. PowerShell располагает четырьмя базовыми операторами, которые повторяют выполнение строк кода в зависимости от условия: while, do while, do until и for. Четыре оператора, или конструкции цикла, фактически устраняют необходимость в команде Goto.

Когда в MS-DOS появились пакетные файлы, BASIC был основным языком программирования для микрокомпьютеров, и GOTO была незаменимой командой. К счастью, положение изменилось. Ниже показано, как while, do while, do until и for заменили традиционные команды в различных ситуациях.

Оператор While

Оператор while, или цикл while, повторяет строки кода, пока сохраняется истинность определенного условия. В листинге 3 показан пример сценария, в котором устанавливается переменная и выдается значение этой переменной при условии, что оно больше 0. Выходные данные сценария — числа 5, 4, 3, 2 и 1.

Код в скобках после ключевого слова while — условный оператор, который определяет, сколько раз выполняется код в фигурных скобках (известный как блок сценария, scriptblock). Когда вы используете цикл while, PowerShell проверяет условие в начале цикла. Выполните команду help about_While в PowerShell, чтобы получить больше информации и примеры цикла while.

Оператор Do

Оператор do, или цикл do, похож на оператор while; разница в том, что PowerShell проверяет условный оператор в конце цикла, а не в начале. Для цикла do требуется, чтобы в начале блока присутствовало ключевое слово while или until, поэтому мы обычно называем его циклом do while или do until. В листинге 4 показан тот же цикл, что и в листинге 3, реализованный в виде цикла do while.

В листинге 5 показан тот же цикл, что и в листингах 3 и 4, но реализованный в виде цикла do until. Ключевое слово until меняет логику цикла «повторять до тех пор, пока условие не станет истинным» вместо «повторять, пока условие истинно».

Единственная разница между циклами while, do while и do until — место проверки оператора условия (начало или конец цикла) и логика повторения (пока условие не нарушится или до его выполнения). Выполните команду help about_Do в PowerShell, чтобы получить больше информации и примеры циклов do while и do until.

Оператор For

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

В листинге 6 инструкция инициализации — $n = 5, инструкция условия — $n -ge 1, а инструкция повторения — $n-. Вывод листинга 6 точно такой же, как в листингах 3, 4 и 5. Выполните команду help about_For в PowerShell, чтобы получить больше информации и примеры цикла for.

Какой оператор использовать

Все четыре основных оператора итерации PowerShell (while, do while, do until и for) позволяют повторно выполнять код в зависимости от условия. Используйте тот оператор повторения, который позволяет получить более ясный программный код.

Оператор Foreach

Пользователям, более глубоко знающим PowerShell, известно об операторе foreach, или цикле foreach, который позволяет повторять команды для каждого элемента массива или коллекции объектов. Цикл foreach больше похож на команду For пакетного файла. В следующей статье я покажу, как можно заменить команду For пакетного файла в PowerShell.

Подпрограммы PowerShell

PowerShell не нуждается в команде Call или метках подпрограмм. Вместо этого в PowerShell применяются функции, как в других структурированных языках программирования. Функция — просто имя блока программного кода. Для запуска кода в функции просто вставьте имя функции в программу. В листинге 7 содержится простой пример как определения, так и выполнения функции PowerShell.

Ключевое слово function указывает PowerShell, что мы определяем функцию. Вставляя имя функции в программный код (как в последней строке листинга 7), PowerShell выполняет код внутри фигурных скобок.

Подпрограммы пакетного файла позволяют передавать параметры в подпрограмму с командой Call, и вы можете использовать подставляемые параметры в подпрограмме (%1 и т. д., как показано в листинге 2). Оператор param в верхней части функции позволяет сделать то же в PowerShell: он определяет параметры функции. Листинг 8 представляет собой расширенный вариант листинга 7 с параметром.

При выполнении программного кода в листинге 8 с параметром переменная $name в функции заменяется параметром, переданным из последней строки (строка «Ken»).

Напомню, что у подпрограмм пакетного файла нет собственного способа для возврата значений. Вывод функции в листинге 8 — собственно выходная строка. Кроме того, PowerShell без проблем возвращает несколько значений из функции; значения автоматически возвращаются списком (также именуемым массивом или коллекцией). В листинге 9 показана функция, которая возвращает список из трех чисел.

Таким образом, в PowerShell нет необходимости в командах Goto и Call. Циклические конструкции PowerShell (while, do while, do until и for) заменяют Goto, а функции заменяют команду Call. Если вы все еще создаете пакетные файлы, то эта статья поможет вам заменить команды Goto и Call в ваших будущих сценариях PowerShell.

Листинг 1. Пример пакетного файла Goto
@Echo Off
Set NUM=5
:REPEAT
Echo %NUM%
Set /A NUM-=1
If %NUM% GTR 0 Goto :REPEAT
Set NUM=
Листинг 2. Пакетный файл с подпрограммой
@Echo Off
Call :SAYHELLO Ken
Echo End of batch file
Goto :END
:SAYHELLO
Echo Hello, %1
:END
Листинг 3. Цикл while в PowerShell
$n = 5
while ( $n -gt 0 ) {
  $n
  $n--
}
Листинг 4. Цикл do while в PowerShell
$n = 5
do {
  $n
  $n--
} while ( $n -gt 0 )
Листинг 5. Цикл do until в PowerShell
$n = 5
do {
  $n
  $n--
} until ( $n -eq 0 )
Листинг 6. Цикл for в PowerShell
for ( $n = 5; $n -ge 1; $n-- ) {
  $n
}
Листинг 7. Простая функция PowerShell
function SayHello {
  "Hello, world"
}
# Run the function
SayHello
Листинг 8. Функция PowerShell с параметром
function SayHello {
  param($name)
  "Hello, $name"
}
# Run the function
SayHello Ken
Листинг 9. Функция PowerShell возвращает список
function MyFunction {
  $list = @(1,2,3)
  $list
}
$result = MyFunction
# Output the list
$result

Поделитесь материалом с коллегами и друзьями

Управляющие инструкции — Kotlin

Условное выражение

if

В языке Kotlin ключевое слово if является выражением, т.е. оно возвращает значение. Это позволяет отказаться от тернарного оператора (условие ? условие истинно : условие ложно), поскольку выражению if вполне по силам его заменить.

// обычное использование 
var max = a 
if (a < b) 
  max = b 
 
// с блоком else 
var max: Int
if (a > b) 
  max = a 
else 
  max = b 
 
// в виде выражения 
val max = if (a > b) a else b

«Ветви» выражения if могут содержать несколько строк кода, при этом последнее выражение является значением блока:

val max = if (a > b) { 
    print("возвращаем a") 
    a 
  } 
  else { 
    print("возвращаем b") 
    b 
  }

Если вы используете конструкцию if в качестве выражения (например, возвращая его значение или присваивая его переменной), то использование ветки else является обязательным.

См. использование if.

Условное выражение

when

Ключевое слово when призвано заменить оператор switch, присутствующий в C-подобных языках. В простейшем виде его использование выглядит так:

when (x) {
  1 -> print("x == 1")
  2 -> print("x == 2")
  else -> { // обратите внимание на блок
    print("x is neither 1 nor 2")
  }
}

Выражение when последовательно сравнивает аргумент со всеми указанными значениями до удовлетворения одного из условий. when можно использовать и как выражение, и как оператор. При использовании в виде выражения значение ветки, удовлетворяющей условию, становится значением всего выражения. При использовании в виде оператора значения отдельных веток отбрасываются. (В точности как if: каждая ветвь может быть блоком и её значением является значение последнего выражения блока.)

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

Если для нескольких значений выполняется одно и то же действие, то условия можно перечислять в одной ветке через запятую:

when (x) {
  0, 1 -> print("x == 0 or x == 1")
  else -> print("otherwise")
}

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

when (x) {
  parseInt(s) -> print("s encodes x")
  else -> print("s does not encode x")
}

Также можно проверять вхождение аргумента в интервал in или !in или его наличие в коллекции:

when (x) {
  in 1..10 -> print("x is in the range")
  in validNumbers -> print("x is valid")
  !in 10..20 -> print("x is outside the range")
  else -> print("none of the above")
}

Помимо этого Кotlin позволяет с помощью is или !is проверить тип аргумента. Обратите внимание, что благодаря умным приведениям вы можете получить доступ к методам и свойствам типа без дополнительной проверки:

val hasPrefix = when(x) {
  is String -> x.startsWith("prefix")
  else -> false
}

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

when {
  x.isOdd() -> print("x is odd")
  x.isEven() -> print("x is even")
  else -> print("x is funny")
}

Начиная с Kotlin 1.3 можно получать переменную внутри when условия по следующему синтаксису:

fun Request.getBody() =
        when (val response = executeRequest()) {
            is Success -> response.body
            is HttpError -> throw HttpException(response.status)
        }

Такая переменная, объявленная внутри условия when может быть видна только внутри тела этого when

См. использование when.

Циклы

for

Цикл for обеспечивает перебор всех значений, поставляемых итератором. Для этого используется следующий синтаксис:

for (item in collection)
  print(item)

Телом цикла может быть блок кода:

for (item: Int in ints) {
  // ...
}

Как отмечено выше, цикл for позволяет проходить по всем элементам объекта, имеющего итератор, например:

  • обладающего внутренней или внешней функцией iterator(), возвращаемый тип которой
    • обладает внутренней или внешней функцией next(), и
    • обладает внутренней или внешней функцией hasNext(), возвращающей Boolean.

Все три указанные функции должны быть объявлены как operator.

Если при проходе по массиву или списку необходим порядковый номер элемента, используйте следующий подход:

for (i in array.indices)
  print(array[i])

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

Также вы можете использовать библиотечную функцию withIndex:

for ((index, value) in array.withIndex()) {
    println("the element at $index is $value")
}

См. использование for.

Циклы

while

Ключевые слова while и do..while работают как обычно:

while (x > 0) {
  x--
}

do {
  val y = retrieveData()
} while (y != null) // y здесь доступно!

См. использование while.

Ключевые слова

break и continue в циклах

Kotlin поддерживает обычные операторы break и continue в циклах. См. Операторы перехода.

When, while – разница —

Разбираемся вместе

Эти слова в придаточных предложениях переводятся обычно одинаково. И все же между When и while разница в использовании существует. Давайте рассмотрим правильное употребление этих слов и примеры предложений с ними. Начнем мы с основных правил использования слова when, а затем перейдем к while.

When

Перевод: «когда»

When будет использоваться если:

  • Мы хотим показать, что одно действие происходит одновременно с другим действием. В данном случае может быть заменено и на while. В этом контексте when можно заменить фразами “during the time that” (в течение того времени, что…), “at the time that” (в то время, как…).

My cat always purrs when I pet him. – Мой кот кот всегда мурлычет, когда я его глажу.

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

I’ll go on a vacation, when I get some money. – Я отправлюсь в отпуск, когда получу деньги.

  • Говорим, что одно короткое действие происходит в то время, как длиться другое, или же прерывает то другое действие. В такие случаях длительное действие передается временем Continues, короткое временем группы Simple.

I was watching a movie when you called me. – Я смотрел фильм, когда ты мне позвонил.

While

Означает “в то время как”, “до тех пор пока”. В предложениях, как и when, может переводиться «когда», также переводится как «пока».

Используется, когда:

  • Мы говорим, что одно действие происходит в одно время с другим. Зачастую (но не всегда) используется с временами группы Continuous. Чтобы понять, когда мы можем заменить while на when, стоит обращать внимание на контекст. Часто помогает и перевод на русский. Если уместно сказать только слово «пока», тогда используется while, если же мы можем сказать и «когда» — тогда можем менять его на when.

He kept a video blog while he was travelling. – Он вел видео блог, пока он путешествовал.

  • В этом предложении может использоваться и слово when, так как можно сказать «когда он путешествовал».

I’ll read a book while I’m waiting for my turn to consult a doctor. – Я буду читать книгу, пока буду ждать своей очереди, чтобы проконсультироваться с врачом.

  • Одно действие длится дольше другого

The delivery guy rang the doorbell while I was watching a movie. – Курьер звонил в дверь, пока я смотрела фильм.

Здесь мы указываем, что наше действие длилось дольше, чем действие курьера.

  • Два действия занимают одинаковый промежуток времени. Для примера возьмем предложение не в длительном времени:

While Sam made tea, Denis made sandwiches. – Пока Сэм сделал чай, Дэнис сделал бутерброды.

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

When, while – разница между этими словами весьма простая. Для начала ориентируйтесь на правила, приведенные выше, а со временем вы научитесь использовать их правильно практически интуитивно. Главное, как можно больше тренироваться и обращать внимание на эти слова в предложениях. Так, вы будете замечать оттенки этих слов из контекста и сами начнете употреблять их безошибочно.

while (1) vs. while (True)

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

В других контекстах python действует так, как будто True равно 1:

>>> True == 1
True

>>> True + True
2

Почему while различает эти два?

На самом деле whileздесь вообще ничего не делается. Это отличает 1и Trueточно таким же образом , что +пример делает.


Вот 2.7:

>>> dis.dis('True == 1')
  1           0 LOAD_GLOBAL              0 (True)
              3 LOAD_CONST               1 (1)
              6 COMPARE_OP               2 (==)
              9 RETURN_VALUE

>>> dis.dis('True == 1')
  1           0 LOAD_GLOBAL              0 (True)
              3 LOAD_GLOBAL              0 (True)
              6 BINARY_ADD
              9 RETURN_VALUE

Теперь сравните:

>>> dis.dis('1 + 1')
  1           0 LOAD_CONST               1 (2)
              3 RETURN_VALUE

Он генерирует a LOAD_GLOBAL (True)для каждого True, и оптимизатор ничего не может сделать с global. Итак, whileотличает 1и Trueпо той же причине, что +и. (И ==не различает их, потому что оптимизатор не оптимизирует сравнения.)


Теперь сравните 3.6:

>>> dis.dis('True == 1')
  1           0 LOAD_CONST               0 (True)
              2 LOAD_CONST               1 (1)
              4 COMPARE_OP               2 (==)
              6 RETURN_VALUE

>>> dis.dis('True + True')
  1           0 LOAD_CONST               1 (2)
              2 RETURN_VALUE

Здесь он генерирует LOAD_CONST (True)для ключевого слова, чем может воспользоваться оптимизатор . Итак, True + 1 не различает по той же причине while True. (И ==все равно не различает их, потому что оптимизатор не оптимизирует сравнения.)


В том же время, если код не оптимизированные, интерпретатор заканчивает обработку Trueи 1точно так же во всех этих трех случаях. boolявляется подклассом intи наследует большинство его методов от него intи Trueимеет внутреннее целочисленное значение 1. Итак, выполняете ли вы whileтест ( __bool__в 3.x, __nonzero__в 2.x), сравнение ( __eq__) или арифметические операции. ( __add__), вы вызываете один и тот же метод независимо от того, используете ли вы Trueили 1.

java — Как заменить метод цикла for на цикл while

java — Как заменить метод цикла for на цикл while — qaru

Присоединяйтесь к Stack Overflow , чтобы учиться, делиться знаниями и строить свою карьеру.

Спросил

Просмотрено 143 раза


Хотите улучшить этот вопрос? Обновите вопрос, чтобы он соответствовал теме Stack Overflow.

Закрыт 2 года назад.

Я новичок в программировании и пытаюсь изучить Java. Я пытаюсь заменить цикл for в этом методе на цикл while. Может ли кто-нибудь помочь мне, как я это делаю, поскольку мой код, который я написал, неверен.

Это оригинал

  public static int doSomething (int [] a, int x) {
    для (int i = 0; i  

Это то, что я написал до сих пор, но продолжаю получать i ++; недоступен.Не уверен, что то, что я написал, правильно, но я был бы признателен за любую помощь. Спасибо

  i = 0;

while (i  
Андроник

22.9k1414 золотых знаков3737 серебряных знаков7373 бронзовых знака

Создан 24 апр.

1

Только эта часть: if (a [i] <= x) return i; находится в пределах для петли .Вот эквивалент:

  интервал я = 0
while (i  

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

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