[ Сборник задач ]
Тема 10. Работа с циклами

[ Сборник задач ]
Тема 10. Работа с циклами

Python Workbook Cover T1
  • Операторы: for, while
  • Контент: Вопросы (5шт) + задачи (5шт)
Следующая тема
Тема 11. Функции

Оглавление

1
Введение
Определение циклов (loops) и их структура в языке Python, особенности использования, различия. Конструкции прерывания циклов глобально и на уровне конкретной итерации (continue, break). Инструменты, заменяющие циклы.
Перейти
2
Вопросы и ответы
5 вопросов по теме "Работа с циклами" + ответы
Перейти
3
Условия задач
5 задач по теме двух уровней сложности: Базовый и *Продвинутый
Перейти
4
Решения задач
Приводим код решений указанных выше задач
Перейти
1
One

Введение

В языке программирования Python циклы существенно проще и яснее для понимания, нежели в ряде других. Некоторые языки предоставляют 3-5 конструкций циклов, иные – и вовсе не имеют таких структур (ряд чисто функциональных языков программирования). В Питоне имеется только два типа циклов: while и for.
1. Конструкция цикла while
while <выражение истинно>:
    <осуществление операций>
else:
    <обработается только при несрабатывании инструкции «break»>
2. Конструкция цикла for
for <перебор итерируемого объекта>:
    <осуществление операций над каждым элементом>
else:
    <обработается только при несрабатывании инструкции «break»>
Цикл for позволяет перебирать элементы по индексу или напрямую.

Оба вида циклических структур могут включать условные выражения и специальные «прерыватели»: continue, break.

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

Читайте также

2
Two

Вопросы по теме "Работа с циклами"

3
Three

Задачи по теме "Работа с циклами"

На вход функция more_than_five(lst) получает список из целых чисел. Результатом работы функции должен стать новый список, в котором содержатся только те числа, которые больше 5 по модулю.
Евгению предоставили строку, состоящую из русских букв разных регистров, и попросили очистить ее от заглавных литер. Как ему показалось, он написал верный код, но результат совсем не порадовал. Ниже представлен пример работы «чистильщика строк», которому срочно требуется ваша помощь.

Пример – IDE
----
letters = 'ЫгВЫоЯСремДШНККАыкЩЙФа'
for letter in letters:
____if letter.upper() = letters:
________letters.replace(letter, '')
print(letters)

Анна решила представить некую таблицу с заглавными и строчными буквами русского алфавита в красивом формате. Об этом ее попросили англоязычные друзья из социальных сетей.

Недолго думая девушка создала скрипт, который выполнял подобную операцию. Результат работы программы продемонстрирован ниже. Сможете повторить (в строках с галочками - их 27 штук, чтобы вам не пришлось долго считать)? Для идентичности результатов примените любой моноширинный шрифт (в котором все символы имеют одинаковую ширину).

^^^^^^^^^^^^^^^^^^^^^^^^^^^
| А а || К к || Х х |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
| Б б || Л л || Ц ц |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
| В в || М м || Ч ч |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
| Г г || Н н || Ш ш |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
| Д д || О о || Щ щ |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
| Е е || П п || Ъ ъ |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
| Ё ё || Р р || Ы ы |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
| Ж ж || С с || Ь ь |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
| З з || Т т || Э э |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
| И и || У у || Ю ю |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
| Й й || Ф ф || Я я |
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Для идентификации своего круга проверенных лиц будущий тайный агент (ведь все о чем-то мечтают) Максим решил пускать на свою страничку в Интернете только тех, чьи никнеймы есть в его секретном списке. Он уверен в своих людях (особенно в том, что они по глупости не расскажут никому своё секретное прозвище), как и в том, что имена товарищей невозможно подобрать случайно.

К слову, вот этот список: Мавпродош, Лорнектиф, Древерол, Фиригарпиг, Клодобродыч. По мере увеличения круга знакомых Максим, естественно, дополнит данный список.

