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