Поиск по сайту:
Никогда не следует думать, будто ты понимаешь, что делаешь (Авессалом Подводный).

Проблемы с практикой Python. Приготовьтесь к следующему собеседованию

02.10.2020
Проблемы с практикой Python. Приготовьтесь к следующему собеседованию

Вы – разработчик 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, а затем возвращаете его, когда закончите цикл.

Это решение работает, но у него есть две проблемы:

  1. Он не отображает ваши знания о Python и о том, как язык упрощает подобные задачи.
  2. Он не соответствует условиям ошибки в описании проблемы. Передача строки приведет к тому, что функция выдаст исключение, когда она должна просто вернуться.

Вы будете иметь дело с условиями ошибки в окончательном ответе ниже, но сначала давайте уточним основное решение, чтобы оно было немного более Пифоническим.

Первое, о чем нужно подумать while, – это цикл. Python имеет мощные механизмы для перебора списков и диапазонов. Создание своего собственного, как правило, не требуется, и это, безусловно, так здесь. Вы можете заменить цикл while циклом, который повторяется range():

# integersums.py
def better(n):
    sum = 0
    for num in range(n + 1):
        sum += num
    return sum

 

Читать  Использование Namedtuple в Python

Вы можете видеть, что конструкция  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 для преобразования.

Читать  Как выучить Python в 2023 году. Полное руководство. Часть 2

Подсказка: в классе 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:

  1. .ascii_lowercase
  2. .maketrans()
  3. .translate()

 

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

>>>

>>> import string
>>> x = string.ascii_lowercase
>>> x
'abcdefghijklmnopqrstuvwxyz'
>>> x[3:]
'defghijklmnopqrstuvwxyz'
>>> x[:3]
'abc'

 

Вы можете видеть, что x[3:] это все буквы после третьей буквы ‘c’, в то время x[:3] как это только первые три буквы.

Читать  Проблемы с практикой Python. Приготовьтесь к следующему собеседованию. Анализатор журнала. Часть 3

Строка 6 в решении, letters[shift_num:] + letters[:shift_num], создает список букв, сдвинутых по буквам shift_num, с буквами в конце, обернутыми вокруг к фронту. Как только у вас есть список букв и mask, которые вы хотите сопоставить, вы вызываете .maketrans(), чтобы создать таблицу перевода.

Затем вы передаете таблицу перевода строковому методу .translate(). Он сопоставляет все символы с letters соответствующими буквами mask и оставляет все остальные символы в покое.

Этот вопрос является упражнением в знании и использовании стандартной библиотеки. Вам могут задать такой вопрос в какой-то момент во время интервью. Если это случится с вами, хорошо потратить некоторое время на обдумывание возможных ответов. Если вы можете вспомнить метод – .translate() в данном случае-то вы все готовы.

Но есть несколько других сценариев, которые следует рассмотреть:

  1. Вы можете полностью нарисовать пустоту. В этом случае вы, вероятно , решите эту проблему так же, как и следующую, и это приемлемый ответ.
  2. Вы можете помнить, что стандартная библиотека имеет функцию делать то, что вы хотите, но не помнить детали.

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

Просить интервьюера о конкретной помощи гораздо лучше, чем просто игнорировать ее. Попробуйте что-нибудь вроде: “Я думаю, что есть функция, которая сопоставляет один набор символов с другим. Не могли бы вы помочь мне вспомнить, как она называется?”

В ситуации интервью часто лучше признать, что вы чего-то не знаете, чем пытаться блефовать.

 

Продолжение:

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в соц. сетях:


0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Это может быть вам интересно


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

Спасибо!

Теперь редакторы в курсе.