Ваша задача такова: повторите код, который будет спрашивать у пользователя его ник и либо пускать на сайт (выведется сообщение Ты – свой. Приветствую, любезный {НИК_ПОСЕТИТЕЛЯ}!), либо нет (в этом случае будет такой текст: Тут ничего нет. Еще есть вопросы?. Фактически, будущий супергерой решил поиздеваться над теми, кого нет в его удивительном перечне, так как им будет показываться это сообщение постоянно. Очень коварный замысел!).

Для проверки прозвищ посетителей используйте встроенную функцию input().
Валентина прогуляла лекцию по математике. Преподаватель решил подшутить над нерадивой студенткой и попросил ее на практическом занятии перечислить все положительные делители некоторых целых чисел. Для несложных примеров студентка быстро нашла решения (для числа 6 это: 1, 2, 3, 6; а для числа 16 это: 1, 2, 4, 8, 16), но этим все не закончилось. На домашнее задание ей дали варианты посложнее: 23436, 190187200, 380457890232.

Решить такое вручную, как вы понимаете, практически нереально. Вот Валентина и обратилась к вам за помощью. Помогите ей (при помощи функции all_divisors(number)). Постарайтесь найти самое оптимальное решение. Результат представьте в виде списка (не забудьте отсортировать по возрастанию).
4
Two

Решения

Задача 1. Базовый уровень

Условие
На вход функция more_than_five(lst) получает список из целых чисел. 
Результатом работы функции должен стать новый список, в котором содержатся только те числа, которые больше 5 по модулю.
Для решения задачи воспользуемся циклом for.
Пример – IDE
def more_than_five(lst):
	new_lst = []
	for number in lst:
    	if abs(number) > 5:
        	new_lst.append(number)
	return new_lst
 
 
# Тесты
print(more_than_five([-11, 4, -2, 90, 400, 0, -5]))
print(more_than_five([-2, 2, 3, 4, 0, -1]))
print(more_than_five([70, -900, 41, 0]))
Результат выполнения
[-11, 90, 400]
[]
[70, -900, 41]

Задача 2. Базовый уровень

Условие
Евгению предоставили строку, состоящую из русских букв разных регистров, и попросили очистить ее от заглавных литер. 
Как ему показалось, он написал верный код, но результат совсем не порадовал. 
Ниже представлен пример работы «чистильщика строк», которому срочно требуется ваша помощь.
 
Пример – IDE
---- 
letters = 'ЫгВЫоЯСремДШНККАыкЩЙФа'

for letter in letters:
____if letter.upper() = letters:
________letters.replace(letter, '')

print(letters)
Если запустить код Евгения, то получаем синтаксическую ошибку. Вот уж действительно горе-ученик.

Что ж, давайте думать, что нужно исправить:
- в условии if явно не хватает второго знака равно, так как мы не присваиваем переменную, а проверяем ее истинность;
– каждую букву в верхнем регистре нужно сравнивать не со всем набором символом, а с одним знаком;
- заменяя буквы на пустые символы мы создаем новую строку, которую никак не сохраняем. В итоге изначальный объект не поменяется. Нужно создать пустую строку и дополнять ее верными символами, пропуская ненужные. А раз требуется сохранить прежнее название строки, то мы переприсвоим исходной вновь полученную.
Пример - IDE
letters = 'ЫгВЫоЯСремДШНККАыкЩЙФа'
clean_string = ''
for letter in letters:
    if not letter.isupper():
        clean_string += letter
letters = clean_string
print(letters)
Результат выполнения
горемыка

Задача 3. Базовый уровень

Условие
Анна решила представить некую таблицу с заглавными и строчными буквами русского алфавита в красивом формате. 
Об этом ее попросили англоязычные друзья из социальных сетей.

Недолго думая девушка создала скрипт, который выполнял подобную операцию. 
Результат работы программы продемонстрирован ниже. 
Сможете повторить (в строках с галочками - их 27 штук, чтобы вам не пришлось долго считать)? Для идентичности результатов примените любой моноширинный шрифт (в котором все символы имеют одинаковую ширину).
 
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  А а  ||  К к  ||  Х х  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  Б б  ||  Л л  ||  Ц ц  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  В в  ||  М м  ||  Ч ч  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  Г г  ||  Н н  ||  Ш ш  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  Д д  ||  О о  ||  Щ щ  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  Е е  ||  П п  ||  Ъ ъ  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  Ё ё  ||  Р р  ||  Ы ы  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  Ж ж  ||  С с  ||  Ь ь  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  З з  ||  Т т  ||  Э э  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  И и  ||  У у  ||  Ю ю  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  Й й  ||  Ф ф  ||  Я я  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
В идеале требуется провести минимум «издевательств» над входящими данными (т.е. над алфавитом). В нашем случае мы просто записали все буквы русского алфавита в строку.

