книга заданий пайтон. книга практических заданий, pyton. Сборник упражнений Введение в язык Python с задачами и решениями Бен Стивенсон Москва, 2021 удк 004. 438Python
Скачать 2.24 Mb.
|
Упражнение 170. Пропущенные комментарии## # Находим и отображаем имена функций Python, которым не предшествует строка с комментарием # from sys import argv # Проверяем аргументы командной строки if len(argv) == 1: print("По крайней мере одно имя файла должно присутствовать в качестве", \ "аргумента командной строки.") print("Завершаем программу...") quit() # Обрабатываем все файлы, имена которых переданы в виде аргументов командной строки for fname in argv[1 : len(argv)]: # Попытка обработать файл try: inf = open(fname, "r") # Двигаясь по файлу, нам важно хранить копию предыдущей строки, чтобы # можно было проверить, начинается ли она с символа комментария. # Также нам необходимо считать строки в файле prev = " " lnum = 1 Переменная prev должна быть инициализирована строкой длиной как минимум в один символ. Иначе программа закроется аварийно, если в первой строке анализируемого файла будет начинаться определение функции. # Считываем все строки из файла for line in inf: # Если нашли функцию без комментария if line.startswith("def ") and prev[0] != "#": # Ищем первую открывающую скобку в строке, чтобы считать имя функции bracket_pos = line.index("(") name = line[4 : bracket_pos] # Отображаем информацию о недокументированной функции print("%s строка %d: %s" % (fname, lnum, name)) # Сохраняем текущую строку и обновляем счетчик prev = line lnum = lnum + 1 # Закрываем текущий файл inf.close() except: print("Возникла проблема с файлом '%s'." % fname) print("Идем к следующему файлу...") Глава 16 РекурсияУпражнение 173. Сумма значений## # Вычисление суммы значений, введенных пользователем. Для окончания ввода # необходимо оставить ввод пустым # ## Вычисление суммы значений, введенных пользователем # @return сумма введенных значений def readAndTotal(): # Запрашиваем значение у пользователя line = input("Введите число (пропустите ввод для завершения): ") # Базовый случай: пользователь пропустил ввод, возвращаем 0 if line == "": return 0 else: # Рекурсивный случай: преобразуем line в число и используем рекурсию для # чтения следующих строк return float(line) + readAndTotal() # Запрашиваем у пользователя ряд чисел и отображаем их сумму def main(): total = readAndTotal() print("Сумма введенных чисел:", total) # Вызов основной функции main() Упражнение 178. Рекурсивные палиндромы## # Определяем, является ли введенная строка палиндромом, с использованием рекурсии # ## Определяем, является ли введенная строка палиндромом # @param s – строка для проверки # @return True, если палиндром, False в противном случае def isPalindrome(s): # Базовый случай: пустая строка является палиндромом, так же, как и строка длиной в один символ if len(s) <= 1: return True # Рекурсивный случай: строку можно считать палиндромом, если первый и последний # символы одинаковые, а подстрока, исключающая эти символы, также является палиндромом return s[0] == s[len(s) – 1] and \ isPalindrome(s[1 : len(s) – 1]) # Определяем, является ли введенная строка палиндромом def main(): # Запрашиваем строку у пользователя line = input("Введите строку: ") # Проверяем и выводим результат if isPalindrome(line): print("Это палиндром!") else: print("Это не палиндром.") # Вызов основной функции main() Упражнение 180. Редакционное расстояние## # Вычисляем и отображаем редакционное расстояние между строками # ## Вычисляем и отображаем редакционное расстояние между строками # @param s – первая строка # @param t – вторая строка # @return редакционное расстояние между этими строками def editDistance(s, t): # Если одна из строк пустая, то в редакционное расстояние включается по одному пункту # для вставки каждого символа из второй строки if len(s) == 0: return len(t) elif len(t) == 0: return len(s) else: cost = 0 # Если последние символы не совпадают, устанавливаем cost в 1 232 Решения if s[len(s) – 1] != t[len(t) – 1]: cost = 1 # Рассчитываем три расстояния d1 = editDistance(s[0 : len(s) – 1], t) + 1 d2 = editDistance(s, t[0 : len(t) – 1]) + 1 d3 = editDistance(s[0 : len(s) – 1] , t[0 : len(t) – 1]) + \ cost # Возвращаем минимальное return min(d1, d2, d3) # Рассчитываем редакционное расстояние между двумя строками, введенными пользователем def main(): # Запрашиваем у пользователя две строки s1 = input("Введите строку: ") s2 = input("Введите другую строку: ") # Рассчитываем и отображаем редакционное расстояние print("Редакционное расстояние между %s и %s равно %d." % \ (s1, s2, editDistance(s1, s2))) # Вызов основной функции main() Упражнение 183. Последовательность химических элементов## # Определяем максимально продолжительную последовательность химических элементов, # в которой следующий элемент начинается на последнюю букву предыдущего # ELEMENTS_FNAME = "../Data/Elements.csv" ## Определяем максимально продолжительную последовательность химических элементов, # в которой следующий элемент начинается на последнюю букву предыдущего # @param start – первое слово в последовательности # @param words – список слов, которые могут появляться в последовательности # @return максимальная по длине последовательность слов def longestSequence(start, words): # Базовый случай: Если start пустая, то и список слов пустой if start == "": return [] # Находим самый длинный список слов, проверяя все слова, которые могут # появиться в последовательности best = [] last_letter = start[len(start) – 1].lower() for i in range(0, len(words)): first_letter = words[i][0].lower() # Если первая буква следующего слова совпадает с последней буквой предыдущего if first_letter == last_letter: # Используем рекурсию для поиска последовательности–кандидата candidate = longestSequence(words[i], \ words[0 : i] + words[i + 1 : len(words)]) # Сохраняем последовательность, если она лучшая на данный момент if len(candidate) > len(best): best = candidate # Возвращаем лучшую последовательность с первым словом в начале return [start] + best ## Загружаем все элементы из файла # @return список всех элементов def loadNames(): names = [] # Открываем файл с набором данных inf = open(ELEMENTS_FNAME, "r") # Загружаем построчно в список элементов for line in inf: line = line.rstrip() parts = line.split(",") names.append(parts[2]) # Закрываем файл и возвращаем список inf.close() return names # Отображаем самую длинную последовательность, начинающуюся со введенного # пользователем элемента def main(): # Загружаем имена элементов в список names = loadNames() # Считываем первый элемент и делаем первую букву заглавной start = input("Введите название элемента: ") start = start.capitalize() # Проверяем, что пользователь ввел правильный элемент if start in names: # Удаляем первый элемент из списка names.remove(start) # Находим самую длинную последовательность sequence = longestSequence(start, names) # Отображаем последовательность элементов 234 Решения print("Самая длинная последовательность, начинающаяся с", start, ", это:") for element in sequence: print(" ", element) else: print("Извините, вы ввели неправильный элемент.") # Вызов основной функции main() Упражнение 184. Выравниваем список## # Используя рекурсию, выравниваем список с вложенными элементами # ## Удаляем все иерархии внутри списка # @param data – список для выравнивания # @return выровненная версия списка def flatten(data): # Если список пустой, делать нечего if data == []: return [] # Если первый элемент списка – список if type(data[0]) == list: # Выравниваем первый элемент и остальные return flatten(data[0]) + flatten(data[1:]) else: # Первый элемент – не список, так что только остальные элементы нужно # выравнивать return [data[0]] + flatten(data[1:]) # Демонстрируем работу функции def main(): print(flatten([1, [2, 3], [4, [5, [6, 7]]], [[[8], 9], [10]]])) print(flatten([1, [2, [3, [4, [5, [6, [7, [8, [9, \ [10]]]]]]]]]])) print(flatten([[[[[[[[[[1], 2], 3], 4], 5], 6], 7], 8], 9], \ 10])) print(flatten([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])) print(flatten([])) # Вызов основной функции main() Упражнение 186. Кодирование на основе длин серий## # Выполняем кодирование на основе длин серий для строк и списков # ## Кодирование на основе длин серий для строк и списков # @param data – строка или список для кодирования # @return список, в котором на четных позициях располагаются значения, # а на нечетных – количество раз, которое должно повториться предшествующее значение def encode(data): # Если данных нет, нечего и кодировать if len(data) == 0: return [] Если бы мы задали условие data == "", то эта функция работала бы только для строк. Если data == [], то только для списков. Проверка длины списка len(data) == 0 позволяет обеспечить правильную работу функции как для строк, так и для списков. # Находим индекс первого элемента, отличного от элемента с индексом 0 index = 1 while index < len(data) and data[index] == data[index – 1]: index = index + 1 # Кодируем группу символов current = [data[0], index] # Используем рекурсию для обработки символов от index до конца строки return current + encode(data[index : len(data)]) # Демонстрируем работу функции кодирования def main(): # Запрашиваем строку у пользователя s = input("Введите строку символов: ") # Отображаем результат print("При использовании кодирования на основе длин серий " \ "результат будет следующим:", encode(s)) # Вызов основной функции main() Предметный указательБ Булевы выражения, 41 Булевы операторы, 41 В Вложенные циклы, 59 Вложенные if, 40 И Инструкция def, 71 else, 38 if, 36 if-else, 38 return, 75 Исключения, 133 блок except, 133 блок try, 133 К Комментарии, 19 Конкатенация, 22 М Математические операторы, 15 возведение в степень, 15 вычисление остатка от деления, 15 вычитание, 15 деление, 15 деление без остатка, 15 сложение, 15 умножение, 15 Метод append, 93 close, 126 index, 96 pop, 94 read, 127 readline, 126 readlines, 127 remove, 94 reverse, 95 rstrip, 129 sort, 95 write, 130 Методы, 93 Модули, 18 О Оператор in, 96 П Пары ключ-значение, 112 Переменные, 14 локальные, 75 Получение символа из строки, 23 Р Рекурсия, 145 С Словари, 112 Спецификаторы формата, 19 Списки, 89 индексы, 90 элементы, 89 Срез, 23 Т Таблицы истинности, 41 Предметный указатель Ф ord, 184 Файлы print, 17 двоичные, 125 range, 58 режим доступа, 126 str, 130 текстовые, 125 аргументы, 72 файловый объект, 126 вызов, 71 Форматирующий оператор, 21 определение, 71 Функции, 15, 71 переменные параметров, 72 chr, 184 Ц float, 16 input, 16 Циклы int, 16 for, 57 len, 23, 91 while, 56 open, 126 Книги издательства «ДМК ПРЕСС» можно купить оптом и в розницу в книготорговой компании «Галактика» (представляет интересы издательств «ДМК ПРЕСС», «СОЛОН ПРЕСС», «КТК Галактика»). Адрес: г. Москва, пр. Андропова, 38; тел.: (499) 782-38-89, электронная почта: books@alians-kniga.ru. При оформлении заказа следует указать адрес (полностью), по которому должны быть высланы книги; фамилию, имя и отчество получателя. Желательно также указать свой телефон и электронный адрес. Эти книги вы можете заказать и в интернет-магазине: www.a-planeta.ru. Бен Стивенсон Python. Сборник упражнений Главный редактор Мовчан Д. А. Зам. главного редактора Сенченкова Е. А. dmkpress@gmail.com Перевод Гинько А. Ю. Корректор Синяева Г. И. Верстка Чаннова А. А. Дизайн обложки Мовчан А. Г. Гарнитура PT Serif. Печать цифровая. Усл. печ. л. 17,4. Тираж 200 экз. Веб-сайт издательства: www.dmkpress.com 1 .1. циклы while Цикл while дает возможность выполнять набор инструкций сколь угодно долго – до тех пор, пока соответствующее условное выражение возвращает True. Как и if, выражение while обладает своим условием и телом, написанным с отступами. Если условное выражение инструкции while возвращает True, тело выполняется, после чего снова производится проверка условия. Если оно по-прежнему возвращает истину, тело выполняется вновь, и т. д. Таким образом, тело цикла будет выполняться до тех пор, пока условное выражение не вернет значение False. Как только это произошло, тело цикла будет пропущено, и выполнение программы возобновится с первой инструкции, следующей после тела while. Часто в условных выражениях инструкции while выполняется сравнение введенного пользователем значения с содержимым другой переменной, в результате чего у пользователя есть возможность ввести ожидаемое значение для выхода из цикла. В этом случае условное выражение инструкции while должно вернуть значение False, после чего произойдет |