Сборник упражнений и задач
по основам Python
Наш задачник по языку программирования Python содержит как стандартные, так и более продвинутые упражнения и задачи на закрепление теоретических основ излагаемых в учебнике. На данный момент в задачнике представлено более 240 задач и упражнений по Питону с готовыми решениями и ответами. Однако не забывайте, что нужно стараться получать результат самостоятельно. Если же вы не смогли одолеть какое-то задание и посмотрели ответ, закройте его и наберите код вручную, ведь нашей конечной целью является не чтение задач, а практика и успешное их решение.
Все задачи и упражнения сборника сгруппированы по разделам. Каждый раздел в основном начинается с простых вводных заданий и упражнений, решения которых доступны без авторизации и подписки. Далее следуют непосредственно сами задачи, при чем по возможности в порядке возрастания их сложности.
- Чтобы посмотреть результат выполнения исходного кода решений, используйте кнопку «Результат».
- Чтобы окно консоли после выполнения скрипта сразу не закрывалось, дописывайте в конец скрипта инструкцию input().
- Числа и математические выражения
- Текстовые строки
- Списки
- Кортежи
- Словари
- Множества
- Линейные алгоритмы
- Логические выражения
- Условная инструкция if/elif/else
- Циклы for и while
- Итерации и генераторы
- Функции
- ООП: классы и объекты
- Импорт, модули и пакеты
- Файлы и каталоги
- Обработка исключений
- Утилита pip и виртуальные окружения
- Дата и время
- Олимпиадные задачи
- Первые утилиты, скрипты и программы
- Приложения с GUI
Задачи на числа и математические выражения
Теоретический материал по числам, математическим операциям и модулю math можно почитать в нашем учебнике здесь.
1.1. Выведите на экран строковые представления числа 53 в двоичной, восьмеричной и шестнадцатеричной системах счисления. Показать решение.
# Переводим число в требуемые СС.
print('53 в 2-й СС:', bin(53))
print('53 в 8-й СС:', oct(53))
print('53 в 16-й СС:', hex(53))
53 в 2-й СС: 0b110101 53 в 8-й СС: 0o65 53 в 16-й СС: 0x35
1.2. Даны строковые представления чисел: '011011101' (двоичная СС), '357' (восьмеричная СС) и 'AF23D' (шестнадцатеричная СС). Выведите на экран строковые представления этих чисел в десятичной системе счисления. Показать решение.
# Представление числа в 2-й СС.
num_bin = '011011101'
# Выведет 221 (10-я СС).
print(int(num_bin, base=2))
# Представление числа в 8-й СС.
num_oct = '357'
# Выведет 239 (10-я СС).
print(int(num_oct, base=8))
# Представление числа в 16-й СС.
num_hex = 'AF23D'
# Выведет 717373 (10-я СС).
print(int(num_hex, base=16))
221 239 717373
1.3. Зная, что 1372 является числом в восьмеричной системе счисления, выведите на экран значение этого числа в десятичной системе счисления. Показать решение.
# Сохраним число в переменной.
num_oct = str(1372)
# Выведет 762 (10-я СС).
print(int(num_oct, base=8))
762
1.4. Представьте вещественные числа 275.4, 0.0032 и 3.45 в коде Python в стандартном виде. Напомним, что в математике число в такой форме имеет вид a*10n, где 1 ≤ a < 10, а n – целое число. Например, для числа 0.123 получим 1.23*10-1. Показать решение.
# 275.4.
num_1 = 2.754e2
print(num_1)
# 0.0032.
num_2 = 3.2e-3
print(num_2)
# 3.45.
num_3 = 3.45E0
print(num_3)
275.4 0.0032 3.45
1.5. Найдите наименьшую обыкновенную дробь, равную вещественному числу 14.375, и выведите ее на экран в формате '14.375 = числитель/знаменатель'. Показать решение.
# Получаем числ. и знам., т.е. кортеж (115, 8).
num = 14.375.as_integer_ratio()
# Составляем и выводим строку.
print('14.375 = ', num[0], '/', num[1], sep='')
14.375 = 115/8
1.6. Дано комплексное число 7.5+1.35j. Выведите на экран его действительную и мнимую части, а также число, сопряженное к данному. Показать решение.
1.7. Даны два действительных числа a и b. Вычислите их сумму, разность, произведение и частное при a=3.79 и b=84.93. Округлите результаты до сотых и выведите их на экран. Показать решение.
1.8. Вычислите значение выражения (10/2.3 - 34)*0.7 + 90.5, округлив результат до трех знаков после десятичной точки и найдя его модуль. Показать решение.
1.9. Найдите значение выражения в десятичной системе счисления: (1EA16 + 010111012 - 2378 - 68110)*21023. Выведите результат на экран. Показать решение.
1.10. Извлеките квадратный корень из 196 тремя способами. Показать решение.
1.11. Выведите на экран результат вычисления sin(π/6) и cos(45°) округлив результат до двух знаков после десятичной точки. Показать решение.
1.12. Вычислите значение арифметического выражения при заданных значениях переменных и выведите полученный результат на экран: 5.2a3 + 3b5 - 7.3 при a=3, b=2.5. Показать решение.
1.13. Вычислите значение арифметического выражения при заданных значениях переменных и выведите полученный результат на экран: x(3.3 + 2y) - |64:(x + y)| при x=-4.1, y=2. Показать решение.
1.14. Вычислите значение арифметического выражения при заданных значениях переменных и выведите полученный результат на экран: |m(2m-1) - 35.5|:(3n + 0.8m)2 при m=2, n=5. Показать решение.
1.15. Вычислите значение арифметического выражения при заданных значениях переменных и выведите полученный результат на экран: ln|a2 - 1.5a:b| + e3 при a=5.73, b=1.7. Показать решение.
1.16. Вычислите значение арифметического выражения при заданных значениях переменных и выведите полученный результат на экран: log4(7x - 3y) + √(lg|10xy|) при x=4, y=-3. Показать решение.
1.17. Вычислите значение арифметического выражения при заданных значениях переменных и выведите полученный результат на экран: √(log2(mn+2 - 3e)):(ln(2m) + lg(4n)) при m=5, n=2. Показать решение.
1.18. Запишите арифметическое выражение на языке Python в виде строки, а затем выведите полученный результат на экран: cos2(3a - 1) - sin(5a - b)3. Показать решение.
1.19. Запишите арифметическое выражение на языке Python в виде строки, а затем выведите полученный результат на экран: 3tg|√(x + y2) - π| - arctg3(√x + y2). Показать решение.
1.20. Запишите арифметическое выражение на языке Python в виде строки, а затем выведите полученный результат на экран: √(arccos3x - arcsin2y)/arctg|x2 - y2| + 5√π. Показать решение.
1.21. Вычислите значение арифметического выражения |3√π4 - 8eπ|/ln9.7. Округлите результат до сотых и выведите его на экран. Показать решение.
Задачи на строки
Теоретический материал по строкам можно почитать в нашем учебнике здесь.
Не забываем, что строки относятся к неизменяемому типу данных, поэтому изменить их непосредственно не получится. Но всегда можно получить измененную копию строки и заменить ею хранящуюся в переменной исходную строку.
2.1. Составьте и выведите на экран пользователя строку, в которой через запятую перечислите целое, вещественное и комплексное числа в формате «'int', 'float', 'complex'». Реализуйте вывод двумя способами, использовав в качестве внешних двойные и одинарные кавычки. Показать решение.
'''1-й вариант'''
# Экранировать ничего не нужно.
print("'71', '2.37', '-0.2+3j'")
'''2-й вариант'''
# Экранируем символы кавычек.
print('\'71\', \'2.37\', \'-0.2+3j\'')
'71', '2.37', '-0.2+3j'
'71', '2.37', '-0.2+3j'
2.2. Составьте и выведите на экран пользователя строку-матрешку с содержимым «'4 + "3 + '2 + "1 + '0' " ' " '». Реализуйте вывод четырьмя способами, использовав в качестве внешних все виды кавычек, разрешенных для строк. Показать решение.
'''1-й вариант'''
# Экранируем символы соответствующих кавычек.
матрешка = "'4 + \"3 + '2 + \"1 + '0' \" ' \" '"
print(матрешка)
'''2-й вариант'''
# Экранируем символы соответствующих кавычек.
матрешка = '\'4 + "3 + \'2 + "1 + \'0\' " \' " \''
print(матрешка)
'''3-й вариант'''
# Используем многострочные комментарии.
матрешка = """'4 + "3 + '2 + "1 + '0' " ' " '"""
print(матрешка)
'''4-й вариант'''
# Используем многострочные комментарии.
матрешка = ''''4 + "3 + '2 + "1 + '0' " ' " \''''
print(матрешка)
'4 + "3 + '2 + "1 + '0' " ' " '
'4 + "3 + '2 + "1 + '0' " ' " '
'4 + "3 + '2 + "1 + '0' " ' " '
'4 + "3 + '2 + "1 + '0' " ' " '
2.3. Необходимо вывести на экран пользователя строку с адресом '..\new_dir\tables.py'. Реализуйте вывод двумя способами. Показать решение.
'''1-й вариант'''
# Используем сырую строку.
str_1 = r'..\new_dir\tables.py'
print(str_1, end='\n\n')
'''2-й вариант'''
# А здесь экранируем сами слеши.
str_2 = '..\\new_dir\\tables.py'
print(str_2)
..\new_dir\tables.py
..\new_dir\tables.py
2.4. Дана строка '123456789'. Используя операции индексирования и среза выведите на экран третий и пятый символы, а также подстроку '567'. Реализуйте вывод двумя способами: используя только положительные индексы и только отрицательные. Показать решение.
Ответ. Не забываем, что индексация символов строки начинается с 0, а при использовании отрицательных индексов – с -1. Кроме того, при взятии среза нужно помнить, что символ с индексом равным последнему пределу среза в результат не попадает.
# Сохраним строку в переменной.
str_1 = '123456789'
# Выводим на экран 3-й символ.
print('str_1[2] ->', str_1[2])
print('str_1[-7] ->', str_1[-7], end='\n\n')
# Выводим на экран 5-й символ.
print('str_1[4] ->', str_1[4])
print('str_1[-5] ->', str_1[-5], end='\n\n')
# Теперь выведем подстроку.
print('str_1[4:7] ->', str_1[4:7])
print('str_1[-5:-2] ->', str_1[-5:-2])
str_1[2] -> 3
str_1[-7] -> 3
str_1[4] -> 5
str_1[-5] -> 5
str_1[4:7] -> 567
str_1[-5:-2] -> 567
2.5. Дана строка 'AaBbCcDd'. Используя срезы с шагом получите две строки: только с заглавными и только со строчными буквами. Выведите их на экран. Показать решение.
# Сохраним строку в переменной.
str_1 = 'AaBbCcDd'
# Выводим на экран требуемые строки.
print('str_1[::2] ->', str_1[::2], end='\n\n')
# Смещаем вывод на единицу.
print('str_1[1::2]->', str_1[1::2])
str_1[::2] -> ABCD
str_1[1::2] -> abcd
2.6. Измените строку 'кот', записав ее символы в обратном порядке. Выведите результат на экран. Показать решение.
# Сохраняем строку в переменной.
s = 'кот'
# Получаем строку-перевертыш.
s = s[::-1]
# Выводим ее на экран.
print(s)
ток
2.7. Дана строка '0123456789'. Удалите из нее первый, пятый и последний символы. Выведите результат на экран. Показать решение.
2.8. При помощи строк '.', '!' и ' ' (один пробел) сформируйте новую строку '..... ! ! ! .....' и выведите ее на экран. Разрешается использовать только операторы + и . Показать решение.
2.9. Дана строка 'Вот и пришла осень золотая!'. Возьмите ее в кавычки «» и выведите результат на экран. Шестнадцатиричные коды кавычек в Юникоде: 00AB и 00BB. Показать решение.
2.10. Подсчитайте количество символов в строке '1a\u0398\t\u03B43s'. Сделайте это сперва устно, а затем проверьте себя программно. Показать решение.
2.11. Удалите в строке ' a b c d e f ' все пробелы и выведите результат на экран. Показать решение.
2.12. Дана строка "..-.--..-.--". После каждой точки допишите еще по одной точке и выведите результат на экран. Показать решение.
2.13. Дана строка '131231442145'. Подсчитайте в ней количество символов '1' и выведите результат на экран. Показать решение.
2.14. Посчитайте устно, а затем проверьте себя, выведя на экран сумму индексов символа 'а' в строках 'повар' и 'Пайтон'. Показать решение.
2.15. Даны две переменные: a = 73 и b = 95. Используя метод форматирования строк, выведите на экран их сумму и произведение в форматах 'a + b = c' и 'a*b = c'. Повторите тоже самое, но использовав для этого F-строки. Показать решение.
2.16. Дана строка 'ABCDEF'. Поменяйте в ней первый и последний символы местами и выведите итоговую строку на экран. Показать решение.
2.17. Допишите в конец строки 'автопрогон' ее длину и выведите результат на экран. Показать решение.
2.18. Дана строка 'в Ереване'. Подсчитайте в ней количество русских символов 'е' в любом регистре и выведите результат на экран. Показать решение.
2.19. Подсчитайте количество слов в строке 'Вот и пришла осень золотая!'. Разделителем слов считайте пробел. Выведите результат подсчета на экран. Показать решение.
2.20. Найдите количество вхождений подстроки 'ab' в строку 'ab bc ab bd ab be' и поменяйте в каждом случае символы 'a' и 'b' местами. Выведите результаты на экран. Показать решение.
2.21. Определите совпадает ли количество круглых открывающихся и круглых закрывающихся скобок в строке 'abs(math.sin(pow((5*a - b), 3)))'. Выведите результат проверки на экран в виде сообщения. Показать решение.
2.22. Определите есть ли в строке 'Земля-2022' хотя бы один символ арабской цифры от нуля до девяти и выведите результат проверки на экран. Показать решение.
2.23. Подсчитайте общее количество алфавитных символов Юникода в строке 'a1, b2, c3, e4, d5, f6.' и выведите результат на экран. Показать решение.
2.24. Подсчитайте количество цифр 7 дробной части десятичного числа 377.37177785772707. Показать решение.
2.25. Составьте строку, состоящую из заглавных букв латинского алфавита, и выведите ее на экран. В таблице символов Юникода заглавные буквы латинского алфавита занимают диапазон номеров с 65 по 90. Показать решение.
2.26. Выведите на экран сумму числовых кодов символов строки 'два пижона'. Показать решение.
2.27. Подсчитайте количество русских букв в строке 'Camel - это же верблюд, а не ёж!' и выведите результат на экран. В таблице символов Юникода строчные буквы русского алфавита занимают диапазон номеров с 1040 по 1103, а также 1025 и 1105 для букв Ё и ё. Показать решение.
2.28. Дана строка '_*..*..*_'. Замените в ней все символы '*' числами, которые соответствуют их номеру вхождения в строку (первая слева имеет номер вхождения один и т.д.). Выведите измененную строку на экран. Показать решение.
2.29. Подсчитайте, сколько видов букв присутствует в строке 'синхрофазотрон', и выведите результаты на экран. Показать решение.
2.30. Дана строка 'акваланг'. Замените в ней все символы 'а' числами, которые соответствуют индексу этого символа в строке. Выведите измененную строку на экран. Показать решение.
2.31. Подсчитайте количество каждого вида символов в строке 'выхухоль' и выведите результаты на экран. Показать решение.
2.32. Измените строку 'Чья это корова там замычала?' таким образом, чтобы символы в словах были записаны в обратном порядке. Разделителем слов считайте пробел. Выведите результат на экран. Показать решение.
2.33. Дано строковое представление времени таймера '03:25:57'. Выведите на экран количество секунд, оставшихся до момента срабатывания таймера. Используйте формат сообщения «До срабатывания таймера осталось {n} сек.». Показать решение.
Задачи на списки
Теоретический материал по спискам можно почитать в нашем учебнике здесь.
Не забываем, что списки, в отличие от строк и кортежей, мы можем изменять непосредственно.
3.1. Используя операции индексирования и среза выведите на экран первый и третий элементы списка [1, 2, 3, 4, 5], а также срез списка из первых трех элементов. Реализуйте вывод двумя способами: используя только положительные и только отрицательные индексы. Показать решение.
Ответ. Не забываем, что индексация символов строк, списков и кортежей начинается с 0, а при использовании отрицательных индексов – с -1. Кроме того, при взятии среза нужно помнить, что символ с индексом равным последнему пределу среза в результат не попадает.
# Сохраним список в переменной.
li = [1, 2, 3, 4, 5]
# Выводим на экран 1-й элемент.
print('li[0] ->', li[0])
print('li[-5] ->', li[-5], end='\n\n')
# Выводим на экран 3-й элемент.
print('li[2] ->', li[2])
print('li[-3] ->', li[-3], end='\n\n')
# Теперь выведем срез.
print('li[:3] ->', li[:3])
print('li[0:-2] ->', li[0:-2])
li[0] -> 1
li[-5] -> 1
li[2] -> 3
li[-3] -> 3
li[:3] -> [1, 2, 3]
li[0:-2] -> [1, 2, 3]
3.2. Дан список [[1, 2, ['Ok!', 3]], ['list', 4], 5]. Выведите на экран строку 'Ok!', использовав синтаксис доступа к элементу списка по его индексу. Показать решение.
# Сохраняем список в переменной.
li = [[1, 2, ['Ok!', 3]], ['list', 4], 5]
# Используем цепочку доступа по индексу.
print(li[0][2][0])
Ok!
3.3. Создайте список-матрешку, в который поместите два элемента: целое число и вложенный список, в который поместите еще два элемента: вещественное число и вложенный список, в который поместите еще два элемента: комплексное число и вложенный список, в который поместите еще два элемента: строку и пустой список. Выведите на экран конечную строку. Показать решение.
# Создаем наш список-матрешку.
li = [1, [0.2, [0.3+4j, ['5р.', []]]]]
# Выводим на экран нужное значение.
print(li[1][1][1][0])
5р.
3.4. Дан список ['Санкт', '+', 'Петербург']. Исправьте плюс на дефис и выведите название города на экран использовав доступ к элементам списка по индексам. Показать решение.
# Сохраним список в переменной.
li = ['Санкт', '+', 'Петербург']
# Меняем знак на верный.
li[1] = '-'
# Выводим название на экран.
print(li[0], li[1], li[2], sep='', end='\n\n')
Санкт-Петербург
3.5. Дан список ['a', '1', 'b', '2', 'c', '3']. Разбейте его на два списка: только с буквами и только с числами. Сам список затем удалите, а новые списки выведите на экран, каждый на отдельной строке. Показать решение.
# Сохраним список в переменной.
li = ['a', '1', 'b', '2', 'c', '3']
# Получаем требуемые срезы.
li_1 = li[0::2]
li_2 = li[1::2]
# Сам список удаляем.
del li
# Выводим полученные списки на экран.
print(li_1, li_2, sep='\n\n')
['a', 'b', 'c']
['1', '2', '3']
3.6. Замените в списке [1, 2, 3, 4, 5] первые три элемента их суммой. Затем добавьте в конец списка число 7. Переместите первый элемент конечного списка в предпоследнюю позицию списка. Выведите список на экран. Используйте в решении только доступ по индексу и срезы. Показать решение.
3.7. Дан список [3, 4, 1, 1, 5, 1]. Выведите на экран: количество всех элементов в списке, количество единиц в списке, индекс первого вхождения единицы в список. Показать решение.
3.8. Дан пустой список []. Используя методы списков: добавьте в него строку 'a', в конец списка еще и строку 'b', расширьте список за счет списка ['c', 'e'], вставьте в список перед 'e' строку 'd'. Выведите конечный результат на экран. Показать решение.
3.9. В предыдущей задаче должен был получиться список ['a', 'b', 'c', 'd', 'e']. Используя методы списков: удалите из него последний элемент, инверсируйте список (измените порядок следования элементов на обратный), удалите элемент со значением 'c', очистите список. Показать решение.
3.10. Дан список неповторяющихся целых чисел [3, -54, 25, 8, 0]. Выведите на экран: сумму его элементов, разность максимального и минимального значений. Показать решение.
3.11. Дан список чисел [7, 7, -4, 2.5, -.9, 0]. Выведите на экран количество отрицательных элементов. Показать решение.
3.12. Дан список неповторяющихся вещественных чисел [0.3, -2.4, 4.5, 0.0, -3.1]. Выведите на экран индекс минимального элемента. Показать решение.
3.13. Дан список целых чисел [9, -3, 5, 0, -3]. Выведите на экран сумму абсолютных значений его элементов. Показать решение.
3.14. Дан список неповторяющихся целых чисел [9, -210, 0, 500, -37]. Поменяйте местами максимальный и минимальный элементы списка. Выведите измененный список на экран. Показать решение.
3.15. Дан список целых чисел [3, 2, 3, 2, 1, 4]. Расположите числа в порядке убывания их значений, а затем добавьте в конец списка его длину. Выведите измененный список на экран. Показать решение.
3.16. Дан список [True, 5, 'go', 3+0.1j]. Циклически сдвиньте все его элементы на одну позицию вправо так, чтобы li[0] перешел на место li[1], li[1] — на место li[2], ..., а последний элемент перешел на место li[0]. Выведите измененный список на экран. Показать решение.
3.17. Дан список натуральных чисел [13, 5, 5, 8, 16, 4]. Удалите из него первое четное число, имеющее нечетный индекс. Выведите измененный список на экран. Показать решение.
3.18. Дан список строк ['уж', 'змея', '', 'питон']. Удалите из него все строки с длиной менее пяти символов и выведите результат на экран. Показать решение.
3.19. Дан список ['три', [2, 5], 0.7, 'home']. Создайте список типов элементов данного списка и выведите результат на экран. Показать решение.
3.20. Дан список [1.0, 'ok', True, 'ok', 7, 1]. Удалите из него повторяющиеся элементы (в списке не должно остаться дублей). Выведите измененный список на экран. Будьте внимательны! Значения 1.0, True и 1 – это не дубли! Показать решение.
3.21. Даны два списка строк ['1', 'True', 'ok'] и ['no', 'True', 'no']. Сформируйте новый список, который будет состоять из строк, которые присутствуют хотя бы в одном из списков. Выведите полученный список на экран. Показать решение.
3.22. Дан список [1, None, 3.0, [1, 2], 'b']. Поменяйте в нем соседние элементы местами. Т.к. число элементов в списке нечетное, последний элемент оставьте на своем месте. Выведите измененный список на экран. Показать решение.
Задачи на кортежи
Теоретический материал по кортежам можно почитать в нашем учебнике здесь.
Не забываем, что кортежи относятся к неизменяемому типу данных, поэтому изменить их непосредственно не получится. Но всегда можно получить измененную копию кортежа и заменить ею хранящийся в переменной исходный кортеж. Следует заметить, что практически все задачи для списков можно адресовать и кортежам, т.к. они легко конвертируемы в списки и обратно при помощи конструкторов list(tpl) и tuple(li). Однако кортежи в основном предназначены для хранения неизменяемых данных, поэтому для них первостепенными следует считать задачи по извлечению значений и получению индексов элементов.
4.1. Создайте кортеж, в качестве элементов которого используйте целое, вещественное и комплексное числа, кортеж с одним элементом в виде строки, пустой кортеж и пустой список. Выведите на экран строку вложенного кортежа. Показать решение.
Ответ. Не забываем, что при создании кортежа с одним элементом нужно завершать его запятой, иначе интерпретатор не отличит кортеж от простого выражения.
# Создаем кортеж.
tpl = (1, 0.2, 0.3+4j, ('5',), (), [])
# Выводим строку вложенного кортежа на экран.
print(tpl[3][0])
5
4.2. Создайте кортеж-матрешку, в который поместите два элемента: целое число и вложенный кортеж, в который поместите еще два элемента: вещественное число и вложенный кортеж, в который поместите еще два элемента: комплексное число и вложенный кортеж, в который поместите еще два элемента: строку и пустой кортеж. Выведите на экран конечную строку. Обратите внимание на схожесть решения с задачей 3.3. Показать решение.
# Создаем наш кортеж-матрешку.
tpl = (1, (0.2, (0.3+4j, ('5р.', ()))))
# Выводим на экран нужное значение.
print(tpl[1][1][1][0])
5р.
4.3. Используя операции индексирования и среза выведите на экран первый и третий элементы кортежа (1, 2, 3, 4, 5), а также срез кортежа из первых трех элементов. Реализуйте вывод двумя способами: используя только положительные и только отрицательные индексы. Обратите внимание на схожесть решения и результатов с задачей 3.1. Показать решение.
Ответ. Не забываем, что индексация символов строк, списков и кортежей начинается с 0, а при использовании отрицательных индексов – с -1. Кроме того, при взятии среза нужно помнить, что символ с индексом равным последнему пределу среза в результат не попадает.
# Сохраним кортеж в переменной.
tpl = (1, 2, 3, 4, 5)
# Выводим на экран 1-й элемент.
print('tpl[0] ->', tpl[0])
print('tpl[-5] ->', tpl[-5], end='\n\n')
# Выводим на экран 3-й элемент.
print('tpl[2] ->', tpl[2])
print('tpl[-3] ->', tpl[-3], end='\n\n')
# Теперь выведем срез.
print('tpl[:3] ->', tpl[:3])
print('tpl[0:-2] ->', tpl[0:-2])
tpl[0] -> 1
tpl[-5] -> 1
tpl[2] -> 3
tpl[-3] -> 3
tpl[:3] -> (1, 2, 3)
tpl[0:-2] -> (1, 2, 3)
4.4. Дан кортеж ((1, 2, ('Ok!', 3)), ('tuple', 4), 5). Выведите на экран строку 'Ok!', использовав синтаксис доступа к элементу кортежа по его индексу. Обратите внимание на схожесть решения и результатов с задачей 3.2. Показать решение.
4.5. Дан кортеж (3, 's', 1, 5, 's'). Выведите на экран: количество всех элементов кортежа, количество строк 's', индекс первого вхождения 's' в кортеж. Показать решение.
4.6. Дан кортеж (['кит', 1, 3], 5). Замените в списке 'кит' на 'кот', удалите единицу, а также измените значение последнего элемента списка, возведя тройку в квадрат. Выведите кортеж на экран. Попробуйте изменить второй элемент кортежа, умножив его на два. Объясните результат. Показать решение.
Задачи на словари
Теоретический материал по словарям можно почитать в нашем учебнике здесь.
5.1. Создайте словарь d = {'1': 0, 2: 0, '3': 0} тремя способами. Выведите полученный словарь на экран. Показать решение.
''' 1-й вариант '''
# Создаем при помощи фигурных скобок.
d_1 = {'1': 0, 2: 0, '3': 0}
# Выводим словарь на экран.
print(d_1, end='\n\n')
''' 2-й вариант '''
# Используем конструктор и список пар.
d_2 = dict([('1', 0), (2, 0), ('3', 0)])
# Выводим словарь на экран.
print(d_2, end='\n\n')
''' 3-й вариант '''
# Создаем при помощи метода класса.
d_3 = {}.fromkeys(['1', 2, '3'], 0)
# Выводим словарь на экран.
print(d_3)
{'1': 0, 2: 0, '3': 0}
{'1': 0, 2: 0, '3': 0}
{'1': 0, 2: 0, '3': 0}
5.2. Создайте словарь содержащий данные о человеке. В качестве ключей используйте строки 'имя', 'возраст' и 'пол'. Значения придумайте самостоятельно. Выведите полученный словарь на экран. Показать решение.
''' 1-й вариант '''
# Пары «ключ: значение» перечисляем через запятую.
person = {'имя': 'Олег', 'пол': 'муж.', 'возраст': 25}
print(person)
''' 2-й вариант '''
# Используем пары «идентификатор = значение».
person = dict(имя = 'Олег', пол = 'муж.', возраст = 25)
print(person)
''' 3-й вариант '''
# Используем список с кортежами пар.
person = dict([('имя', 'Олег'), ('пол', 'муж.'), ('возраст', 25)])
print(person)
{'имя': 'Олег', 'пол': 'муж.', 'возраст': 25}
{'имя': 'Олег', 'пол': 'муж.', 'возраст': 25}
{'имя': 'Олег', 'пол': 'муж.', 'возраст': 25}
5.3. Дан словарь d = {'1': 1.29, '2': 0.43}. Используя доступ к элементам словаря по ключу, найдите произведение 1.29*0.43, после чего добавьте результат в словарь, а затем выведите значение нового элемента на экран. Показать решение.
# Сохраняем словарь в переменной.
d = {'1': 1.29, '2': 0.43}
# Вычисляем произведение и заносим в словарь.
d['3'] = d['1']*d['2']
# Выведет 0.5547.
print("1.29*0.43 =", d['3'])
1.29*0.43 = 0.5547
5.4. Найдите представления ключей, значений и элементов словаря d = {1: 1, '2': 2, '3': 3, 4: 4}. Выведите их на экран в виде списков. Показать решение.
# Сохраняем словарь в переменной.
d = {1: 1, '2': 2, '3': 3, 4: 4}
# Сохраняем представления в переменных.
k = d.keys()
v = d.values()
i = d.items()
# Выводим их все на экран.
print('Ключи:', list(k))
print('Значения:', list(v))
print('Эл-ты:', list(i))
Ключи: [1, '2', '3', 4]
Значения: [1, 2, 3, 4]
Эл-ты: [(1, 1), ('2', 2), ('3', 3), (4, 4)]
5.5. Сколько элементов будет содержать словарь d_1 = {'1': 1, '2': 2} после добавления к нему элементов словаря d_2 = {'2': 'two', '3': 3}? Каковы будут значения элементов итогового словаря? Проверьте свой ответ программно. Показать решение.
Ответ. В ходе выполнения инструкции d_1.update(d_2) элементы второго словаря добавляются в первый, замещая собой в случае необходимости элементы первого словаря с идентичными ключами. Следовательно, итоговый словарь будет состоять из трех элементов и иметь вид {'1': 1, '2': 'two', '3': 3}.
# Сохраняем словари в переменных.
d_1 = {'1': 1, '2': 2}
d_2 = {'2': 'two', '3': 3}
# Обновляем 1-й словарь за счет 2-го.
d_1.update(d_2)
# Выводим итоговый словарь на экран.
print("d_1.update(d_2) ->", d_1, end='\n\n')
# Выводим кол-во эл-тов словаря.
print("len(d_1) ->", len(d_1))
d_1.update(d_2) -> {'1': 1, '2': 'two', '3': 3}
len(d_1) -> 3
5.6. Удалите из словаря d = {'a': 1, 'b': 2, 'c': 3} элементы d['a'] и d['c'], использовав для второго элемента оператор удаления, а для первого имеющийся у словарей метод. Выведите результат на экран, после чего очистите словарь. Показать решение.
5.7. Требуется создать словарь colors для хранения информации о представлениях цветов HTML в виде специальных названий, а также в цветовой модели RGB в десятичном и шестнадцатеричном форматах. Сохраните в словаре информацию для черного, серого и белого цветов. В HTML эти цвета могут задаваться, соответственно:
- по названиям: black, grey и white;
- в 10-м формате: rgb(0, 0, 0), rgb(128, 128, 128) и rgb(255, 255, 255);
- в 16-м формате: #000000, #808080 и #FFFFFF.
5.8. Создайте словарь-матрешку, в который поместите элемент со строковым ключом в формате целого числа и значением в виде вложенного словаря, в который поместите элемент со строковым ключом в формате вещественного числа и значением в виде вложенного словаря, в который поместите элемент со строковым ключом в формате комплексного числа и значением в виде вложенного словаря, в который поместите элемент со строковым ключом в формате пустого списка и значением в виде вложенного словаря, в который поместите элемент со строковым ключом в формате кортежа с одним элементом и значением в виде строки 'Ok!'. Выведите на экран конечную строку. Показать решение.
5.9. Дан список ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс']. Создайте словарь с ключами 'd1', 'd2', ..., соответствующими индексам элементов списка. Выведите на экран элемент словаря, который соответствует среде, в формате ключ: значение. Показать решение.
5.10. Дан словарь с натуральными ключами {1: 'Один', 2: 'Два', 3: 'Три', 100: 'сто'}. Выведите на экран сумму ключей, максимальное и минимальное значения ключей, а также их количество. Показать решение.
5.11. Дан словарь со значениями констант {'pi': 3.14, 'e': 2.71, 'fi': 1.62}. Выведите на экран значения констант, которые превышают число 2.5. Показать решение.
5.12. Поменяйте в словаре d = {1: '1', 2: '2', 3: '3', 4: '4'} ключи и значения местами. Выведите итоговый словарь на экран. Показать решение.
5.13. Удалите из словаря d = {1: 1, '2': 2, '3': 3, 4: 4} все элементы со строковыми ключами. Помните, что изменение размеров словаря во время итерации может привести к ошибке, поэтому для работы используйте копию словаря. Выведите итоговый словарь на экран. Показать решение.
5.14. Дан словарь с товарами. Выведите на экран все товары, цена которых не превышает 100 рублей, а текущий остаток не менее 10 кг. Показать решение.
goods = {
"apple": {"name": "Яблоки", "cost": 25, "kg": 30},
"pear": {"name": "Груши", "cost": 50, "kg": 5},
"plum": {"name": "Сливы", "cost": 55, "kg": 25},
"cherry": {"name": "Вишни", "cost": 110, "kg": 15}
}
Задачи на множества
Теоретический материал по множествам можно почитать в нашем учебнике здесь.
6.1. Создайте множество, в качестве элементов которого используйте целое, вещественное и комплексное числа, а также строки в формате кортежа, списка и словаря, содержащих по одному элементу. Выведите полученное множество на экран. Показать решение.
Ответ. Не забываем, что при создании множества следует использовать только неизменяемые элементы.
# Создаем множество.
st = {1, 0.2, 0.3+4j, '(5,)', '[6]', '{7: 8}'}
# Выводим его на экран.
print(st)
{0.2, 1, '[6]', '{7: 8}', '(5,)', (0.3+4j)}
6.2. Дано множество {'a', 'b', 'c'}. Удалите из него строку 'c', а затем добавьте элемент 'd'. Выведите итоговое множество на экран. Показать решение.
# Сохраняем множество в переменной.
s = {'a', 'b', 'c'}
# Удаляем указанный эл-т.
s.remove('c')
# Добавляем эл-т.
s.add('d')
# Выводим итог на экран.
print(s)
{'a', 'b', 'd'}
6.3. Даны множества {'a', 'b'} и {'b', 'c'}. Множества простые, поэтому сперва назовите результат их объединения, пересечения, разности и симметричной разницы устно, а затем проверьте себя, выведя результаты на экран. Показать решение.
# Сохраняем множества в переменных.
s_1 = {'a', 'b'}
s_2 = {'b', 'c'}
# Объединение: {'b', 'c', 'a'}.
print('s_1 | s_2 ->', s_1 | s_2)
# Пересечение: {'b'}.
print('s_1 & s_2 ->', s_1 & s_2)
# Разность: {'a'}.
print('s_1 - s_2 ->', s_1 - s_2)
# Сим. разность: {'c', 'a'}.
print('s_1 ^ s_2 ->', s_1 ^ s_2)
s_1 | s_2 -> {'b', 'c', 'a'}
s_1 & s_2 -> {'b'}
s_1 - s_2 -> {'a'}
s_1 ^ s_2 -> {'c', 'a'}
6.4. Решите предыдущую задачу, использовав для получения результатов соответствующие методы класса set. Показать решение.
# Сохраняем множества в переменных.
s_1 = {'a', 'b'}
s_2 = {'b', 'c'}
# Объединение: {'b', 'c', 'a'}.
res = set.union(s_1, s_2)
print('set.union(s_1, s_2) ->', res)
# Пересечение: {'b'}.
res = set.intersection(s_1, s_2)
print('set.intersection(s_1, s_2) ->', res)
# Разность: {'a'}.
res = set.difference(s_1, s_2)
print('set.difference(s_1, s_2) ->', res)
# Сим. разность: {'c', 'a'}.
res = set.symmetric_difference(s_1, s_2)
print('set.symmetric_difference(s_1, s_2) ->', res)
set.union(s_1, s_2) -> {'c', 'a', 'b'}
set.intersection(s_1, s_2) -> {'b'}
set.difference(s_1, s_2) -> {'a'}
set.symmetric_difference(s_1, s_2) -> {'c', 'a'}
6.5. Дано множество целых чисел {-3, 8, 15, -5, 0, 7}. Выведите на экран произведение максимального и минимального элементов, сумму элементов не превышающих 7. Показать решение.
# Сохраним множество в переменной.
st = {-3, 8, 15, -5, 0, 7}
# Выводим произведение макс. и мин. эл-тов.
print('max(st)*min(st) =', max(st)*min(st))
''' 1-й вариант '''
# Стартовое значение суммы.
sm = 0
# Суммируем эл-ты циклом.
for el in st:
# Но сперва проверяем условие.
if el <= 7: sm += el
# Выводим сумму на экран.
print('Сумма эл-тов не превыш-х 7:', sm)
''' 2-й вариант '''
# Встр-ная ф-ция + генератор множеств.
res = sum({x for x in st if x <= 7})
# Выводим сумму на экран.
print('Сумма эл-тов не превыш-х 7:', res)
max(st)*min(st) = -75
Сумма эл-тов не превыш-х 7: -1
Сумма эл-тов не превыш-х 7: -1
6.6. Определите есть ли в строке 'Купить, нельзя оставить!' хотя бы одна точка или запятая. Выведите результат проверки на экран. Показать решение.
6.7. Даны три слова 'аквариум', 'мармелад' и 'рама'. Выведите на экран сперва все виды букв, которые присутствуют во всех словах сразу, а затем все виды букв, которые присутствуют в любом из них. Показать решение.
6.8. Даны три числа: 30, 5 и 25. Выведите на экран наименьшее из них, использовав для этого программную проверку. Показать решение.
6.9. Даны два списка ников ['ivan2022', 'sveta', 'ivan', 'kot23', 'sveta', 'ivan'] и ['koly', 'enot37', 'luzer', 'kot23', 'sveta']. Сколько уникальных ников представлено в обоих списках? В каком списке уникальных ников содержится больше? Выведите результаты на экран. Показать решение.
6.10. Сформируйте и выведите на экран множество из всех подходящих для этого элементов списка [True, 0, 1, False, 2+3.4j, 5, '5', (6, 7), [8, 9], {'10': 10}]. Объясните конечный результат. Используйте для решения задачи генератор множеств и класс Hashable модуля collections.abc для проверки хешируемости элементов списка. Показать решение.
Задачи на линейные алгоритмы
Линейный алгоритм – это алгоритм, в котором все действия выполняются последовательно одно за другим.
7.1. Перевести граммы в килограммы и вывести результат на экран. Значение граммов ввести с клавиатуры. Показать решение.
# Вводим значение граммов для расчетов.
grams = float(input('Введите вес в граммах: '))
# Переводим в килограммы.
kg = grams*1e-3
print('Получаем: {} кг.'.format(kg))
Введите вес в граммах: 550
Получаем: 0.55 кг.
7.2. Даны две переменные x = 10 и y = 55. Поменяйте их значения местами. Выведите значения переменных на экран до и после замены. Показать решение.
# Исходные значения переменных.
x = 10
y = 55
# Выводим их на экран.
print('x = {}, y = {}.'.format(x, y))
# Меняем значения местами.
y, x = x, y
# Выводим их на экран.
print('x = {}, y = {}.'.format(x, y))
x = 10, y = 55.
x = 55, y = 10.
7.3. С клавиатуры вводится расстояние L в метрах. Необходимо найти и вывести на экран количество полных километров в нем. Показать решение.
# Вводим расстояние в метрах.
L = float(input('Введите расстояние в метрах: '))
# Находим число полных километров.
km = L//1000
print('Полных км.:', km)
Введите расстояние в метрах: 5035
Полных км.: 5.0
7.4. Вычислить и вывести на экран длину окружности и площадь круга одного и того же заданного радиуса R, который необходимо ввести с клавиатуры в сантиметрах. Результаты должны округляться до сотых. Показать решение.
# Импортируем число Пи.
from math import pi
# Вводим значение радиуса для расчетов.
R = float(input('Введите радиус R в см: '))
# Вычисляем и выводим длину окружности.
L = round(2*pi*R, 3)
print('Длина окружности: {} см.'.format(L))
# Вычисляем и выводим площадь круга.
S = round(pi*R**2, 2)
print('Площадь круга: {} см. кв.'.format(S))
Введите радиус R в см: 5
Длина окружности: 31.42 см.
Площадь круга: 78.54 см. кв.
7.5. С клавиатуры вводится некоторое число байт. Определите количество байт, которое нужно к нему добавить, чтобы получить целое число килобайт и мегабайт. Выведите результаты на экран. Показать решение.
# Вводим значение байтов для расчетов.
bs = int(input('Введите кол-во байт: '))
# Коэффициент перевода (1 килобайт).
k = 1024
# Коэффициент перевода (1 мегабайт).
m = k**2
# Кортеж с полным кол-вом килобайтов и остатком байтов.
kbs = divmod(bs, k)
# Кортеж с полным кол-вом мегабайтов и остатком байтов.
mbs = divmod(bs, m)
# Выводим результаты на экран.
print('\nВведено байт: {}.'.format(bs))
# Для оптимизации сохраним строку в переменной.
s = 'Кол-во {}байт: {}, до целого не хватает байт: {}.'
print(s.format('кило', kbs[0], k - kbs[1]))
print(s.format('мега', mbs[0], m - mbs[1]))
Введите кол-во байт:
Введено байт: 9588888.
Кол-во килобайт: 9364, до целого не хватает байт: 872.
Кол-во мегабайт: 9, до целого не хватает байт: 896872.
7.6. Вычислить и вывести на экран период колебания маятника длиной L с точностью до сотых. Для рассчетов использовать формулу T = 2π√(L/g), где g – ускорение свободного падения (9.81 м/c2). Значение длины маятника в метрах необходимо ввести с клавиатуры. Показать решение.
7.8. Найдите количество секунд, прошедших с начала суток, если на вход сценария время поступило в виде строки '07:45:33'. Выведите результат на экран в виде сообщения «С начала суток прошло n сек.». Показать решение.
7.9. С клавиатуры вводится целое число. Необходимо вывести число, обратное введенному по порядку составляющих его цифр. Например, если было введено число 12345, программа должна вывести пользователю на экран число 54321. Показать решение.
7.10. Получите и преобразуйте текущую системную дату, возвращаемую методом date.today() модуля стандартной библиотеки datetime, из формата «год-месяц-день» в формат «день.месяц.год». Выведите оба формата даты на экран. Показать решение.
Задачи на логические выражения
Теоретический материал по логическому типу данных можно почитать в нашем учебнике здесь.
Не забываем, что в отличие от некоторых других языков программирования в Python логические константы True и False являются регистрозависимыми. Кроме того, к логическому типу автоматически приводятся результаты выражений в заголовках инструкций if и while. В результате мы можем использовать более короткие схемы вместо полноценных логических выражений. Например, заголовок «while len(li) > 0:» можно заменить на «while li:», т.к. после опустошения списка, он автоматически преобразуется в False и цикл прерывается.
8.1. Записать и вывести на экран условие, которое является истинным, когда положительное целое n кратно двум или трем. Показать решение.
# Составляем условие.
s = 'n%2 == 0 or n%3 == 0'
print(s)
# Небольшая проверка в инструкции.
n = 5
if n%2 == 0 or n%3 == 0:
print(True)
else:
print(False)
n%2 == 0 or n%3 == 0
False
8.2. Записать и вывести на экран условие, которое является истинным, когда целое n не кратно трем и оканчивается нулем. Показать решение.
# Составляем условие.
s = 'n%3 != 0 and n%10 == 0'
print(s)
# Небольшая проверка в инструкции.
n = 50
if n%3 != 0 and n%10 == 0:
print(True)
else:
print(False)
n%3 != 0 and n%10 == 0
True
8.3. Записать и вывести на экран условие, которое является истинным, когда список li имеет хотя бы один элемент. Показать решение.
# Составляем условие.
res = "li"
print(res)
# Небольшая проверка в инструкции.
li = [0]
if li:
print(True)
else:
print(False)
li
True
8.4. Записать и вывести на экран условие, которое является истинным, когда хотя бы одно из чисел x, y и z больше 80. Показать решение.
# Составляем условие.
s = 'x > 80 or y > 80 or z > 80'
print(s)
# Небольшая проверка в инструкции.
x = 90; y = 50; z = 70;
if x > 80 or y > 80 or z > 80:
print(True)
else:
print(False)
x > 80 or y > 80 or z > 80
True
8.5. Записать и вывести на экран условие, которое является истинным, когда оба числа a и b одновременно положительны или отрицательны. Показать решение.
# Составляем условие.
s = '(a > 0 and b > 0) or (a < 0 and b < 0)'
print(s)
# Небольшая проверка в инструкции.
a = -5; b = -50
if (a > 0 and b > 0) or (a < 0 and b < 0):
print(True)
else:
print(False)
(a > 0 and b > 0) or (a < 0 and b < 0)
True
8.6. Записать и вывести на экран условие, которое является истинным для пустого словаря d. Показать решение.
8.7. Записать и вывести на экран условие, которое является истинным, когда строка s является ключом словаря D, но отсутствует в списке строк L. Показать решение.
8.8. Записать и вывести на экран логическое выражение, описывающее область определения функции у = √a + 1/(a - 7) + 1/(b + 5) + 1/(b - 2). Показать решение.
8.9. Записать и вывести на экран условие, которое является истинным, только когда одно из чисел x, y и z меньше нуля. Показать решение.
8.10. Записать и вывести на экран условие, которое является истинным, когда переменная принадлежит к классу целых или вещественных чисел. Показать решение.
8.11. Известно, что обрабатываемая строка может содержать только целые числа, например, '-32', '59'. Запишите и выведите на экран условие, которое является истинным только для строк, содержащих двузначное число. Показать решение.
8.12. Запишите и выведите на экран условие, которое является истинным только для положительных целых чисел, которые делятся сразу и на два, и на четыре. При этом используйте не прямое деление, которое для больших чисел даст значительный отрицательный эффект по производительности, а следующие правила математики:
- целое положительное число делится на два, если оно четное;
- целое положительное число делится на четыре, если число, образованное последними двумя цифрами этого числа делится на четыре.
Задачи на if/else
Теоретический материал по условной инструкции if/elif/else можно почитать в нашем учебнике здесь.
9.1. Определите, не является ли введенная пользователем с клавиатуры строка пустой. Результат проверки в виде True или False выведите на экран. Показать решение.
# Выводим сообщение и призыв к вводу.
s = input('Введите строку: ')
''' 1-й вариант '''
# Осуществляем проверку и вывод результатов.
# Можно и проще if s: ...
if len(s) > 0:
print(True)
else:
print(False)
''' 2-й вариант '''
# Используем трехместное выр-е if/else.
print(True) if len(s) > 0 else print(False)
Введите строку: sdsd
True
True
9.2. Написать программу, которая будет делить введенные пользователем два вещественных числа и выводить результат на экран, сообщая об ошибке в случае деления на ноль. Показать решение.
# Выводим сообщение и призыв к вводу.
x = float(input('Введите 1-е число: '))
y = float(input('Введите 2-е число: '))
# Осуществляем проверку и вывод результатов.
if y != 0:
print('x/y =', x/y)
else:
print('На ноль делить нельзя!')
Введите 1-е число: 4
Введите 2-е число: 5
x/y = 0.8
9.3. Определить, является ли введенное с клавиатуры натуральное число кратным трем. Вывести результат на экран. Показать решение.
# Просим ввести число для проверки.
n = int(input('Введите нат. число для проверки: '))
# Проверяем кратность трем.
if n%3 == 0:
# Выводим результат на экран.
print('Число', n, 'кратно трем.')
else:
# Выводим результат на экран.
print('Число', n, 'на 3 не делится.')
Введите нат. число для проверки: 81
Число 81 кратно трем.
9.4. Рассчитать стоимость покупки с учетом скидки в 35%, которая предоставляется покупателю, если сумма покупки превышает 20 у.е. Сумму покупки ввести с клавиатуры, а результаты округлить до сотых (копейки, центы и т.д.). Вывести на экран итоговую стоимость и размер предоставленной скидки. Показать решение.
# Вводим сумму покупки.
cost = float(input('Введите сумму покупки (у.е.): '))
# Начальный размер скидки в у.е.
sale = 0
# Вычисляем скидку при условии cost > 20 у.е.
if cost > 20:
# Рассчитываем и округляем скидку в у.е.
sale = round(cost*0.35, 2)
# Рассчитываем итоговую стоимость.
cost = cost - sale
# Выводим на экран результаты.
print('Стоимость покупки:', cost, 'у.е.')
print('Предоставленная скидка:', sale, 'у.е.')
Введите сумму покупки (у.е.): 27.8
Стоимость покупки: 18.07 у.е.
Предоставленная скидка: 9.73 у.е.
9.5. Напишите программу, которая будет проверять, является ли введенное пользователем значение цифрой десятичной системы счисления. Результат проверки должен выводиться пользователю на экран в виде сообщения. Показать решение.
# Выводим сообщение и призыв к вводу.
s = input('Введите число от 0 до 9: ')
# Составляем и проверяем условное выражение.
if len(s) == 1 and int(s) in range(10):
# Выводим сообщение.
print(s, ' - это цифра 10-ной СС.', sep='')
# Если условие ложно.
else:
# Выводим сообщение.
print('«{}» - это не цифра 10-ной СС!'.format(s))
Введите число от 0 до 9: ывввы
«ывввы» - это не цифра 10-ной СС!
9.6. Напишите программу, которая будет проверять, является ли введенное пользователем значение цифрой десятичной системы счисления. В случае положительного результата, на экран пользователя должно выводиться название цифры, например, «3 - это три». В противном случае должно выводиться предупреждение «Введите цифру 10-й СС». Показать решение.
9.7. Напишите скрипт, который будет проверять пользователя на умение перемножать однозначное натуральное число на двузначное, запрашивая ввод ответа с клавиатуры. Результат проверки ответа пользователя должен выводиться на экран в виде соответствующего сообщения. В случае неправильного ответа, программа должна выводить сообщение об ошибке, дополнительно сообщая пользователю верный результат. Для получения случайных целых чисел из диапазона 2 - 99 импортируйте из модуля random стандартной библиотеки метод randrange. Показать решение.
Введите ответ: 2*65 = 120 Вы ошиблись, т.к. 2*65 = 130 ---------------------- Введите ответ: 2*47 = 94 Верно! 2*47 = 94
9.8. Известна денежная сумма. Необходимо разменять её купюрами по 100, 10 и монетой 2 руб., если это возможно. Сумма должна вводиться с клавиатуры, а результат расчета выводиться на экран в формате «Размен: 100xa, 10xb, 2xc» или «Извините, но размен невозможен!». Показать решение.
Введите сумму в рублях: 156 Размен: 100x1, 10x5, 2x3 ---------------------- Введите сумму в рублях: 35 Извините, но размен невозможен!
9.9. Даны три числа: 130, 25 и 70. Выведите на экран наименьшее из них, использовав для этого программную проверку. Показать решение.
9.10. Определите четверть координатной плоскости, которой принадлежит точка A(x, y). Координаты точки должны вводиться с клавиатуры. Показать решение.
9.11. По длинам трех отрезков, вводимых пользователем с клавиатуры, определить возможность существования треугольника, составленного из этих отрезков. Если такой треугольник существует, то определить, является ли он разносторонним, равнобедренным или равносторонним. Показать решение.
9.12. Напишите скрипт, который по введенному пользователем числу от 1 до 12, будет выводить на экран сообщение в виде названия месяца и времени года. Если пользователь введет недопустимое число, программа должна выдавать сообщение об ошибке. Показать решение.
9.13. Напишите скрипт, который будет тестировать пользователя на знание синтаксиса условной инструкции if. На экран пользователю должны выводиться два случайных формата записи из списка ['if/elseif/else', 'if/elif/else', 'A = Y if X else Z'] и запрос на ввод верного варианта в виде «Введите 0, 1 или 2: ». После чего программа должна оценить ответ и в случае ошибки написать правильный. Для получения случайных вариантов из списка импортируйте из модуля random стандартной библиотеки метод randint. Показать решение.
Какой из двух форматов подходит для инструкции if: if/elseif/else или if/elif/else? Укажите номер верного формата или введите ноль, если оба варианта не верны. Введите 0, 1 или 2: 1 Ошибка! Верный вариант: if/elif/else. ---------------------- Какой из двух форматов подходит для инструкции if: if/elseif/else или A = Y if X else Z? Укажите номер верного формата или введите ноль, если оба варианта не верны. Введите 0, 1 или 2: 0 Верно! ---------------------- Какой из двух форматов подходит для инструкции if: if/elif/else или A = Y if X else Z? Укажите номер верного формата или введите ноль, если оба варианта не верны. Введите 0, 1 или 2: 1 Верно!
9.14. Сформируйте список li из 10-ти случайных натуральных чисел не превышающих 100. Для этого используйте инструкции from random import randint и for k in range(1, 11): li.append(randint(1, 100)). Далее, используя для обхода элементов списка цикл for, выведите на экран: максимальное значение четных чисел, если их меньше, чем нечетных; максимальное значение нечетных чисел, если их меньше, чем четных; максимальное значение из двух, если в списке содержится равное количество четных и нечетных чисел. Использовать для решения задачи другие встроенные функции запрещается! Показать решение.
li: [5, 20, 41, 63, 24, 21, 10, 62, 91, 19] Четных чисел меньше. Макс. четное: 62 ---------------------- li: [28, 58, 94, 59, 27, 30, 80, 18, 4, 53] Нечетных чисел меньше. Макс. нечетное: 59 ---------------------- li: [88, 32, 50, 99, 17, 12, 78, 95, 55, 47] Чисел одинаковое кол-во. Макс. из них нечетное: 99
Задачи на циклы for и while
Теоретический материал по циклам for и while можно почитать в нашем учебнике здесь.
Все задачи должны решаться как с использованием цикла for, так и цикла while. Дополнительно разрешается использовать и другие инструменты для обхода наборов элементов.
10.1. Посчитайте количество символов в строке 'Python - это Питон!', использовав счетчики на основе циклов for и while. Показать решение.
# Сохраним строку символов в переменной.
str_1 = 'Python - это Питон!'
''' 1-й вариант '''
# Создаем счетчик символов.
k = 0
# Организуем цикл по всем символам строки str_1.
for simb in str_1:
# Просто увеличиваем счетчик на единицу.
k += 1
# Выводим k на экран.
print('В строке', k, 'символов.')
''' 2-й вариант '''
# Создаем новый счетчик символов.
n = 0
# Организуем цикл по всем символам строки str_1.
while str_1:
# Сокращаем строку на один символ.
str_1 = str_1[1:]
# Просто увеличиваем счетчик на единицу.
n += 1
# Выводим n на экран.
print('В строке', n, 'символов.')
В строке 19 символов.
В строке 19 символов.
10.2. Сколько кортежей содержится в списке [(1, 2), (3), (4,), (5+6), (7+8,)]? Проверьте свой ответ программно, используя циклы. Выведите кортежи на экран в одну строку. Показать решение.
Ответ. Список содержит три кортежа, т.к. (3) - это просто число в скобках, а (5+6) - сумма чисел.
# Сохраняем список в переменной.
li = [(1, 2), (3), (4,), (5+6), (7+8,)]
''' 1-й вариант '''
# Запускаем цикл по эл-там списка.
for elem in li:
# Если эл-т является кортежем.
if isinstance(elem, tuple):
# Выводим его на экран через пробел.
print(elem, end=' ')
# Сделаем отступ для цикла while.
print()
''' 2-й вариант '''
# Цикл прервется при опустошении списка.
while li:
# Берем 1-й эл-т списка.
elem = li[0]
# Сам список укорачиваем.
li = li[1:]
# Если эл-т является кортежем.
if isinstance(elem, tuple):
# Выводим его на экран через пробел.
print(elem, end=' ')
(1, 2) (4,) (15,)
(1, 2) (4,) (15,)
10.3. Найдите сумму всех элементов списка [1, '2', 3, 4, '5'], предварительно приводя строки к целым числам. Показать решение.
# Сохраним список в переменной.
li = [1, '2', 3, 4, '5']
''' 1-й вариант '''
# Задаем стартовое значение суммы
sum = 0
# Циклом проходимся по эл-там списка.
for elem in li:
# Проверяем тип текущего элемента списка.
if type(elem) is str:
# Перед сложением приводим к целочисленному типу.
sum += int(elem)
# Если не строка.
else:
# Просто наращиваем сумму.
sum += elem
# Выводим сумму на экран.
print('Цикл for:', sum)
''' 2-й вариант '''
# Обнуляем сумму.
sum = 0
# Счетчик и размер списка.
n = 0; li_len = len(li)
# Организуем цикл по всем эл-там списка.
while n < li_len:
# Получаем текущий элемент списка.
elem = li[n]
# Проверяем тип текущего элемента списка.
if type(elem) is str:
# Перед сложением приводим к целочисленному типу.
sum += int(elem)
# Если не строка.
else:
# Просто наращиваем сумму.
sum += elem
# Увеличиваем счетчик на единицу.
n += 1
# Выводим сумму на экран.
print('Цикл while:', sum)
Цикл for: 15
Цикл while: 15
10.4. Дано множество целых чисел {12, 33, 24, 7, 19}. Выведите на экран только четные числа. Показать решение.
''' 1-й вариант '''
# Сохраним множество в переменной.
s = {12, 33, 24, 7, 19}
# Обходим эл-ты в цикле.
for elem in s:
# Проверяем на четность.
if elem%2 != 0:
# Выводим число.
print(elem, end=' ')
else:
# Пропускаем число
continue
# Сделаем отступ для цикла while.
print()
''' 2-й вариант '''
# Получим копию множества, чтобы не изменить оригинал.
s_1 = s.copy()
# Организуем цикл по всем эл-там мн-ва.
while s_1:
# Удаляем и получаем эл-т множества.
elem = s_1.pop()
# Проверяем на четность.
if elem%2 != 0:
# Выводим число.
print(elem, end=' ')
else:
# Пропускаем число
continue
33 19 7
33 19 7
10.5. Используя циклы, проверьте при помощи оператора in наличие символов строки 'abcde123' в строке 'bad_cat_23', выводя результаты проверки на экран в виде «Символ "a" есть в "bad_cat_23".» или «Символа "n" нет в "bad_cat_23".». Показать решение.
# Сохраним строку символов в переменной.
str_1 = 'abcde123'
# Сохраним целевую строку в переменной.
str_2 = 'bad_cat_23'
''' 1-й вариант '''
# Организуем цикл по всем символам строки str_1.
for simb in str_1:
# Проверяем наличие очередного символа в строке str_2.
if simb in str_2:
# Выводим подтверждение на экран.
print('Символ ', simb, ' есть в "', str_2, '".', sep='')
else:
# Выводим отрицание на экран.
print('Символа ', simb, ' нет в "', str_2, '".', sep='')
# Сделаем отступ для цикла while.
print()
''' 2-й вариант '''
# Получим счетчик для итераций.
k = len(str_1)
# Организуем цикл по всем символам строки str_1.
while k:
# Счетчик эффективнее уменьшить сразу.
k -= 1
# Получаем символ str_1, начиная с конца строки.
simb = str_1[k]
# Проверяем наличие очередного символа в строке str_2.
if simb in str_2:
# Выводим подтверждение на экран.
print('Символ ', simb, ' есть в "', str_2, '".', sep='')
else:
# Выводим отрицание на экран.
print('Символа ', simb, ' нет в "', str_2, '".', sep='')
''' Самостоятельно организуйте цикл, начиная с 1-го символа. '''
Символ a есть в "bad_cat_23".
Символ b есть в "bad_cat_23".
Символ c есть в "bad_cat_23".
Символ d есть в "bad_cat_23".
Символа e нет в "bad_cat_23".
Символа 1 нет в "bad_cat_23".
Символ 2 есть в "bad_cat_23".
Символ 3 есть в "bad_cat_23".
Символ 3 есть в "bad_cat_23".
Символ 2 есть в "bad_cat_23".
Символа 1 нет в "bad_cat_23".
Символа e нет в "bad_cat_23".
Символ d есть в "bad_cat_23".
Символ c есть в "bad_cat_23".
Символ b есть в "bad_cat_23".
Символ a есть в "bad_cat_23".
10.6. Вычислить и вывести на экран сумму кубов натуральных чисел от 1 до n включительно. Верхний предел должен вводиться с клавиатуры и не должен превышать числа 100. Показать решение.
10.7. Вычислить факториал заданного натурального числа. Факториал числа n вычисляется по формуле: n! = 1*2*3*...*n. Число n должно вводиться с клавиатуры и не должно превышать числа 30. Показать решение.
10.8. Подсчитайте количество арабских цифр и алфавитных символов Юникода в строке 'Станция «Альфа-2015»' и выведите результаты на экран. Показать решение.
10.9. Даны два списка строк ['1', 'True', 'ok'] и ['no', 'True', 'no']. Сформируйте новый список, который будет состоять из строк, которые присутствуют хотя бы в одном из списков. Выведите полученный список на экран. Показать решение.
10.10. Выведите на экран через пробел все символы строки 'abcdefABCDEF', которые находятся в нижнем регистре, не используя при этом срез строки. Показать решение.
10.11. Cгенерируйте и выведите на экран мозаичное изображение гексагональной сетки, напоминающее мелкоячеистую проволочную сетку. Показать решение.
/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ / \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ / \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ / \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ / \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ / \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ / \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ / \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ / \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ / \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ / \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ / \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ / \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ / \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ / \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
10.12. Выведите на экран в порядке возрастания и через пробел все цифры вложенных списков конструкции [[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[10, 11, 12], [13, 14, 15], [16, 17, 18]], [[19, 20, 21], [22, 23, 24], [25, 26, 27]]]. Не забываем делать это при помощи циклов for и while (должны получиться тройные матрешки из вложенных циклов). Показать решение.
10.13. Выведите на экран цифры вводимого с клавиатуры натурального числа, пропуская цифры 2 и 5. Показать решение.
10.14. Дан словарь {1: [1, 2, 3, 4], 2: [5, 6, 7, 8]}. Удалите из вложенных списков все четные значения элементов. Выведите измененный словарь на экран. Показать решение.
10.15. Выведите на экран таблицу умножения чисел от одного до девяти. Показать решение.
----+------------------------------------- | х | 1 2 3 4 5 6 7 8 9 | ----+------------------------------------- | 1 | 1 2 3 4 5 6 7 8 9 | | 2 | 2 4 6 8 10 12 14 16 18 | | 3 | 3 6 9 12 15 18 21 24 27 | | 4 | 4 8 12 16 20 24 28 32 36 | | 5 | 5 10 15 20 25 30 35 40 45 | | 6 | 6 12 18 24 30 36 42 48 54 | | 7 | 7 14 21 28 35 42 49 56 63 | | 8 | 8 16 24 32 40 48 56 64 72 | | 9 | 9 18 27 36 45 54 63 72 81 | ----+-------------------------------------
10.16. Напишите программу вывода на экран всех простых чисел, не превосходящих заданного натурального числа n. Простым называется натуральное число большее единицы, которое делится только на единицу и само себя. Если у натурального числа есть делители большие единицы, то все они не превышают корня квадратного из этого числа. Показать решение.
Задачи на протокол итераций и генераторы
Теоретический материал по итерациям и генераторам можно почитать в нашем учебнике здесь.
11.1. Имеется список вещественных чисел [1.3, 2.5, 3.1]. Создайте множество квадратов этих чисел, использовав для этого генератор множеств. Выведите полученное множество на экран. Показать решение.
# Используем генератор множеств.
st = {x**2 for x in [1.5, 2.5, 3.5]}
# Выведет {2.25, 12.25, 6.25}.
print('Квадраты чисел:', st)
Квадраты чисел: {2.25, 12.25, 6.25}
11.2. Создайте список нечетных чисел, принадлежащих отрезку [10; 20], использовав для этого генератор списков. Выведите полученный список на экран. Показать решение.
# Используем генератор списков.
li = [x for x in range(10, 21) if x%2 != 0]
# Выводим список на экран.
print(li)
[11, 13, 15, 17, 19]
11.3. Преобразуйте кортеж чисел (3.27, 5.755, 7.321) в словарь, в качестве ключей которого будут использованы числа кортежа, а значениями будут их округленные до десятых значения. Используйте для решения задачи генератор словарей. Выведите полученный словарь на экран. Показать решение.
# Используем генератор словарей.
d = {x: round(x, 1) for x in (3.27, 5.755, 7.321)}
# Выводим словарь на экран.
print(d)
{3.27: 3.3, 5.755: 5.8, 7.321: 7.3}
11.4. Выведите на экран элементы списка [1, 2, 3], использовав для этого функцию next(). Показать решение.
# Получаем итератор списка.
i_li = iter([1, 2, 3])
# Выводим элементы на экран.
print(next(i_li))
print(next(i_li))
print(next(i_li))
1
2
3
11.5. С помощью генератора-выражений получите итератор для последовательности четных чисел из диапазона от 1 до 20 включительно. В ручном режиме выведите первые три числа последовательности, использовав метод __next__ итератора. Показать решение.
11.6. Напишите функцию-генератор gen_func(n), которая при вызове будет возвращать итератор для последовательности четных чисел из диапазона от 1 до n включительно. Вызовите функцию, передав аргументу значение 20, и в ручном режиме выведите первые три числа сгенерированной последовательности, использовав метод __next__ итератора. Показать решение.
11.7. Выведите на экран сумму числовых кодов символов строки 'генераторы', использовав в решении генератор списков. Показать решение.
11.8. Дан список [(1, 2), (3+4), (5,), (6+7, 8), (9+10,)]. Оставьте в нем только элементы, которые являются кортежами и содержат более одного элемента. Используйте для решения задачи генератор списков. Выведите итоговый и результирующий списки на экран. Показать решение.
11.9. Сформируйте множество из всех подходящих для этого элементов списка [3, 'ok', [1, 2], (True, False), {'flag': 1}] и выведите его на экран. Используйте для решения задачи генератор множеств и класс Hashable модуля collections.abc для проверки хешируемости элементов списка. Показать решение.
11.10. Сформируйте словарь, в котором ключами будут строковые значения чисел из диапазона целых чисел от 20 до 30 кратные трем, но не кратные пяти, а значениями квадраты этих чисел. Используйте для решения задачи генератор словарей. Показать решение.
11.11. Напишите скрипт, который будет находить сумму цифр вводимого пользователем целого числа. Проверьте его на числах -9720, 0 и +3531. Используйте для решения задачи генератор выражения. Показать решение.
11.12. Напишите функцию-генератор gen_fib(n: 'int>0') для генерирования последовательности из n чисел Фибоначчи. Вместо проверки аргумента просто укажите аннотацию, сообщающую о том, что аргумент должен быть целым неотрицательным числом. Используя созданный генератор, выведите на экран 10-е число Фибоначчи, а также сумму первых 10-ти чисел последовательности.
Числа Фибоначчи представляют собой ряд чисел, в котором первое число равно нулю, второе единице, а каждое последующее число равно сумме двух предыдущих, т.е. 0 1 1 2 3 5 8 и т.д. Показать решение.
Задачи на функции
Теоретический материал по функциям можно почитать в нашем учебнике здесь.
12.1. Создайте простейшую в мире функцию simple_pass, а затем выведите на экран ее тип. Показать решение.
# Простейшая в мире функция.
def simple_pass(): pass
# Выводим тип объекта.
print(type(simple_pass))
<class 'function'>
12.2. Напишите функцию hello_friend, принимающую в качестве аргументов имя и фамилию пользователя и возвращающую строку в формате «Привет, {name} {surname}!». Вызовите функцию и выведите результат вызова на экран. Показать решение.
# Определяем ф-цию с двумя позиционными аргументами.
def hello_friend(name, surname):
# Формируем приветствие.
s = 'Привет, {} {}!'.format(name, surname)
# Возвращаем результат.
return s
# Вызываем ф-цию и выводим приветствие на экран.
print(hello_friend('Иван', 'Иванов'))
Привет, Иван Иванов!
12.3. Создайте еще одну версию функции hello_friend из предыдущего задания, также принимающую в качестве аргументов имя и фамилию пользователя и возвращающую строку в формате «Привет, {name} {surname}!». Но на этот раз функция должна принимать только именованные аргументы со значениями по умолчанию. Вызовите функцию без аргументов и с аргументами, попутно выводя результаты вызовов на экран. Показать решение.
# Определяем ф-цию с двумя именованными аргументами.
def hello_friend(*, name='Иван', surname='Иванов'):
# Формируем приветствие.
s = 'Привет, {} {}!'.format(name, surname)
# Возвращаем результат.
return s
# Вызываем ф-цию без передачи аргументов.
print(hello_friend())
# Вызываем ф-цию с аргументами.
print(hello_friend(name='Петр', surname='Романовский'))
Привет, Иван Иванов!
Привет, Петр Романовский!
12.4. Создайте пользовательскую функцию print_args, принимающую произвольное количество аргументов и выводящую их затем на экран. Вызовите функцию, одновременно передав ей в качестве значений целое число, вещественное число, строку и пустой список. Показать решение.
# Ф-ция с произвольным числом аргументов.
def print_args(*args):
# Заголовок цикла.
for elem in args:
# Выводим элемент на экран.
print(elem)
# Вызываем ф-цию.
print_args(5, 0.73, 'str', [])
5
0.73
str
[]
12.5. Создайте пользовательскую функцию print_named_args, принимающую произвольное количество именованных аргументов и выводящую их затем на экран в формате «key -> value». Вызовите функцию, передав ей в качестве значений комплексное число, кортеж с логическими значениями и пустое множество. Показать решение.
# Ф-ция с произв-ным числом именованных арг-тов.
def print_args(**dict_args):
# Заголовок цикла.
for item in dict_args.items():
# Выводим пару key -> value на экран.
print(item[0], '->', item[1])
# Вызываем ф-цию.
print_args(c=5+3j, b=(True, False), st=set())
c -> (5+3j)
b -> (True, False)
st -> set()
12.6. Создайте и вызовите пользовательскую функцию-матрешку my_func_1, состоящую из четырех вложенных друг в друга определений аналогичных функций. Каждая функция должна выводить сообщение в формате 'In my_func_{номер функции}.', а также содержать определение и вызов следующей вложенной функции (в последней функции эта часть будет отсутствовать). Показать решение.
In my_func_1. In my_func_2. In my_func_3. In my_func_4. In my_func_5.
12.7. Создайте функцию, принимающую в качестве аргументов два числа x и y=1 и возвращающую частное d этих чисел в виде строки 'x/y = d'. Снабдите функцию аннотациями: float для x, 'y != 0' для y и 'x/y' для возвращаемого функцией результата. Добавьте в функцию строку документирования «Возвращает строку вида 'x/y = d'.». Выведите на экран результаты вызовов func(5, 0) и func(5, 10), документацию функции через соответствующий атрибут, а также все аннотации, использовав для этого цикл for. Показать решение.
12.8. Напишите рекурсивную функцию recursive_func(text), которая будет выводить символы передаваемой ей строки на экран через пробел. Показать решение.
12.9. Напишите рекурсивную функцию, которая будет вычислять сумму цифр натурального числа. Используя полученную функцию, выведите на экран суммы цифр чисел 7 и 39574. Показать решение.
12.10. Напишите собственный аналог встроенной функции abs для нахождения модуля числа. Проверьте ее на числах -5, 0 и 10. Показать решение.
12.11. Напишите функцию, рассчитывающую стоимость поездки на такси в зависимости от расстояния. В качестве аргументов функция должна принимать именованные параметры: км – расстояние поездки в километрах, мин_цена – базовый тариф, включающий подачу такси и первые три километра пути, цена_за_км – цена за каждый километр, начиная с четвертого. Рассчитайте и выведите на экран стоимость поездки за 17.5 км, если по умолчанию базовый тариф составляет 2 у.е., а цена за километр сверх минимума – 0.3 у.е. Показать решение.
12.12. Напишите функцию, которая будет генерировать случайный пароль. В пароле должно быть от 8 до 15 символов Юникода из диапазонов 48-57 (цифры), 65-90 (буквы латинского алфавита в верхнем регистре) и 97-122 (буквы латинского алфавита в нижнем регистре). Сгенерируйте и выведите на экран три пароля. Показать решение.
12.13. Напишите простейшую функцию-калькулятор, которая будет выполнять с двумя переданными ей числами следующие действия: сложение, вычитание, умножение и деление с указанной точностью. Соответственно, функция должна принимать два позиционных числовых аргумента для чисел, один именованный строковый аргумент op (по умолчанию функция должна выполнять операцию сложения) и один именованный числовой аргумент prec для требуемой точности результата (по умолчанию три знака после запятой). В случае деления на ноль функция должна возвращать NaN, а при попытке выполнения непредусмотренной операции – сообщение об ошибке «Неподдерживаемый тип операции!». Выведите на экран результаты вызовов функции с точностью до сотых для числовых выражений: -13.756 + 59.291, 599 - 783, -7/55, 7/0 и 57.75*33.2. Показать решение.
12.14. В григорианском календаре, который был введен в 1582 году папой римским Григорием XIII обычный год состоит из 365 дней. Но т.к. период обращения Земли вокруг Солнца составляет 365.2425 дней, для устранения накапливающейся ошибки было решено ввести в календарь дополнительные «високосные года» в 366 дней. Таковыми условились считать года кратные 4. Однако этого оказалось недостаточно, поэтому для сведения ошибки к минимуму в григорианский календарь ввели дополнительную коррекцию: каждый год, который делится без остатка на 100, является високосным только тогда, когда он делится еще и на 400. Например, високосным считается 1760 год, т.к. он делится на четыре, но год 1700 високосным не является, т.к. он делится на четыре и сто, но не делится на четыреста. Зная все эти нюансы, напишите функцию, которая будет определять, является ли переданный ей год високосным. Проверьте и выведите на экран годы 1782, 1900, 2000 и 2023. Показать решение.
12.15. Напишите функцию для определения длины гипотенузы прямоугольного треугольника с помощью теоремы Пифагора. В качестве аргументов функция должна принимать длины катетов в виде двух положительных чисел. Возвращаемым значением должна быть длина гипотенузы, округленная с точностью до сотых. В случае передачи аргументов недопустимого типа или диапазона функция должна возвращать -1. Выведите на экран результаты вызовов функции для положительных и отрицательных значений аргументов. Показать решение.
12.16. Используя функцию import_module модуля importlib стандартной библиотеки напишите функцию imp_mods(mods), импортирующую в глобальную область видимости текущего модуля необходимые пакеты и модули. В качестве аргумента функция должна принимать кортеж или список имен пакетов и модулей для импорта. Импортируйте при помощи созданной функции модули random и math, а затем выведите на экран факториал случайного положительного целого числа не превышающего десяти. Показать решение.
12.17. Напишите функцию для нахождения НОД произвольного количества чисел. Затем найдите и выведите на экран наибольший общий делитель чисел 165, 435 и 300. Показать решение.
12.18. Напишите функцию, которая будет тестировать скорость выполнения другой функции за указанное количество итераций. В качестве именованных аргументов функция должна принимать: f – объект другой функции, args=[] – список или кортеж аргументов тестируемой функции (по умолчанию без аргументов), i=1000 – количество итераций тестирования (по умолчанию тысяча итераций). На выходе функция должна возвращать список [<имя функции>, <количество проведенных итераций>, <затраченное время>]. Протестируйте скорость выполнения встроенных функций sum и min за 20000 итераций на списке целых чисел из диапазона от 1 до 10000. Выведите результаты тестирования на экран, как показано в условии. Показать решение.
Функция: sum
Кол-во итераций: 20000
Время выполнения: 1.2101598
Функция: min
Кол-во итераций: 20000
Время выполнения: 1.6920748
Задачи на ООП: классы и объекты
Теоретический материал по объектно-ориентированному программированию можно почитать в нашем учебнике здесь.
13.1. Создайте простейший в мире класс SimplePass. Затем создайте экземпляр класса и выведите на экран его тип. Показать решение.
# Простейший в мире класс.
class SimplePass: pass
# Создаем экземпляр класса.
simp = SimplePass()
# Выводим тип объекта.
print(type(simp))
<class '__main__.main.<locals>.SimplePass'>
13.2. Определите класс A, включающий:
- строку документирования класса '''Класс A''';
- метод set_a() для установки значения атрибута a;
- метод get_a() для получения значения этого атрибута.
# Определяем класс.
class A:
'''Класс A'''
# Метод установки значения атрибута a.
def set_a(self, a):
# Инициализируем a.
self.a = a
# Метод получения значения атрибута a.
def get_a(self):
# Возвращаем a.
return self.a
# Выводим документацию класса.
print(A.__doc__, end='\n\n')
# Создаем 1-й экземпляр класса.
obj_1 = A()
# Устанавливаем и выводим значение атрибута 1-го объекта.
obj_1.set_a(1)
print('obj_1.get_a():', obj_1.get_a())
# Создаем 2-й экземпляр класса.
obj_2 = A()
# Устанавливаем и выводим значение атрибута 2-го объекта.
obj_2.a = 2
print('obj_2.a:', obj_2.a)
Класс A
obj_1.get_a(): 1
obj_2.a: 2
13.3. Определите класс B, включающий:
- строку документирования класса '''Класс B''';
- конструктор, инициализирующий атрибут данных b создаваемых экземпляров;
- метод get_b() для получения значения этого атрибута.
# Определяем класс.
class B:
'''Класс B'''
# Конструктор класса B.
def __init__(self, b):
# Инициализируем b.
self.b = b
# Метод получения значения атрибута b.
def get_b(self):
# Возвращаем b.
return self.b
# Выводим документацию класса.
print(B.__doc__, end='\n\n')
# Создаем экземпляр класса.
obj = B('b_ok')
# Выводим значение атрибута.
print('obj.get_b():', obj.get_b())
Класс B
obj.get_b(): b_ok
13.4. Определите класс C, наследующий классы A (задача №2) и B (задача №3) и включающий:
- строку документирования класса '''Класс C = A + B''';
- конструктор, инициализирующий дополнительно атрибуты данных a и c создаваемых экземпляров;
- собственные методы set_b() и set_c() для установки значений соответствующих атрибутов;
- собственный метод get_c() для получения значения атрибута c.
# Определяем класс.
class A:
'''Класс A'''
# Метод установки значения атрибута a.
def set_a(self, a):
# Инициализируем a.
self.a = a
# Метод получения значения атрибута a.
def get_a(self):
# Возвращаем a.
return self.a
# Определяем класс.
class B:
'''Класс B'''
# Конструктор класса B.
def __init__(self, b):
# Инициализируем b.
self.b = b
# Метод получения значения атрибута b.
def get_b(self):
# Возвращаем b.
return self.b
# Наследуем оба класса.
class C(A, B):
'''Класс C = A + B'''
# Конструктор класса C.
def __init__(self, a, b, c):
# Вызываем конструктор класса B,
# инициализируя атрибут b.
B.__init__(self, b)
# Инициализируем a (унаследован).
self.set_a(a)
# Инициализируем c (определен здесь).
self.set_c(c)
# Метод установки значения атрибута b.
def set_b(self, b):
# Возвращаем b.
self.b = b
# Метод установки значения атрибута c.
def set_c(self, c):
# Инициализируем c.
self.c = c
# Метод получения значения атрибута c.
def get_c(self):
# Возвращаем c.
return self.c
# Выводим документацию класса C.
print(C.__doc__, end='\n\n')
# Создаем экземпляр класса.
obj = C('a_ok', 'b_ok', 'c_ok',)
# Выводим значения атрибутов.
print('obj.get_a():', obj.get_a())
print('obj.get_b():', obj.get_b())
print('obj.get_c():', obj.get_c())
Класс C = A + B
obj.get_a(): a_ok
obj.get_b(): b_ok
obj.get_c(): c_ok
13.5. Определите класс D, включающий:
- статический метод stat_print_dict, выводящий на экран словарь атрибутов переданного ему объекта класса;
- метод класса cls_print_dict, выводящий на экран словарь атрибутов своего класса.
Ответ. Следует помнить, что статический метод ничего не знает ни о своем классе, ни о его экземпляре. Поэтому при вызове ему нужно обязательно передавать объект класса D. А вот метод класса знает о нем, т.к. он либо вызывается через объект своего класса, либо определяет класс по его экземпляру, из которого он вызывается.
# Определяем класс D.
class D:
# Статический метод.
@staticmethod
def stat_print_dict(c):
# Выводим словарь атрибутов класса.
print(c.__dict__)
# Метод класса.
@classmethod
def cls_print_dict(cls):
# Выводим словарь атрибутов класса.
print(cls.__dict__)
# Создаем экземпляр класса.
obj = D()
# Ст. методу передаем объект класса.
obj.stat_print_dict(D)
# Метод класса знает о нем.
obj.cls_print_dict()
{'__module__': '__main__', 'stat_print_dict': ...}
{'__module__': '__main__', 'stat_print_dict': ...}
13.6. Определите класс E, наследующий класс D (задача №5) и включающий единственный атрибут данных класса e = 'Класс E'. Создайте экземпляр obj_1 класса D и, вызвав оба метода из этого экземпляра, выведите на экран словарь атрибутов класса. Затем создайте экземпляр obj_2 класса E и также, вызвав оба метода из этого экземпляра, выведите на экран словарь атрибутов этого класса. Объясните результаты. Показать решение.
13.7. Определите класс F, наследующий класс A (задача №2), включающий:
- конструктор, обновляющий строку документации создаваемых экземпляров на 'Объект класса F';
- расширенный метод set_a() для установки значения атрибута a, который должен дополнительно выводить сообщение 'Атрибут a установлен!'.
13.8. Определите класс PiNum, хранящий значение числа Пи и включающий:
- конструктор, инициализирующий текущую точность представления числа Пи создаваемым экземпляром (по умолчанию два знака после запятой);
- переопределяемый магический метод __str__, возвращающий строку с текущим значением числа Пи;
- управляемый атрибут max_pi, хранящий значение числа Пи с максимальной точностью в 13 знаков после запятой и недоступный для изменения или удаления;
- метод set_pi_prec, устанавливающий значение атрибута cur_pi экземпляра для хранения значения числа Пи с текущей точностью (по умолчанию два знака после запятой).
13.9. Определите класс Circle, представляющий окружность и включающий:
- статический метод, переводящий метры в сантиметры или наоборот;
- конструктор, инициализирующий радиус r экземпляра и атрибут pi для хранения числа Пи с точностью в три знака после запятой (для получения требуемого значения используйте класс PiNum из предыдущей задачи);
- методы экземпляров для получения длины и площади окружности с точностью в три знака после запятой.
13.10. Определите суперкласс Сотрудник, включающий:
- конструктор, инициализирующий имя работника, его должность (по умолчанию None) и оклад (по умолчанию 0);
- метод экземпляра для повышения оклада на какую-то часть (например, на 0.3, т.е. на 30%) с округлением результата до копеек;
- магический метод __str__ для перегрузки строкового представления объекта, который должен выводить данные о работнике в формате 'Атрибут: объект.атрибут' по одной записи на каждой строке.
- создайте экземпляр иван_менеджер созданного подкласса с начальным окладом в 1700 рублей;
- повысьте сотруднику оклад за счет стандартной надбавки в 0.335 и бонуса за должность в 0.25;
- выведите строковое представление объекта экземпляра с информацией о сотруднике на экран.
13.11. Создайте абстрактный класс геометрической фигуры Shape с конструктором, принимающим длину стороны и высоту, проведенную к этой стороне. Определите в классе абстрактный метод area(), который будет использоваться подклассами для расчета площади соответствующих им геометрических фигур. Далее создайте классы Triangle и Rectangle, наследующие суперкласс Shape и реализующие его абстрактный метод под свои нужды. Продемонстрируйте использование созданных классов для нахождения площади треугольника и прямоугольника по известным значениям длины стороны и высоты, проведенной к этой стороне. Показать решение.
13.12. Определите класс Counter, реализующий десятичный счетчик, который может увеличивать или уменьшать свое значение на единицу в заданном диапазоне, включая границы диапазона. В классе должны быть предусмотрены следующие возможности:
- конструктор для инициализации счетчика значениями по умолчанию (стартовое значение, нижняя и верхняя границы диапазона),
- метод для его инициализации произвольными значениями,
- а также методы для увеличения и уменьшения текущего значения счетчика.
Задачи на импорт, модули и пакеты
Теоретический материал по импортированию, модулям и пакетам можно почитать в нашем учебнике здесь.
14.1. Импортируйте из стандартной библиотеки модуль math. Используя необходимые атрибуты модуля выведите на экран результаты вычисления выражений: cosπ (см. косинус и число Пи), √e (см. число e) и 5! (см. факториал). Показать решение.
# Импортируем модуль math.
import math
# Вычисляем и выводим на экран.
res = math.cos(math.pi)
print(res)
res = math.sqrt(math.e)
print(res)
res = math.factorial(5)
print(res)
-1.0
1.6487212707001282
120
14.2. Выведите на экран текущее время. Для решения задачи импортируйте из модуля datetime стандартной библиотеки класс datetime. Далее используйте цепочку datetime.now().time(), которая как раз и вернет текущее время. Показать решение.
14.3. Выведите на экран текущую версию интерпретатора в формате «Python major.micro.minor.». Для выполнения задания импортируйте атрибут version_info модуля sys стандартной библиотеки. Показать решение.
14.4. Импортируйте из модуля random стандартной библиотеки функции randint и choice, использовав для них псевдонимы rnd и chc. Создайте список li и заполните его пятью случайными целыми числами от 1 до 20. Выведите на экран сам список, а также случайный элемент списка. Показать решение.
14.5. Выполните следующее упражнение:
- создайте вручную корневой каталог проекта project с исполняемым файлом main.py;
- в полученном каталоге создайте два пакета pkg_1 и pkg_2, добавив в них соответствующие модули mod_1.py с инструкцией x = 1 и mod_2.py с инструкцией x = 2;
- используя главный файл проекта выведите на экран сумму значений переменных модулей.
Показать решение.
14.6. Выполните следующее упражнение:
- создайте вручную корневой каталог проекта project с исполняемым файлом main.py;
- в полученном каталоге создайте два пакета pkg_1 и pkg_2, добавив в них соответствующие модули mod_1.py с инструкцией x = 1 и mod_2.py с инструкцией y = 2;
- в пакет pkg_2 добавьте подпакет pkg_3, содержащий модуль mod_3.py с инструкцией z_2 = z_1 = 3;
- добавьте в модуль mod_1.py инструкцию импорта переменной z_1, а в модуль mod_2.py инструкцию импорта переменной z_2;
- используя главный файл проекта выведите на экран сумму значений всех переменных модулей mod_1.py и mod_2.py.
Показать решение.
14.7. Используя функцию import_module модуля importlib стандартной библиотеки напишите функцию imp_mods(mods), импортирующую в глобальную область видимости текущего модуля необходимые пакеты и модули. В качестве аргумента функция должна принимать кортеж или список имен пакетов и модулей для импорта. Импортируйте при помощи созданной функции модули random и math, а затем выведите на экран факториал случайного положительного целого числа не превышающего десяти. Показать решение.
Задачи на файлы и каталоги
Теоретический материал по работе с файлами и каталогами можно почитать в нашем учебнике здесь.
15.1. Используя встроенную функцию open(), создайте в каталоге скрипта файл text_1.txt и запишите туда строку 'Пайтон практика: упражнения и задачи.', не забыв закрыть файл после операции. Выведите содержимое записанного файла на экран. Показать решение.
# Создаем и открываем файл на запись.
f_obj = open('text_1.txt', 'w', encoding='utf-8')
# Записываем в него строку.
f_obj.write('Пайтон практика: упражнения и задачи.')
# Закрываем файловый объект.
f_obj.close()
# Открываем файл в режиме чтения.
f_obj = open('text_1.txt', 'r', encoding='utf-8')
# Считываем все содержимое.
text = f_obj.read()
# Закрываем файловый объект.
f_obj.close()
# Выводим содержимое файла на экран.
print(text)
Пайтон практика: упражнения и задачи.
15.2. Используя соответствующую встроенную функцию, откройте в каталоге скрипта файл text_2.txt в режиме записи и чтения, запишите туда строку '0123456789', после чего считайте записанное содержимое и выведите его на экран, не забыв закрыть файл после операции. Далее, откройте файл в режиме дозаписи и чтения, допишите туда строку 'abcdef' и также выведите обновленное содержимое файла на экран. Показать решение.
15.3. Используя соответствующую встроенную функцию создайте в каталоге скрипта файл li.py и запишите туда строку li_1 = [1, 2]. Далее, используя менеджер контекста with/as, допишите в файл строку li_2 = ['red', 'green'] и, не выходя за область видимости менеджера, выведите на экран содержимое файла используя для чтения цикл for. Показать решение.
15.4. Используя менеджер контекста и соответствующую встроенную функцию, создайте в каталоге скрипта файл mod.py и запишите туда инструкцию определения функции sum_func, принимающую два числа и возвращающую их сумму. Используя вновь созданный модуль выведите на экран сумму чисел 10 и 20. Затем допишите в файл инструкцию определения функции mul_func, принимающую два числа и возвращающую их произведение. Используя обновленный модуль выведите на экран произведение чисел 10 и 20. Показать решение.
15.5. Используя возможности модуля pathlib cоздайте в каталоге скрипта каталог test_dir, а в нем пустой файл test_file.txt. Запишите в файл строку 'Python Ok или Ok Python.', после чего выведите содержимое файла на экран. Удалите каталог и файл. Результаты всех операций должны отображаться на экране, как показано в кодовом блоке ниже. Показать решение.
Каталог и файл созданы!
Нажмите любую клавишу...
Python Ok или Ok Python?
Файл записан и прочитан!
Нажмите любую клавишу...
Все удалено!
Нажмите любую клавишу...
15.6. Напишите скрипт, в котором объявите три функции:
- create_db(db_name) – должна принимать строковый аргумент и создавать пустое хранилище db_name, если оно еще не существует.
- set_amount(db_name, num, money) – должна проверять, существует ли в хранилище счет num (строка), после чего либо создавать и пополнять его с выводом сообщения «Счет №{num} создан, баланс пополнен!», либо обновлять баланс существующего счета с выводом сообщения «Баланс счета №{num} обновлен!».
- get_amount(db_name, num) – должна выводить текущий баланс счета num (строка) на экран в форме «Текущий баланс счета №{num}: {money} руб.».
После объявления функций создайте хранилище my_bank. Создайте в нем банковский счет 3335, пополнив его баланс на 5000 рублей, после чего выведите баланс на экран. Проделайте тоже самое для счета 3336, положив на счет сперва 300 рублей, а потом доложив еще 700 рублей.
Для решения задачи используйте модуль shelve, а также класс Path модуля pathlib, которые импортируйте в глобальное пространство скрипта. Показать решение.
Счет N3335 создан, баланс пополнен!
Текущий баланс счета N3335: 5000 руб.
Счет N3336 создан, баланс пополнен!
Текущий баланс счета N3336: 300 руб.
Баланс счета N3336 обновлен!
Текущий баланс счета N3336: 1000 руб.
15.7. Выполните следующее упражнение:
- создайте в папке скрипта корневой каталог упражнения root_dir;
- в полученном корневом каталоге создайте еще четыре каталога dir_1, dir_2, dir_3, и dir_4, добавив в них соответствующие пустые файлы f_1.txt, f_2.txt, f_3.txt и f_4.txt (не нужно создавать все вручную, используйте цикл);
- выведите сообщение 'Все каталоги и файлы созданы!' и призыв к действию 'Нажмите любую клавишу...\n';
- переместите каталог dir_2 в dir_1 и переименуйте файл f_2.txt в f_1_2.txt;
- переместите каталог dir_4 в dir_3 и переименуйте файл f_4.txt в f_3_4.txt;
- выведите сообщение 'Все перемещено и переименовано!' и призыв к действию 'Нажмите любую клавишу...\n';
- удалите каталог dir_3 и файл f_1.txt
- выведите сообщение 'dir_3 удален, f_1.txt удален!' и призыв к действию 'Нажмите любую клавишу...\n';
- поместите каталог dir_1 в одноименный архив в том же каталоге (т.е. в root_dir), а сам каталог dir_1 удалите;
- выведите сообщение 'dir_1 заархивирован, сам dir_1 удален!' и призыв к действию 'Нажмите любую клавишу...\n';
- распакуйте архив обратно в каталог root_dir, сам архив удалите (в root_dir должен остаться только распакованный каталог dir_1);
- выведите сообщение 'dir_1 разархивирован, сам архив удален!' и призыв к действию 'Нажмите любую клавишу...'.
Для выполнения задания используйте функции модуля shutil и методы класса pathlib.Path. Выполняйте упражнение поэтапно, при необходимости удаляя корневой каталог упражнения воизбежание ошибок. Показать решение.
15.8. Напишите функцию mk_pkg(path, root_path='./'), создающую по переданному в виде строки относительному пути path готовый python-пакет (т.е. каталог с файлом инициализации __init__.py). В случае отсутствия в пути каких-либо промежуточных пакетов или наличии каталогов без файлов инициализации, функция должна создавать их. Необязательный аргумент root_path='./' должен принимать строку с каталогом, относительно которого будет отсчитываться местоположение целевого каталога (по умолчанию в качестве локального корня должен использоваться каталог скрипта). Когда функция будет готова, проверьте ее, предварительно создав в каталоге скрипта обычный каталог pkg_1, а затем осуществив два вызова функции: mk_pkg('pkg_1/pkg_2') и mk_pkg('pkg_1/pkg_3/pkg_4'). Показать решение.
Задачи на исключения и ошибки
Теоретический материал по обработке исключений и ошибок можно почитать в нашем учебнике здесь.
16.1. Напишите пользовательскую функцию pow3_func(x), которая должна принимать в качестве аргумента число x и возводить его в куб. В случае успешных вычислений функция должна выводить на экран сообщение в формате «x^3 = res» и возвращать res. В противном случае должно выводиться соответствующее сообщение об ошибке и возвращаться None. Проверьте функцию, вызвав ее с аргументами 5 и '5'. Показать решение.
# Определяем функцию.
def pow3_func(x):
try:
# Пытаемся возвести x в куб.
res = pow(x, 3)
# Если что, перехватываем исключение.
except Exception as err:
# Помечаем, что рез-т не получен.
res = None
# Сообщаем о наличии ошибки.
print('Ошибка: «{}».'.format(err))
else:
# Выводим результат вычислений.
print('{}^3 = {}'.format(x, res))
# Возвращаем результат.
return res
# Вызываем функцию.
pow3_func(5)
pow3_func('5')
5^3 = 125
Ошибка: «unsupported operand type(s) for ** or pow(): 'str' and 'int'».
16.2. Напишите пользовательскую функцию write_file(f_obj, s), которая должна принимать в качестве аргумента объект открытого файла f_obj и пытаться записать в него строку s. В случае успешного завершения операции функция должна выводить на экран сообщение «Файл записан!». В противном случае должно выводиться соответствующее сообщение об ошибке. При любом исходе функция должна закрывать файловый объект перед завершением вызова и выводить сообщение «Файл закрыт!». Проверьте работу функции. Для этого создайте в папке скрипта пустой файл nums.py и запишите туда строку '1 2 3'. Далее откройте файл на чтение и попытайтесь записать в него строку '4 5 6'. Для решения задачи используйте в теле функции полную инструкцию try/except/else/finally. Показать решение.
16.3. Напишите пользовательскую функцию avg(x, y), которая должна принимать в качестве аргументов два положительных целых или вещественных числа, а возвращать их среднее геометрическое (z = pow(x*y, 0.5)). В случае передачи недопустимых значений функция должна возбуждать исключение ValueError. После того, как функция будет готова, используйте ее в скрипте, который будет запрашивать у пользователя два числа, обрабатывать ввод и выдавать либо среднее геометрическое чисел, либо сообщение об ошибке. Для решения задачи используйте в теле функции инструкцию raise, а в скрипте try/except. Показать решение.
16.4. Не используя возможности модуля abc стандартной библиотеки, создайте абстрактный класс геометрической фигуры Shape с конструктором, принимающим длину стороны и высоту, проведенную к этой стороне. Определите в классе абстрактный метод area(), который будет использоваться подклассами для расчета площади соответствующих им геометрических фигур. Для реализации абстрактности метода используйте возбуждение исключения NotImplementedError. Далее создайте классы Triangle и Rectangle, наследующие суперкласс Shape и реализующие его абстрактный метод под свои нужды. Продемонстрируйте использование созданных классов для нахождения площади треугольника и прямоугольника по известным значениям длины стороны и высоты, проведенной к этой стороне. Закомментируйте в одном из классов переопределяемый метод area(), использовав вместо него инструкцию pass, и повторно запустите скрипт. Объясните результат. Еще раз посмотрите решение задачи 13.11. Показать решение.
Использование утилиты pip и виртуальных окружений
Теоретический материал по работе с менеджером пакетов pip и виртуальными окружениями можно почитать в нашем учебнике здесь.
17.1. Выполните в консоли своей операционной системы с помощью менеджера пакетов pip следующее упражнение:
- выведите текущую версию pip;
- выведите справку по нему;
- выведите список пакетов, установленных в текущем окружении;
- установите пакет cowsay;
- выведите информацию о пакете cowsay;
- повторно выведите список пакетов, установленных в окружении;
- удалите пакет cowsay;
- еще раз выведите список пакетов, установленных в окружении.
Если имеется такая возможность, выполните упражнение как в ОС Windows, так и в ОС Ubuntu. Показать решение.
17.2. Напишите класс PipManager, в котором определите следующие методы:
- show_pip_version() – вывод версии менеджера;
- show_pip_help() – вывод справки по менеджеру;
- install_package(package_name) – установка пакета;
- upgrade_package(package_name) – обновление пакета;
- show_package_info(package_name) – вывод информации о пакете;
- show_packages() – вывод списка установленных пакетов;
- uninstall_package(package_name) – удаление пакета.
Используя возможности созданного класса, дополните скрипт так, чтобы он смог выполнить предыдущее упражнение в автоматическом режиме. Показать решение.
17.3. Создайте вручную каталог проекта my_prj. Откройте командную оболочку, перейдя в каталог проекта, и выполните в ней следующее упражнение:
- создайте виртуальное окружение в подкаталоге my_venv проекта, использовав текущую версию Python;
- активируйте виртуальное окружение проекта;
- обновите менеджер пакетов pip окружения;
- выведите его версию;
- деактивируйте виртуальное окружение.
Если имеется такая возможность, выполните упражнение как в ОС Windows, так и в ОС Ubuntu. Показать решение.
17.4. Создайте вручную каталог проекта my_prj (или очистите старый). Откройте командную оболочку, перейдя в каталог проекта, и выполните в ней следующее упражнение:
- создайте виртуальное окружение в подкаталоге venv_2 проекта, использовав текущую версию Python;
- активируйте виртуальное окружение проекта;
- обновите менеджер пакетов pip окружения;
- установите пакет pillow;
- выведите список установленных пакетов;
- сохраните зависимости в файл requirements.txt в корневой каталог проекта;
- деактивируйте виртуальное окружение;
- удалите каталог виртуального окружения;
- заново создайте виртуальное окружение, но уже в подкаталоге venv_3 проекта, использовав текущую версию Python;
- активируйте виртуальное окружение проекта;
- обновите менеджер пакетов pip окружения;
- восстановите все зависимости проекта из файла requirements.txt;
- выведите список установленных пакетов;
- деактивируйте виртуальное окружение.
Если имеется такая возможность, выполните упражнение как в ОС Windows, так и в ОС Ubuntu. Показать решение.
17.5. Создайте каталог проекта my_prj (или очистите старый). В нем создайте файл main.py, в котором напишите скрипт вывода информации об используемой версии Python. Откройте командную оболочку, перейдя в каталог проекта, и выполните в ней следующее упражнение:
- запустите файл на исполнение;
- создайте виртуальное окружение в подкаталоге my_venvs/venv_1 проекта, использовав при этом версию интерпретатора Python3.9;
- активируйте виртуальное окружение;
- запустите файл на исполнение;
- деактивируйте виртуальное окружение;
- внесите изменения в код файла так, чтобы при запуске на исполнение мог задействоваться интерпретатор виртуального окружения проекта, а не системный;
- запустите файл на исполнение под интерпретатором виртуального окружения проекта.
- запустите файл на исполнение под системным интерпретатором.
Если имеется такая возможность, выполните упражнение как в ОС Windows, так и в ОС Ubuntu. Показать решение.
Задачи на дату и время
Теоретический материал по работе с датой и временем можно почитать в нашем учебнике здесь.
18.1. Выведите на экран текущие дату и время, использовав для этого возможности модуля datetime стандартной библиотеки. Показать решение.
18.2. Выведите на экран в ISO 8601 формате текущие дату и время с точностью до секунд. Для вывода даты используйте формат «Дата: {iso_date}», а для времени – «Время: {iso_time}». Показать решение.
18.3. Выведите на экран текущую дату и время в форматах «DD.MM.YY HH:MM:SS», «DD/MM/YY HH:MM:SS», «DD-MM-YY» и «HH:MM:SS». Показать решение.
18.4. Выведите на экран текущие компоненты даты и времи по отдельности: год в формате «YYYY», месяц в формате «MM», название месяца на русском языке, число, название дня недели на русском языке, часы, минуты и секунды. Показать решение.
18.5. Допустим, что сегодня 13 марта 2023 года. Сколько дней осталось до нового года? А сколько до следующего Международного женского дня? Показать решение.
18.6. Допустим, что сегодня 14 марта 2023 года, Катя работает по графику пятидневной рабочей недели и находится в заслуженном отпуске, который заканчивается через 17 календарных дней (не включая текущей даты). Придется ли ей выходить на работу сразу или же отпуск продлится за счет выходных дней? Показать решение.
18.7. Напишите функцию, которая будет проверять входную строку с датой и временем на соответствие формату ISO 8601, возвращая при этом соответствующее булево значение True или False. Используйте функцию для проверки строк '2011-11-04T00:05:23' и '2011-11-04T00:05:23.' Показать решение.
18.8. Установите сторонний модуль isodate. Используя его возможности, напишите функцию, которая будет проверять входную строку с промежутком времени в формате 'PyYmMdDThHmMsS', где y, m, d, h, m, s – это количество лет, месяцев и т.д., на соответствие формату ISO 8601, возвращая при этом соответствующее булево значение True или False. Используйте функцию для проверки строк 'P3Y7M4DT12H30M19S' и '2021-05-14T09:05:23'. Показать решение.
Олимпиадные задачи
В разделе представлены адаптированные задачи начального и среднего уровня сложности по олимпиадному программированию. Здесь вам предстоит уже самостоятельно определяться с выбором способа решения той или иной задачи в пределах объема знаний и навыков, полученных вами в ходе решения задач во всех предыдущих разделах задачника. Кроме того, могут понадобиться знания из других областей, например, математики, а также наблюдательность и смекалка.
Далеко не факт, что мои решения будут оптимальными и совпадать с вашими. Какое решение мне пришло в голову первым, то я и указал. Так что не судите строго и присылайте ваши решения, если они более рациональные и отличаются от предложенных.
19.1. Дана строка целых чисел '36 787 0 9993754\n2253', отделённых друг от друга неравномерным количеством пробелов и переводов строк. Необходимо для каждого числа, начиная с последнего и заканчивая первым, вывести на экран в отдельной строке его квадратный корень с точностью до пяти знаков после десятичной точки. Показать решение.
19.2. С клавиатуры вводится целое положительное число n < 10000. Напишите скрипт, который будет находить и выводить на экран минимальное положительное целое число q такое, что произведение цифр этого числа будет в точности равняться числу n. В случае отсутствия такого числа q скрипт должен выводить на экран сообщение «Искомого числа q не существует!». Например, для числа 70 искомым числом будет 257. Показать решение.
19.3. Представьте, что у вас имеется некоторое количество камней n (1 ≤ n ≤ 100) известного веса w1, w2, w3, ..., где wi – это целые положительные числа от 1 до 1000000 включительно. Напишите скрипт, который распределит камни в две кучи так, чтобы разность весов этих двух куч была минимальной. Количество камней и веса должны генерироваться случайным образом. Сам скрипт должен возвращать число, равное минимальной разности весов двух куч. Например, для трех камней с весами 15, 20 и 3 скрипт должен возвращать число 2. На выполнение скрипта дается не более одной секунды. Показать решение.
19.4. В кругу стоят n человек. Все они пронумерованны числами от 1 до n. Начинается расчет, при котором каждый k-й по счету человек выбывает из круга, после чего счет продолжается со следующего за ним человека. Напишите программу, которая будет определять номер человека, остающегося в кругу последним. Данная задача представляет собой один из вариантов классической задачи Иосифа Флавия, вошедшей в 1612 году в одну из ранних работ по занимательной математике французкого математика Баше де Мезириака. Показать решение.
Первые скрипты и программы
В разделе представлены простейшие скрипты и программы, которые помогут вам закрепить первоначальные практические навыки, полученные в ходе решения задач во всех предыдущих разделах задачника. Если ранее вы уже писали программы на другом языке программирования, можете пробовать осилить все предлагаемые варианты самостоятельно. Что касается начинающих программистов, то им вначале следует внимательно разобраться в готовом решении и только затем приступать к обязательному самостоятельному набору кода. Важно понимать, что простое чтение исходного кода никакой практической пользы не принесет. Поэтому код набирать нужно в любом случае!
1. Шаблон №1. Напишите скрипт hello_world.py, который будет выводить на экран обычное приветствие «Привет, мир!». Оформите содержимое скрипта следующим образом:
- В начале скрипта напишите три комментария, описывающие порядок импортирования модулей и пакетов и начинающиеся словами «Импортируем модули ...».
- За ними определите простейшую функцию simple_func и простейший класс SimpleClass, использовав инструкцию pass.
- Далее определите основную функцию скрипта main, в теле которой вызовите функцию simple_func, создайте экзмепляр класса SimpleClass, осуществите вывод целевого сообщения и завершите все пустой инструкцией input, чтобы окно скрипта автоматически не закрывалось после вывода сообщения.
- В конец скрипта поместите условную инструкцию, которая будет осуществлять вызов основной функции, но только в том случае, если модуль будет запускаться как основная программа, а не импортироваться другим модулем.
2. Шаблон №2. Дополните код предыдущей задачи таким образом, чтобы после показа целевого сообщения пользователю выводился запрос на продолжение работы программы (символ 'y') либо выход из нее (символ 'n'). Для решения задачи используйте цикл с флагом «while flag:», прерывающийся по значению флага, либо бесконечный цикл «while True:», регулируемый условной инструкцией if в теле цикла. Показать решение.
3. Менеджер пакетов Python. Напишите программу-оболочку для менеджера пакетов pip, которая будет выполнять команды из предлагаемого пользователю меню (см. пример запуска программы). В программе создайте класс PipInstaller с методами менеджера пакетов pip (см. пункт «Установка сторонних библиотек» нашего учебника). Дайте методам следующие имена: show_pip_version, show_pip_help, upgrade_pip, install_package, reinstall_package, upgrade_package, show_package_info, show_packages_list, uninstall_package, create_requirements и use_requirements. Последние два метода должны запрашивать путь к каталогу создания/расположения файла requirements.txt. Показать решение.
Менеджер пакетов Python, версия 1.0.
Список доступных комманд:
показать версию pip: 1,
показать краткую справку по pip: 2,
обновить менеджер pip: 3,
установить пакет: 4,
установить пакет принудительно: 5,
обновить пакет: 6,
удалить пакет: 7,
показать информацию о пакете: 8,
показать список установленных пакетов: 9,
создать requirements.txt: 10,
установить пакеты из requirements.txt: 11,
выйти из программы: -1.
Сделайте выбор: 4
Введите имя пакета: pillow
Collecting pillow
Using cached Pillow-9.3.0-cp311-cp311-win_amd64.whl (2.5 MB)
Installing collected packages: pillow
Successfully installed pillow-9.3.0
[notice] A new release of pip available: 22.3 -> 22.3.1
[notice] To update, run: python.exe -m pip install --upgrade pip
Для продолжения нажмите 'Ввод'...
--------------
Список доступных комманд:
показать версию pip: 1,
показать краткую справку по pip: 2,
обновить менеджер pip: 3,
установить пакет: 4,
установить пакет принудительно: 5,
обновить пакет: 6,
удалить пакет: 7,
показать информацию о пакете: 8,
показать список установленных пакетов: 9,
создать requirements.txt: 10,
установить пакеты из requirements.txt: 11,
выйти из программы: -1.
Сделайте выбор: 10
Укажите путь к целевому каталогу с последним слешем: ./test/
Файл успешно создан в каталоге ./test/ !
Для продолжения нажмите 'Ввод'...
4. Таблица умножения. Напишите программу «тренажер_таблицы_умножения.py» для заучивания таблицы умножения. Программа должна:
- выводить свое название и версию;
- выводить меню, в котором пользователю будет предлагаться вывод таблицы умножения для повторения, запуск тренажера или выход из программы (см. пример запуска программы);
- после каждой попытки ответа пользователя программа должна выводить сообщение о правильности ответа и запрашивать подтверждение на продолжение работы программы либо выход из нее, а в случае неправильного ответа помимо сообщения об ошибке программа должна выводить еще и правильный ответ.
Вывод таблицы умножения и запуск тренажера оформите в виде функций, которые затем будут использоваться в теле основной функции программы. Показать решение.
Тренажер таблицы умножения, версия 1.0. Вывести таблицу умножения: t Запустить тренажер: r Выйти из программы: q >t Таблица умножения. ----+------------------------------------- | х | 1 2 3 4 5 6 7 8 9 | ----+------------------------------------- | 1 | 1 2 3 4 5 6 7 8 9 | | 2 | 2 4 6 8 10 12 14 16 18 | | 3 | 3 6 9 12 15 18 21 24 27 | | 4 | 4 8 12 16 20 24 28 32 36 | | 5 | 5 10 15 20 25 30 35 40 45 | | 6 | 6 12 18 24 30 36 42 48 54 | | 7 | 7 14 21 28 35 42 49 56 63 | | 8 | 8 16 24 32 40 48 56 64 72 | | 9 | 9 18 27 36 45 54 63 72 81 | ----+------------------------------------- Вывести таблицу умножения: t Запустить тренажер: r Выйти из программы: q >r 4*8 = 32 Верно! Продолжить/Меню (any_key/m): 7*4 = 30 Вы ошиблись! 7*4 = 28 Продолжить/Меню (any_key/m): m Вывести таблицу умножения: t Запустить тренажер: r Выйти из программы: q >
5. Игра «Камень, ножницы, бумага». Напишите программу для игры в «Камень, ножницы, бумага» с компьютером. Оформление и общий алгоритм хода игры представлены в примере запуска программы ниже. Для решения задачи вам понадобятся модули random, sys (выход из программы через sys.exit()), time (использование задержек через time.sleep(0.5)). Что касается функций, то их можете не использовать вообще, оформив все через циклы с прерыванием. Показать решение.
Игра «Камень, ножницы, бумага», версия 1.0.
----------------------------------------------
Каждый из игроков может выбрать «Камень»,
«Ножницы» или «Бумагу». Победитель определяется
по следующим правилам: «Камень» бьет «Ножницы»,
«Ножницы» — «Бумагу», а «Бумага» бьет «Камень».
----------------------------------------------
Победы: 0, проигрыши 0, ничьи 0.
Выберите (К)амень, (Н)ожницы, (Б)умагу или (В)ыход?
> к
«Камень» против ...
1...
2...
3...
«Бумага»
Вы проиграли!
----------------------------------------------
Победы: 0, проигрыши 1, ничьи 0.
Выберите (К)амень, (Н)ожницы, (Б)умагу или (В)ыход?
> н
«Ножницы» против ...
1...
2...
3...
«Бумага»
Вы выиграли!
----------------------------------------------
Победы: 1, проигрыши 1, ничьи 0.
Выберите (К)амень, (Н)ожницы, (Б)умагу или (В)ыход?
> б
«Бумага» против ...
1...
2...
3...
«Камень»
Вы выиграли!
----------------------------------------------
Победы: 2, проигрыши 1, ничьи 0.
Выберите (К)амень, (Н)ожницы, (Б)умагу или (В)ыход?
> в
Спасибо за игру!
6. Квадратное уравнение. Напишите программу, которая по введенным пользователем коэффициентам квадратного уравнения ax2 + bx + c = 0 будет выдавать ответ с точностью до тысячных и готовое решение. Программа должна:
- выводить свое название и версию, а также краткое описание;
- принимать на ввод коэффициенты уравнения в виде действительных чисел, например, -3.27, или в виде обыкновенных дробей, например, -5/7;
- проверять вводимые значения на допустимость ввода, предлагая в случае ошибки повторный ввод коэффициента или запрашивая выход из программы в противном случае;
- выводить решение с пояснениями включая случаи, когда один или несколько коэффициентов равны нулю;
- после вывода решения выводить запрос на продолжение работы программы или выход из нее.
Решение квадратных уравнений, версия 1.0.
----------------------------------------------
1. Для решения уравнения необходимо ввести коэффициенты
в формате десятичной дроби, например, -1.35, либо в формате
обыкновенной дроби с числителем и знаменателем, например, -3/5.
2. Результат будет рассчитан с точностью до 0,001.
----------------------------------------------
Введите коэффициенты для a*x^2 + b*x + c = 0.
a = -5
b = -3
c = 2
Решаем уравнение -5.0*x^2 - 3.0*x + 2.0 = 0.
Находим дискриминант по формуле b^2 - 4*a*c:
D = b^2 - 4*a*c = 49.0.
Т.к. дискриминант больше нуля, уравнение имеет два корня:
x1 = (-b + √D)/(2*a) = (-(-3.0) + √49.0)/(2*(-5.0)) = -1.0,
x2 = (-b - √D)/(2*a) = (-(-3.0) - √49.0)/(2*(-5.0)) = 0.4.
Продолжить/выйти (any_key/q):
7. Менеджер проектов. Перейдите в раздел «Python :: Коды, программы, скрипты», найдите там учебный проект «Консольный менеджер проектов», внимательно изучите его исходный код, а затем наберите код программы самостоятельно.
8. Игра «Блек Джек». Напишите программу для игры в «Black Jack» с компьютером. Для этого перейдите на страницу учебного проекта, загрузите и внимательно изучите его код, после чего сверстайте игру самостоятельно.
9. Модуль оффлайн распознавания речи. Напишите скрипт для оффлайн распознавания речи, использовав для этого библиотеку Vosk и ее предобученную модель русского языка. Для этого перейдите в раздел «Python :: Коды, программы, скрипты», найдите там данный учебный проект, внимательно изучите его, а затем наберите код скрипта самостоятельно.
10. Приложение «Голосовой переводчик». Напишите русско-английский голосовой переводчик, который будет автоматически переводить речь пользователя с английского языка на русский или наоборот и сразу же произносить результат перевода. Для этого перейдите на страницу учебного проекта «Голосовой переводчик», загрузите и внимательно изучите его код, после чего сверстайте приложение самостоятельно.
Приложения с GUI
В разделе представлены различные утилиты, скрипты и программы с графическим интерфейсом пользователя (GUI). Для того, чтобы осилить верстку данных приложений, вам придется познакомиться с некоторыми дополнительными библиотеками и фрейворками, например, с библиотекой PyQt6 (PySide6). Но это того стоит! Ведь на ядре и стандартной библиотеке Python мир не заканчивается, и далее вам предстоит постоянно совершенствоваться, изучая все новые и новые сторонние инструменты, необходимые для эффективной разработки приложений в выбранной вами области.
Опять же, вначале следует внимательно разобраться в готом решении программы и только затем приступать к обязательному самостоятельному набору кода. Важно понимать, что простое чтение решений никакой практической пользы не принесет. Поэтому код набирать нужно в любом случае!
1. Электронные часы. Создайте простейший виджет электронных часов на Python с графическим интерфейсом на PyQt6 (Pyside6), который будет отображать на рабочем столе текущие время и дату. Для этого зайдите на страницу учебного проекта «Электронные часы», загрузите и внимательно изучите его код, после чего сверстайте виджет самостоятельно.
2. Калькулятор со скобками. Используя графическую библиотеку PyQt6 (Pyside6), напишите простейший калькулятор, который сможет вычислять выражения со скобками и следующими основными математическими операциями: сложение, вычитание, деление и умножение. Для этого зайдите на страницу учебного проекта «Калькулятор со скобками», загрузите и внимательно изучите его код, после чего сверстайте программу самостоятельно.