Также, в задаче требовалось понять алгоритм разбиения знаков на 3 столбца.
Пример – IDE
rus_lower = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
for position in range(11):
    print('^' * 27)
    for letter in rus_lower:
        if rus_lower.index(letter) % 11 == position:
            print('| ', letter.upper(), letter, ' |', end='')
    print()
print('^' * 27)
Результат выполнения
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  А а  ||  К к  ||  Х х  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  Б б  ||  Л л  ||  Ц ц  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  В в  ||  М м  ||  Ч ч  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  Г г  ||  Н н  ||  Ш ш  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  Д д  ||  О о  ||  Щ щ  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  Е е  ||  П п  ||  Ъ ъ  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  Ё ё  ||  Р р  ||  Ы ы  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  Ж ж  ||  С с  ||  Ь ь  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  З з  ||  Т т  ||  Э э  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  И и  ||  У у  ||  Ю ю  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|  Й й  ||  Ф ф  ||  Я я  |
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Задача 4. Базовый уровень

Условие
Для идентификации своего круга проверенных лиц будущий тайный агент (ведь все о чем-то мечтают) 
Максим решил пускать на свою страничку в Интернете только тех, чьи никнеймы есть в его секретном списке. 
Он уверен в своих людях (особенно в том, что они по глупости не расскажут никому своё секретное прозвище), 
как и в том, что имена товарищей невозможно подобрать случайно.

К слову, вот этот список: Мавпродош, Лорнектиф, Древерол, Фиригарпиг, Клодобродыч. 
По мере увеличения круга знакомых Максим, естественно, дополнит данный список.

Ваша задача такова: повторите код, который будет спрашивать у пользователя его ник и 
либо пускать на сайт (выведется сообщение «Ты – свой. Приветствую, любезный {НИК_ПОСЕТИТЕЛЯ}!»), 
либо нет (в этом случае будет такой текст: «Тут ничего нет. Еще есть вопросы?». 
Фактически, будущий супергерой решил поиздеваться над теми, кого нет в его удивительном перечне, так как им будет показываться это сообщение постоянно. 
Очень коварный замысел!).

Для проверки прозвищ посетителей используйте встроенную функцию input().
Данное задание удобно решать через while/else.
Пример - IDE
nick = input()
secret_list = ['Мавпродош', 'Лорнектиф', 'Древерол', 'Фиригарпиг', 'Клодобродыч']
 
while nick not in secret_list:
    print('Тут ничего нет. Еще есть вопросы?')
	  nick = input()
else:
	  print(f'Ты – свой. Приветствую, любезный {nick}!')
