Вы – разработчик Python, оттачиваете свои навыки перед собеседованием? Если это так, то эта статьи проведет вас через серию практических задач Python, предназначенных для моделирования распространенных сценариев тестирования кодирования. После разработки собственных решений вы пройдете через ответы, чтобы вы могли оптимизировать свой код, произвести впечатление на интервьюера и получить работу своей мечты!
В этой статье вы узнаете, как:
- Написать код для задач в стиле интервью
- Обсудите свои решения во время интервью
- Проработайте часто упускаемые из виду детали
- Поговорите о дизайнерских решениях и компромиссах
Эта статья предназначена для разработчиков Python среднего уровня.
Практическая задача Python 1: сумма диапазона целых чисел
Начнем с разминки. В первой задаче практики, вы будете писать код, чтобы суммировать список из целых чисел. Каждая практическая задача включает описание проблемы. Это описание извлекается непосредственно из файлов скелета в репозитории, чтобы его было легче запомнить, пока вы работаете над своим решением.
Описание проблемы
Вот ваша первая проблема:
# integersums.py """ Sum of Integers Up To n Write a function, add_it_up(), that takes a single integer as input and returns the sum of the integers from zero to the input parameter. The function should return 0 if a non-integer is passed in. """
Решение проблемы
Для этой проблемы вы рассмотрите несколько различных решений. Первое из них не так уж хорош:
# integersums.py def first(n): num = 1 sum = 0 while num < n + 1: sum = sum + num num = num + 1 return sum
В этом решении вы вручную создаете цикл while для выполнения сквозных чисел 1n. Вы продолжаете работать sum, а затем возвращаете его, когда закончите цикл.
Это решение работает, но у него есть две проблемы:
- Он не отображает ваши знания о Python и о том, как язык упрощает подобные задачи.
- Он не соответствует условиям ошибки в описании проблемы. Передача строки приведет к тому, что функция выдаст исключение, когда она должна просто вернуться.
Вы будете иметь дело с условиями ошибки в окончательном ответе ниже, но сначала давайте уточним основное решение, чтобы оно было немного более Пифоническим.
Первое, о чем нужно подумать while, – это цикл. Python имеет мощные механизмы для перебора списков и диапазонов. Создание своего собственного, как правило, не требуется, и это, безусловно, так здесь. Вы можете заменить цикл while циклом, который повторяется range():
# integersums.py def better(n): sum = 0 for num in range(n + 1): sum += num return sum
Вы можете видеть, что конструкция for…range() заменила ваш цикл while и сократила код. Одна вещь, которую следует отметить, это то, что range() идет вверх, но не включает в себя данное число, поэтому вам нужно использовать здесь n + 1.
Это был хороший шаг! Он удаляет часть шаблонного кода циклирования по диапазону и делает ваше намерение более ясным. Но здесь вы можете сделать еще больше.
Суммирование списка целых чисел-это еще одна вещь, в которой хорош Python:
# integersums.py def even_better(n): return sum(range(n + 1))
Ух ты! Используя встроенный модуль sum(), вы получили это до одной строки кода! Хотя code golf обычно не производит наиболее читаемый код, в этом случае у вас есть беспроигрышный вариант: более короткий и более читаемый код.
Однако остается одна проблема. Этот код все еще не обрабатывает условия ошибки правильно. Чтобы исправить это, вы можете обернуть свой предыдущий код в блок try…except:
# integersums.py def add_it_up(n): try: result = sum(range(n + 1)) except TypeError: result = 0 return result
Это решает проблему и правильно обрабатывает условия ошибки.
Иногда интервьюеры задают этот вопрос с фиксированным пределом, что-то вроде “выведите сумму первых девяти целых чисел. “Когда проблема сформулирована таким образом, одно правильное решение было бы print(45).
Однако если вы дадите этот ответ, то вам следует продолжить работу с кодом, который шаг за шагом решает проблему. Ответ на трюк-это хорошее место, чтобы начать свой ответ, но это не лучшее место, чтобы закончить.
Если вы хотите расширить эту проблему, попробуйте добавить дополнительный нижний предел add_it_up(), чтобы придать ей большую гибкость!
Практическая задача Python 2: шифр Цезаря
Следующий вопрос состоит из двух частей. Вы создадите код функции для вычисления шифра Цезаря при вводе текста. Для этой проблемы вы можете использовать любую часть стандартной библиотеки Python для преобразования.
Подсказка: в классе str есть функция, которая значительно облегчит эту задачу!
Описание проблемы
# caesar.py """ Caesar Cipher A Caesar cipher is a simple substitution cipher in which each letter of the plain text is substituted with a letter found by moving n places down the alphabet. For example, assume the input plain text is the following: abcd xyz If the shift value, n, is 4, then the encrypted text would be the following: efgh bcd You are to write a function that accepts two arguments, a plain-text message and a number of letters to shift in the cipher. The function will return an encrypted string with all letters transformed and all punctuation and whitespace remaining unchanged. Note: You can assume the plain text is all lowercase ASCII except for whitespace and punctuation. """
Помните, что эта часть вопроса действительно о том, насколько хорошо вы можете работать со стандартной библиотекой. Если вы понимаете, как выполнить преобразование без библиотеки, сохраните эту мысль! Вам это понадобится позже!
Решение проблемы
Вот решение проблемы с шифром Цезаря, описанной выше.
Это решение использует класс .translate() из стандартной библиотеки. Если вы боролись с этой проблемой, то, возможно, вам захочется сделать паузу и подумать, как вы могли бы использовать .translate() ее в своем решении.
Хорошо, теперь, когда вы готовы, давайте рассмотрим это решение:
1 # caesar.py 2 import string 3 4 def caesar(plain_text, shift_num=1): 5 letters = string.ascii_lowercase 6 mask = letters[shift_num:] + letters[:shift_num] 7 trantab = str.maketrans(letters, mask) 8 return plain_text.translate(trantab)
Вы можете видеть, что функция использует три вещи из модуля string:
- .ascii_lowercase
- .maketrans()
- .translate()
В первых двух строках вы создаете переменную со всеми строчными буквами алфавита (ASCII только для этой программы), а затем создаете amask, который представляет собой тот же набор букв, только сдвинутый. Синтаксис нарезки не всегда очевиден, поэтому давайте рассмотрим его на примере реального мира:
>>>
>>> import string >>> x = string.ascii_lowercase >>> x 'abcdefghijklmnopqrstuvwxyz' >>> x[3:] 'defghijklmnopqrstuvwxyz' >>> x[:3] 'abc'
Вы можете видеть, что x[3:] это все буквы после третьей буквы ‘c’, в то время x[:3] как это только первые три буквы.
Строка 6 в решении, letters[shift_num:] + letters[:shift_num], создает список букв, сдвинутых по буквам shift_num, с буквами в конце, обернутыми вокруг к фронту. Как только у вас есть список букв и mask, которые вы хотите сопоставить, вы вызываете .maketrans(), чтобы создать таблицу перевода.
Затем вы передаете таблицу перевода строковому методу .translate(). Он сопоставляет все символы с letters соответствующими буквами mask и оставляет все остальные символы в покое.
Этот вопрос является упражнением в знании и использовании стандартной библиотеки. Вам могут задать такой вопрос в какой-то момент во время интервью. Если это случится с вами, хорошо потратить некоторое время на обдумывание возможных ответов. Если вы можете вспомнить метод – .translate() в данном случае-то вы все готовы.
Но есть несколько других сценариев, которые следует рассмотреть:
- Вы можете полностью нарисовать пустоту. В этом случае вы, вероятно , решите эту проблему так же, как и следующую, и это приемлемый ответ.
- Вы можете помнить, что стандартная библиотека имеет функцию делать то, что вы хотите, но не помнить детали.
Если бы вы выполняли нормальную работу и попали в любую из этих ситуаций, то вы бы просто немного поискали и отправились в путь. Но в ситуации интервью это поможет вашему делу говорить о проблеме вслух.
Просить интервьюера о конкретной помощи гораздо лучше, чем просто игнорировать ее. Попробуйте что-нибудь вроде: “Я думаю, что есть функция, которая сопоставляет один набор символов с другим. Не могли бы вы помочь мне вспомнить, как она называется?”
В ситуации интервью часто лучше признать, что вы чего-то не знаете, чем пытаться блефовать.
Продолжение:
- Проблемы с практикой Python. Приготовьтесь к следующему собеседованию. Шифр Цезаря. Часть 2
- Проблемы с практикой Python. Приготовьтесь к следующему собеседованию. Анализатор журнала. Часть 3
- Проблемы с практикой Python. Приготовьтесь к следующему собеседованию. Решение головоломки судоку. Часть 4.1
- Проблемы с практикой Python. Приготовьтесь к следующему собеседованию. Решение головоломки судоку. Часть 4.2