Перейти к содержимому

Как решать задачи на циклы в питоне

  • автор:

Практические задачи по циклам Python

В этом цикле материалов, мы с вами на практических примерах пройдемся по циклам Python. Решим несколько практических задач, и узнаем, как на практике применять циклы.

Что бы хорошо разобраться в приведенных ниже примерах, вам необходимо знать следующие темы:

Python четность числа

И так, для нахождения четности числа, мы будем действовать следующим образом. Делим нужное нам число на 2 , с использованием оператора % , который вычисляет остаток. В случае если остаток числа равен нулю, то число четное.

 
num = int(input("Введи число: ")) if (num % 2) == 0: print('Число ',num,' четное') else: print('Число ', num,' нечетное') Результат работы:
Введи число: 43 Число 43 нечетное
Введи число: 8 Число 8 четное

Что происходит в данном коде? В сам начале, мы просим пользователя ввести число, затем делим это число, и смотри на остаток, если остаток равен нулю, то число четное, если не равен нулю, то число нечетное.

Проверка на високосный год

В этом примере мы напишем программу которая проверяет является ли тот или иной год високосным. Для решения этой задачи мы будем использовать вложенные условия if…else . Что бы хорошо понять этот пример, нам необходимо знать следующие темы.

Вычисление високосного года происходит следующим образом:

Високосный год делится без остатка на 4, за исключением столетий (года заканчивающиеся на 00). Столетние года, мы будем делить на 400, если делится без остатка, то этот год является високосным. При делении как и в предыдущем примере, мы будем использовать оператор %. Пример:

Вложенные циклы. Примеры задач с вложенными циклами

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

Само это название уже говорит, что один оператор цикла можно вложить в другой. Это могут быть два цикла for или два цикла while или смешанные варианты. Давайте вначале разберемся, как работают эти конструкции. Принцип у всех един, поэтому, для простоты, я возьму два цикла for (один вложен в другой). Эти циклы будут просто пробегать диапазоны чисел, первый от 1 до 3, а второй – от 1 до 5:

for i in range(1, 4): for j in range(1, 6): print(f"i = , j = ", end=' ') print()

Во втором вложенном цикле мы будем выводить значения i и j в строку без перехода на новую строчку. А после завершения работы вложенного цикла вызовем функцию print(), как раз, для перевода курсора на новую строку. В результате выполнения этой программы, мы получим таблицу значений переменных i и j.

Почему получились именно такие значения? Вначале у нас счетчик i принимает значение 1, а счетчик j пробегает числа от 1 до 5, в итоге получаем первую строку. После завершения вложенного цикла, срабатывает функция print() и курсор переходит на новую строку. После этого переходим ко второй итерации первого цикла и i = 2. Счетчик j снова проходит значения от 1 до 5 и получаем вторую строку. На следующей итерации первого цикла i = 3, j проходит от 1 до 5 и получаем третью строку. То есть, у нас вложенный цикл for трижды запускался заново и каждый раз j изменялось от 1 до 5. Это и есть принцип работы вложенного цикла – на каждой итерации он отрабатывает снова и снова, пока не завершится первый цикл.

Теперь второй вопрос – зачем все это нужно? Давайте представим, что у нас есть вложенный (двумерный) список:

a = [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]

(О таких списках мы с вами уже говорили и вам здесь все должно быть понятно). Так вот, если мы будем перебирать его элементы с помощью одного оператора цикла for:

for row in a: print(row, type(row))

То переменная row будет ссылаться сначала на первый вложенный список, затем, на второй и потом на третий. Но, так как row ссылается на список, то есть, на итерируемый объект, то нам ничто не мешает перебрать его элементы с помощью второго, вложенного цикла for:

for row in a: for x in row: print(x, type(x), end=' ') print()

Как видите, теперь в консоль выводятся числа типа int, то есть, мы обращаемся непосредственно к элементам этого двумерного списка.

Ну, хорошо, а все-таки, зачем это может быть нужно? Например, так можно выполнить сложение значений из двух одинаковых двумерных списков:

a = [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]] b = [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]]

И сформировать на их основе третий список:

for i, row in enumerate(a): r = [] for j, x in enumerate(row): r.append(x + b[i][j]) c.append(r) print(c)

Я здесь воспользовался еще одной уже знакомой нам функцией enumerate(), которая возвращает индекс и значение текущего элемента. Это удобно для реализации данной программы. Внутри первого цикла мы каждый раз создаем новый пустой список и с помощью метода append() добавляем в его конец новый элемент как сумму значений из списков a и b. Полученную строку (список r) мы, затем, добавляем в основной список c. Так вычисляется сумма значений элементов двух одинаковых списков a и b.

Как видите, для реализации данной программы нам потребовался вложенный оператор цикла for. И это лишь один маленький пример. Другой пример, пусть у нас имеется текст, представленный в виде списка:

t = ["– Скажи-ка, дядя, ведь не даром", "Я Python выучил с каналом", "Балакирев что раздавал?", "Ведь были ж заданья боевые,", "Да, говорят, еще какие!", "Недаром помнит вся Россия", "Как мы рубили их тогда!" ]

Здесь в строках присутствуют два и более пробелов. Наша задача удалить их и оставить только один. Сделаем это с помощью вложенных циклов. В первом цикле for будем перебирать строки – элементы списка, а во втором (вложенном) цикле while удалять лишние пробелы:

for i, line in enumerate(t): while line.count(' '): line = line.replace(' ', ' ') t[i] = line print(t)

В качестве условия цикла мы здесь вызываем метод count(), который подсчитывает число фрагментов из двух пробелов подряд. Как только их станет 0 – это будет означать False и цикл завершится. Преобразованная строка становится новым i-м элементом списка и в конце результат выводим в консоль.

Следующий пример. Предположим, вначале мы формируем вложенный список размером M x N элементов. Причем, M, N вводим с клавиатуры. Вначале сформируем список, состоящий из всех нулей:

M, N = list(map(int, input("Введите M и N: ").split())) zeros = [] for i in range(M): zeros.append([0]*N) print(zeros)

А после этого все элементы заменим на единицы, используя вложенные циклы:

for i in range(M): for j in range(N): zeros[i][j] = 1

Как видите, в целом, все достаточно просто.

И последний пример. Пусть у нас имеется квадратный список (размерности совпадают):

A = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]

Необходимо поменять строки на столбцы и получить новое представление этого же списка. Для этого достаточно поменять местами элементы, стоящие выше главной диагонали с элементами, стоящими ниже главной диагонали. То есть, у нас счетчик i будет меняться от 0 до 3, а счетчик j от i+1 до 3. Затем, соответствующие элементы будем менять между собой:

for i in range(len(A)): for j in range(i+1, len(A)): A[i][j], A[j][i] = A[j][i], A[i][j] for r in A: for x in r: print(x, end='\t') print()

Как видите, у нас получилось нужно преобразование. В математике это называется транспонированием матрицы.

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

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

Видео по теме

#1. Первое знакомство с Python Установка на компьютер

#2. Варианты исполнения команд. Переходим в PyCharm

#3. Переменные, оператор присваивания, функции type и id

#4. Числовые типы, арифметические операции

#5. Математические функции и работа с модулем math

#6. Функции print() и input(). Преобразование строк в числа int() и float()

#7. Логический тип bool. Операторы сравнения и операторы and, or, not

#8. Введение в строки. Базовые операции над строками

#9. Знакомство с индексами и срезами строк

#10. Основные методы строк

#11. Спецсимволы, экранирование символов, row-строки

#12. Форматирование строк: метод format и F-строки

#13. Списки - операторы и функции работы с ними

#14. Срезы списков и сравнение списков

#15. Основные методы списков

#16. Вложенные списки, многомерные списки

#17. Условный оператор if. Конструкция if-else

#18. Вложенные условия и множественный выбор. Конструкция if-elif-else

#19. Тернарный условный оператор. Вложенное тернарное условие

#20. Оператор цикла while

#21. Операторы циклов break, continue и else

#22. Оператор цикла for. Функция range()

#23. Примеры работы оператора цикла for. Функция enumerate()

#24. Итератор и итерируемые объекты. Функции iter() и next()

#25. Вложенные циклы. Примеры задач с вложенными циклами

#26. Треугольник Паскаля как пример работы вложенных циклов

#27. Генераторы списков (List comprehensions)

#28. Вложенные генераторы списков

#29. Введение в словари (dict). Базовые операции над словарями

#30. Методы словаря, перебор элементов словаря в цикле

#31. Кортежи (tuple) и их методы

#32. Множества (set) и их методы

#33. Операции над множествами, сравнение множеств

#34. Генераторы множеств и генераторы словарей

#35. Функции: первое знакомство, определение def и их вызов

#36. Оператор return в функциях. Функциональное программирование

#37. Алгоритм Евклида для нахождения НОД

#38. Именованные аргументы. Фактические и формальные параметры

#39. Функции с произвольным числом параметров *args и **kwargs

#40. Операторы * и ** для упаковки и распаковки коллекций

#41. Рекурсивные функции

#42. Анонимные (lambda) функции

#43. Области видимости переменных. Ключевые слова global и nonlocal

#44. Замыкания в Python

#45. Введение в декораторы функций

#46. Декораторы с параметрами. Сохранение свойств декорируемых функций

#47. Импорт стандартных модулей. Команды import и from

#48. Импорт собственных модулей

#49. Установка сторонних модулей (pip install). Пакетная установка

#50. Пакеты (package) в Python. Вложенные пакеты