Результат выполнения
>Агент007
Тут ничего нет. Еще есть вопросы?
>Нету(
Тут ничего нет. Еще есть вопросы?
>ЕСТЬ!!!
Тут ничего нет. Еще есть вопросы?
>Мавпродош
Ты – свой. Приветствую, любезный Мавпродош!

Задача 5. *Продвинутый уровень

Условие
Валентина прогуляла лекцию по математике. 
Преподаватель решил подшутить над нерадивой студенткой и 
попросил ее на практическом занятии перечислить все положительные делители некоторых целых чисел. 
Для несложных примеров студентка быстро нашла решения (для числа 6 это: 1, 2, 3, 6; а для числа 16 это: 1, 2, 4, 8, 16), но этим все не закончилось. 
На домашнее задание ей дали варианты посложнее: 23436, 190187200, 380457890232.

Решить такое вручную, как вы понимаете, практически нереально. 
Вот Валентина и обратилась к вам за помощью. 
Помогите ей (при помощи функции all_divisors(number)). 
Постарайтесь найти самое оптимальное решение. 
Результат представьте в виде списка (не забудьте отсортировать по возрастанию).
Для решения задания важно не просто подойти к делу в лоб. Требуется оптимизация алгоритма для минимизации времени расчета.

Первое, что приходит на ум – простой перебор всех вариантов. Каким бы мощным не был ваш ПК, число в 380 млрд он будет долго итерировать.

Вторая идея – перебрать все числа только до половины искомого числа (и добавить после этого еще и само число в список). Но и этот вариант не особо сокращает время.

Самый оптимальный вариант – перебрать числа до квадратного корня из искомого. Чтобы пояснить решение, приведем пример попроще. Возьмем число 100. Оно делится на 1 и на само себя. Сразу заносим в список очевидный набор. Затем начинаем с двойки и идем по всем возможным числам. 100 делится на 2, его заносим в список, но результат (т.е. 100 : 2 = 50) также является делителем числа 100. Его тоже сразу добавляем. Аналогично поступаем далее, находя пары делителей: (4, 25), (5, 20), (10, 10). Итак, мы дошли до корня квадратного из 100. Число 10 повторяется, поэтому следует его добавить лишь 1 раз. Есть ли смысл идти дальше в поиске делителей? Ведь далее получим такие делители: 20, 25, 50 и 100, но мы их уже занесли в список. Получается, проверка делителей до корня квадратного из любого положительного числа вполне достаточна.
Пример - IDE
def all_divisors(number):
    lst = [1, number]
    for i in range(2, 1 + int(number ** 0.5)):
        if number % i == 0:
            lst.extend({number // i, i})
    return sorted(lst)
 
# Тесты
print(all_divisors(23_436))
print(all_divisors(190_187_200))
print(all_divisors(380_457_890_232))
Результат выполнения
[1, 2, 3, 4, 6, 7, 9, 12, 14, 18, 21, 27, 28, 31, 36, 42, 54, 62, 63, 84, 93, 108, 124, 126, 186, 189, 217, 252, 279, 372, 378, 434, 558, 651, 756, 837, 868, 1116, 1302, 1674, 1953, 2604, 3348, 3906, 5859, 7812, 11718, 23436]
[1, 2, 4, 5, 7, 8, 10, 14, 16, 20, 25, 28, 32, 35, 40, 50, 56, 64, 70, 80, 100, 112, 140, 160, 175, 200, 224, 280, 320, 350, 400, 448, 560, 700, 800, 1120, 1400, 1600, 2240, 2800, 5600, 11200, 16981, 33962, 67924, 84905, 118867, 135848, 169810, 237734, 271696, 339620, 424525, 475468, 543392, 594335, 679240, 849050, 950936, 1086784, 1188670, 1358480, 1698100, 1901872, 2377340, 2716960, 2971675, 3396200, 3803744, 4754680, 5433920, 5943350, 6792400, 7607488, 9509360, 11886700, 13584800, 19018720, 23773400, 27169600, 38037440, 47546800, 95093600, 190187200]
[1, 2, 3, 4, 6, 7, 8, 12, 14, 17, 21, 24, 28, 34, 42, 51, 56, 68, 84, 102, 119, 136, 168, 204, 238, 289, 357, 408, 476, 578, 714, 867, 952, 1156, 1428, 1734, 2023, 2312, 2856, 3468, 4046, 6069, 6936, 8092, 12138, 16184, 24276, 48552, 7836091, 15672182, 23508273, 31344364, 47016546, 54852637, 62688728, 94033092, 109705274, 133213547, 164557911, 188066184, 219410548, 266427094, 329115822, 399640641, 438821096, 532854188, 658231644, 799281282, 932494829, 1065708376, 1316463288, 1598562564, 1864989658, 2264630299, 2797484487, 3197125128, 3729979316, 4529260598, 5594968974, 6793890897, 7459958632, 9058521196, 11189937948, 13587781794, 15852412093, 18117042392, 22379875896, 27175563588, 31704824186, 47557236279, 54351127176, 63409648372, 95114472558, 126819296744, 190228945116, 380457890232]
Следующая тема
Тема 11. Функции
Как вам материал?

Читайте также