Как пропустить итерацию в цикле for?
Пробовал пропустить итерацию с помощью оператора continue . Но, видимо, он не подходит. Задача описана ниже в комментарии к коду:
# Задача программы: # - переводить любой текст в следующий формат: "сЛуЧаЙнЫй ТеКсТ" # - т.е., каждая новая буква в слове должна отличаться в регистре от предыдущей # - пробелы пропускаются user_text = "любой случайно набранный текст"
Сначала я хотел написать что-то типа:
for i in user_text: i = i.upper() # метод upper() выносит слова в верхний регистр continue
Но потом понял, что это не верно.
Отслеживать
51.6k 200 200 золотых знаков 61 61 серебряный знак 242 242 бронзовых знака
задан 27 мая 2021 в 11:39
133 1 1 серебряный знак 5 5 бронзовых знаков
Чтобы поблагодарить автора ответа, проголосуйте за ответ и отметьте его галочкой как решение.
27 мая 2021 в 13:55
я наверное что-то не понимаю, но почему такие легкие учебные задания набирают столько голосов.
27 мая 2021 в 18:30
Конкретно эта задача оказалась неожиданно сложной в реализации, а её кажущаяся простота привлекла много отвечающих. Активность отвечающих удерживала её в топе задач. Кто в топе, тот получает много голосов. И отвечающие тоже голосуют за. Как-то так.
27 мая 2021 в 19:04
5 ответов 5
Сортировка: Сброс на вариант по умолчанию
Пропускать итерации не нужно. В задании сказано «переводить любой текст». В том числе и такой «ПРИВЕТ» -> «пРиВеТ». Следовательно, иногда вам нужно поднимать регистр, иногда опускать. Иногда символ не должен меняться (например пробел), но и в этом случае пропускать итерацию нельзя — нужно проверить что это пробел и ничего не делать.
Если всё это учесть, то получится такой (нерабочий) код:
for i in user_text: if not i.isalpha(): continue # хитрое условие if . i = i.lower() else: i = i.upper()
Этот код работает, но ничего не делает. Строки в Питоне неизменны: сама идея, что можно отредактировать отдельные символы и вписать обратно в строку, не верна. Нужно изготавливать копию строки.
Работающий код ниже. Во-первых, регистр переключается без булевых флагов и деления с остатком. Во-вторых, это генератор. В-третьих, мои любимые скобки подряд next(cases)(c) . В-четвёртых, обращение к методу класса без упоминания экземпляра (в Питоне пишут ‘s’.upper() , но можно и str.upper(‘s’) ):
import itertools def mixed_case(s): cases = itertools.cycle((str.lower, str.upper)) for c in s: if c.isalpha(): yield next(cases)(c) else: yield c for s in ( 'любой случайно набранный текст', 'любой, дАжЕ "СЛУЧАЙНО" набраный ТЕКСТ', 'Специальный выпуск сериала Друзья телеканала HBO Max получил официальную дату премьеры в России' ): print(''.join(mixed_case(s)))
$ python mixed_case.py лЮбОй СлУчАйНо НаБрАнНыЙ тЕкСт лЮбОй, ДаЖе "СлУчАйНо" НаБрАнЫй ТеКсТ сПеЦиАлЬнЫй ВыПуСк СеРиАлА дРуЗьЯ тЕлЕкАнАлА hBo MaX пОлУчИл ОфИцИаЛьНуЮ дАтУ пРеМьЕрЫ в РоСсИи
Код можно переписать компактно если воспользоваться выражением-генератором и тернарным if :
def mixed_case(s): cases = itertools.cycle((str.lower, str.upper)) return (next(cases)(c) if c.isalpha() else c for c in s)
Пользователь TigerTV.ru предложил ипользовать map :
def mixed_case(s): cases = itertools.cycle((str.lower, str.upper)) return map(lambda c: next(cases)(c) if c.isalpha() else c, s)
Пропуск нескольких итераций в цикле for
Как пропустить несколько итераций подряд в цикле for ?
Например, в языке Си это можно сделать следующим образом:
1 2 3 4 5
for(i=0; i100;i++) { if(x==state) //если какое-то условие i+=10 //то пропустим 10 итераций }
Как можно реализовать подобное в цикле for Python и можно ли вообще?
1 2 3
for i in range(100): . .
Или тут пойдет только while ?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Пропуск итераций в цикле
Есть задача по заполнению двумерного массива уникальными числами(в моём случае в интервале от 10 до.
Пропуск итераций
Из-за чего в процессе выполнения кода может происходить пропуск итераций?
Длинная арифметика. Перемножение двух больших чисел. Пропуск итераций
Программа работает корректно с числами, оканчивающимися не на нуль. Пробовал выводить слово "iter".
Пропуск шага в цикле
Есть цикл for, нужно посчитать сумму всех шагов кроме i0(Первый),i2(третий),in-1(предпоследний).
4459 / 3212 / 1125
Регистрация: 21.03.2016
Сообщений: 7,949
1 2 3 4
for i in range(100): if 5 i 95: continue print(i)
1040 / 575 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
1 2 3
for i in range(100): if i 5 or i > 95: print(i)
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

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

Пропуск определенных индексов масива в цикле
Всем привет. Возникла проблема, есть 2 массива, в 1 лежат определенные значения , во втором.
в цикле сделать пропуск, если наступил except
Господа эксперты, прошу помощи. Гугл помочь не смог. Есть цикл. При наступлении except нужно не.
Пропуск одного счёта в цикле for, почему?
Вводятся числа a и b. Найти среднее арифметическое таких чисел в диапазоне , у которых последняя.
В текстовом файле где более одного пропуск поставить еще один пропуск
Пожалуйста решите задание! В текстовом файле где более одного пропуска поставить еще один.
Операторы циклов break, continue и else
То такой цикл будет работать «вечно», он сам никогда не остановится и строчку «завершение цикла» мы не увидим. Программу в этом случае можно только прервать и полностью остановить. Однако, если записать в тело цикла оператор break, то он прервется, как только встретится:
while True: i += 1 break
Обратите внимание, оператор i += 1 один раз будет выполнен, а прерывание сработает только в строчке с оператором break. Но вы скажете, конечно, зачем писать программы с «вечными» циклами, нужно корректно прописывать условие и все будет хорошо? Часто, именно так и следует поступать. Но бывают ситуации, когда все же требуется досрочно прерывать работу цикла. Например, у нас имеется список с числами:
d = [1, 5, 3, 6, 0, -4]
И мы хотим определить, есть ли среди них хотя бы одно четное значение. Здесь удобно воспользоваться оператором break. Как только встретим первое четное значение, дальнейшую проверку можно не проводить:
d = [1, 5, 3, 6, 0, -4] flFind = False i = 0 while i len(d): flFind = d[i] % 2 == 0 if flFind: break i += 1 print(flFind)
Конечно, эту же программу можно было бы построить и без break, используя составное условие:
i = 0 while i len(d) and d[i] % 2 != 0: i += 1 flFind = i != len(d)
Но, на мой взгляд, первый вариант с break красивее и понятнее, чем второй. Хотя, все дело вкуса – кому, как нравится. Я, думаю, что принцип работы оператора break понятен. Он прерывает работу любого оператора цикла, как только выполнение программы перейдет к нему. Следующий оператор continue позволяет пропускать одну итерацию тела цикла. Давайте, опять же, на конкретном примере посмотрим, где и как его целесообразно применять. Предположим, что мы просим пользователя вводить с клавиатуры числа и все нечетные значения суммируем. Как только пользователь введет 0, подсчет суммы прекращается. Реализовать эту программу удобно, следующим образом:
s = 0 d = 1 while d != 0: d = int(input("Введите целое число: ")) if d % 2 == 0: continue s += d print("s = " + str(s))
Смотрите, мы здесь на каждой итерации цикла проверяем, если текущее значение d четное, то последующий подсчет суммы и вывод ее в консоль не выполняется, пропускается. При этом, цикл продолжает свою работу и переходит к следующей итерации, пока пользователь не введет число 0. Благодаря оператору continue мы основную логику программы прописываем непосредственно в теле цикла, а не во вложенном блоке условного оператора. То есть, если программу переписать без continue, то она бы выглядела так:
s = 0 d = 1 while d != 0: d = int(input("Введите целое число: ")) if d % 2 != 0: s += d print("s = " + str(s))

Здесь получается массивный вложенный блок операторов. Конечно, на производительность это никак не влияет, но, все же такие вложения лучше избегать, так программа становится менее читабельной и удобной для дальнейшего редактирования. В заключение этого занятия рассмотрим третий оператор циклов else. Да, мы уже говорили об этом операторе, когда рассматривали условия. У циклов он тоже есть и сейчас разберем, как работает. Синтаксис этого оператора, следующий. После тела цикла прописывается необязательный оператор else, в котором указываются операторы, исполняющиеся после завершения цикла: И здесь возникает вопрос: а чем блок else отличается от блока операторов, просто идущих после блока while? Ведь когда цикл while завершается, мы так и так переходим к последующим операторам! Но обратите внимание вот на эту на фразу «штатное завершение цикла». Штатное завершение – это когда условие цикла стало равно False и оператор while прекращает свою работу. Только в этом случае мы перейдем в блок else. Давайте я покажу это на конкретном примере. Предположим, что мы вычисляем сумму вида: S = 1/2 + 1/3 + 1/4 + 1/10 + … + 1/0 И если в этом сумме встречается деление на ноль, то вычисления следует прервать. Реализуем эту программу, следующим образом:
S=0 i=-10 while i 100: if i == 0: break S += 1/i i += 1 else: print("Сумма вычислена корректно") print(S)
3. Операторы break и continue для управления работой цикла. Использование else в циклических алгоритмах
Из названия операторов понятно, что один из них прерывает цикл, а другой продолжает. Рассмотрим на примерах применение этих операторов для управления работой цикла.
Пример \(6\)
Предположим, что нам необходимо набрать заголовки в газету, в которых не будет какой-то конкретной буквы (литера с этой буквой потерялась, а новую ещё не успели изготовить).
План решения задачи будет таким: перебираем в цикле for введённое название статьи, и как только находим букву, литера которой утеряна, прерываем перебор. Наличие хотя бы одной такой буквы в названии делает печать заголовка невозможным.

Рис. \(1\). Пример \(6\)
Обрати внимание!
• Оператор break прерывает выполнение того цикла, в котором находится.
Пример \(6\) \((1)\)
Усовершенствуем пример так, чтобы для каждого заголовка нам не приходилось перезапускать программу. Так как количество заголовков нам неизвестно, используем цикл while. Более того, сделаем его бесконечным, а прерывание break поставим таким образом, чтобы пользователь сам решал, хочет ли он продолжать вводить заголовки или нет.

Рис. \(2\). Пример \(6\) \((1)\)
Обрати внимание!
• Первый оператор break прерывает выполнение цикла for, так как находится в этом цикле, второй оператор break прерывает выполнение цикла while.
• Цикл for вложен в цикл while, и пока не будет выполнен внутренний цикл по перебору букв в заголовке, внешний цикл не перейдёт к следующей итерации.
• Для цикла while мы использовали логическое условие True и таким образом организовали бесконечный цикл.
Пример \(6\) \((2)\)
Программу можно ещё усовершенствовать, ведь если нам встречается утерянная литера, мы получаем комментарий о необходимости менять заголовок, а вот в противном случае комментария нет. Проанализируем, когда должен появиться комментарий «Заголовок принят». В том случае, если цикл for завершится, а не прервётся. Для такого действия в Python есть уникальная возможность использования оператора else.

Рис. \(3\). Пример \(6\) \((2)\)
Обрати внимание!
• Заголовок «Береги жилище от пожара» не содержит утерянной литеры, то есть цикл завершается полностью, и только в этом случае работает оператор print (‘Заголовок принят’).
• Оператор else может использоваться в циклических алгоритмах for и while.
Пример \(6\) \((3)\)
Допустим, мы теряем только литеры с русскими буквами, а в заголовках могут встречаться и латинские. Разумно не проверять, а пропустить эти буквы.

Рис. \(4\). Пример \(6\) \((3)\)
Обрати внимание!
• Оператор continue позволяет перейти к следующей итерации до того, как цикл будет закончен.
• Условие if \(‘A’• У буквы Е русского алфавита и у буквы E латинского алфавита, несмотря на похожие очертания, разные коды, поэтому программа не приняла второй заголовок.