#51. Функция open. Чтение данных из файла

#52. Исключение FileNotFoundError и менеджер контекста (with) для файлов

#53. Запись данных в файл в текстовом и бинарном режимах

#54. Выражения генераторы

#55. Функция-генератор. Оператор yield

#56. Функция map. Примеры ее использования

#57. Функция filter для отбора значений итерируемых объектов

#58. Функция zip. Примеры использования

#59. Сортировка с помощью метода sort и функции sorted

#60. Аргумент key для сортировки коллекций по ключу

#61. Функции isinstance и type для проверки типов данных

#62. Функции all и any. Примеры их использования

#63. Расширенное представление чисел. Системы счисления

#64. Битовые операции И, ИЛИ, НЕ, XOR. Сдвиговые операторы

#65. Модуль random стандартной библиотеки

#66. Аннотация базовыми типами

#67. Аннотации типов коллекций

#68. Аннотации типов на уровне классов

#69. Конструкция match/case. Первое знакомство

#70. Конструкция match/case с кортежами и списками

#71. Конструкция match/case со словарями и множествами

#72. Конструкция match/case. Примеры и особенности использования

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

Циклы в Python: виды и примеры

Что это такое? Циклы в Python – инструменты, упрощающие работу с кодом. В программировании все циклично и последовательно. Написание любой программы состоит из прохождения определенных этапов, задачи в которых могут повторяться. Вот чтобы не тратить время на повторяющиеся элементы и были придуманы циклы. К слову, они есть в любом языке программирования, не только в Python.

Какие бывают? В Python основных циклов всего два – «while» и «for». Первый используется тогда, когда заранее известно количество итераций, а второй – когда нужно выполнить перебор элементов. Но мало знать принципы работы циклов, в работе необходимы еще и операторы, которые делают «while» и «for» бесконечными или вложенными, прерывают их или меняют. Ниже в статье постарались объяснить все это доступным языком с примерами.

В статье рассказывается:

  1. Что такое циклы в языке программирования Python
  2. Зачем нужны циклы в Python
  3. 2 цикла в Python
  4. Примеры циклов в Python
  5. Выход из цикла Python или его смена
  6. Бесконечные и вложенные циклы в Python

Пройди тест и узнай, какая сфера тебе подходит:
айти, дизайн или маркетинг.
Бесплатно от Geekbrains

Что такое циклы в языке программирования Python

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

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

В рамках данной темы можно выделить ряд базовых понятий:

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

Узнай, какие ИТ - профессии
входят в ТОП-30 с доходом
от 210 000 ₽/мес
Павел Симонов
Исполнительный директор Geekbrains

Команда GeekBrains совместно с международными специалистами по развитию карьеры подготовили материалы, которые помогут вам начать путь к профессии мечты.

Подборка содержит только самые востребованные и высокооплачиваемые специальности и направления в IT-сфере. 86% наших учеников с помощью данных материалов определились с карьерной целью на ближайшее будущее!

Скачивайте и используйте уже сегодня:

Павел Симонов - исполнительный директор Geekbrains

Павел Симонов
Исполнительный директор Geekbrains

Топ-30 самых востребованных и высокооплачиваемых профессий 2023

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

Подборка 50+ бесплатных нейросетей для упрощения работы и увеличения заработка

Только проверенные нейросети с доступом из России и свободным использованием

ТОП-100 площадок для поиска работы от GeekBrains

Список проверенных ресурсов реальных вакансий с доходом от 210 000 ₽

Получить подборку бесплатно
Уже скачали 23672

Используя Python , вы можете создавать вложенные циклы. В этом случае программа произведет запуск внешнего цикла и в первой его итерации перейдет во вложенный. После этого она вновь вернётся к началу внешнего и опять запустит внутренний. Эти действия будут выполняться вплоть до момента, когда последовательность не завершится или не прервется. Циклы очень полезны для выполнения задач, связанных с перебором определенного количества элементов в заданном списке.

Зачем нужны циклы в Python

Циклы в Python позволяют сделать из сложных задач более простые. С помощью них вы можете настроить поток программы так, чтобы код повторялся определенное количество раз. Иными словами, вам не придется постоянно прописывать один и тот же код. Допустим, что перед вами стоит задача вывода первых 20 натуральных чисел. Вы, конечно, можете применить оператор «print» 20 раз, но гораздо более удобный вариант — вывести их внутри цикла, который выполняет до 20 итераций.

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

Определение циклов ( loops ) и их структура в языке Python, особенности использования, различия. Конструкции прерывания циклов глобально и на уровне конкретной итерации ( continue , break ). Инструменты, заменяющие циклы.

Вопросы и ответы
5 вопросов по теме "Работа с циклами" + ответы
Условия задач
5 задач по теме двух уровней сложности: Базовый и *Продвинутый
Решения задач
Приводим код решений указанных выше задач

One

В языке программирования Python циклы существенно проще и яснее для понимания, нежели в ряде других. Некоторые языки предоставляют 3-5 конструкций циклов, иные – и вовсе не имеют таких структур (ряд чисто функциональных языков программирования). В Питоне имеется только два типа циклов: while и for .

1. Конструкция цикла while

 while : else:

2. Конструкция цикла for

 for : else:

Цикл for позволяет перебирать элементы по индексу или напрямую.

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

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

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

Программирование на Python. Урок 3. Функции, условные выражения и циклы.

Разбираемся с функциями в Python: аргументы, тело, возвращаемое значение. Изучаем структуру и синтаксис условного оператора if..elif..else. Учимся писать циклы for и while. Решаем задачи.

Программирование на Python. Урок 2. Типы данных

Разбираем типы данных в Python: списки, кортежи, словари, множества и т. д. Рассматриваем часто используемые способы ввода-вывода данных. Решаем задачи.

Two

Вопросы по теме "Работа с циклами"
1. В чем основное отличие циклов for и while ?

Несмотря на то, что и for и while необходимы для повторения некоего количества раз одной и той же операции , циклы отличаются друг от друга и имеют свою специфику. Даже с учетом их формальной взаимозаменяемости.

While удобен тогда, когда повторяющаяся операция проводится до тех пор, пока условие верно, т.е. возвращает True . Отсюда возможна ситуация, когда цикл не сработает ни разу либо будет повторяться бесконечно. Чтобы была возможность применить данный вид цикла для объекта, тот обязан иметь атрибут __bool__() .

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

Таким образом, for удобен для перебора, а while – проверки истинности условия перед каждой итерацией.

2. Приведите пример бесконечного цикла. Применяется ли он на практике?

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

Пример – Интерактивный режим
----
>>> while True:
. x = 10

Вместо явного указания True можно использовать любую комбинацию, результирующую в истинность (например, 1 + 1 == 2, 7 > 5 , bool('Python') и т.п.)

Любой код, написанный после данного цикла, не будет достигнут.

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

Пример – Интерактивный режим
----
>>> from itertools import count
>>> for number in count():
. number += 7

Функция count() последовательно выводит все числа от 1 до бесконечности с шагом 1 (т.е. 1, 2, 3, 4… ) по умолчанию.

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

3. Сработает ли инструкция else в нижеследующем примере? Поясните ответ.

Пример – IDE
----
for letter in 'программист':
____if letter == 'П':
________break
else:
____print('Перебор букв в слове закончен')

Как известно, инструкция else в циклах срабатывает только в том случае, когда цикл не прерван командой break . В нашем примере имеется данная команда. Тем не менее, в слове программист были перебраны все буквы и не найдена заглавная П , которая бы его прервала.

Поэтому ответ очевиден: else сработает. Проверим.

Пример – Интерактивный режим
----
>>> for letter in 'программист':
. if letter == 'П':
. break
. else:
. print('Перебор букв в слове закончен')
.
Перебор букв в слове закончен

4. Какова вычислительная сложность цикла for , перебирающего элементы множества (сколько нужно совершить операций)?

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

Для этого приходится определять сложность решения « О большое » (асимптотическая нотация, нотация Бахмана-Ландау). Это позволяет понять, насколько оптимален алгоритм.

Так, при переборе элементов множества через цикл for в худшем случае потребуется пройтись по каждому из них. Следовательно, необходимо осуществить количество операций, равное размеру объекта.

В обозначениях асимптотической нотации это выглядит так: O(n) , где n – размер множества.

5*. Замените цикл for в примере ниже на 2 другие структуры (представьте, что for в классическом виде использовать нельзя, но код должен вернуть требуемый результат).

Пример – IDE
-----
lst = [2, 4, 5, 8, 9, 13]
for number in range(len(lst)):
____lst[number] *= number
print(lst)

Результат выполнения
---
[0, 4, 10, 24, 36, 65]

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

Цикл for в приведенном примере легко заменяется списковым включением или функцией map.

1 - Списковое включение

Пример – IDE
----
lst = [2, 4, 5, 8, 9, 13]
lst = [lst[number] * number for number in range(len(lst))]
print(lst)

Результат выполнения
----
[0, 4, 10, 24, 36, 65]
2 – Функция map()

2 – Функция map()

Пример – IDE
----
lst = [2, 4, 5, 8, 9, 13]
lst = list(map(lambda number: number * lst.index(number), lst))
print(lst)

Результат выполнения
----
[0, 4, 10, 24, 36, 65]

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) ). Постарайтесь найти самое оптимальное решение. Результат представьте в виде списка (не забудьте отсортировать по возрастанию).

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'Ты – свой. Приветствую, любезный !') 

Результат выполнения

 >Агент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() 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] 

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

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