Python: задачки и вопросы
7.82K subscribers
1.18K photos
1 video
1 file
82 links
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Другие наши проекты: https://tprg.ru/media
Download Telegram
Допускается ли абсолютный путь до модуля в import-выражении?
Anonymous Quiz
72%
Да
28%
Нет
После того, как посредством обхода пути поиска модулей найден файл исходного кода, соответствующий оператору import, Python при необходимости компилирует его в байт-код.

Файлы байт-кода вынесены в отдельный подкаталог pycache и содержат в своих именах версию Python во избежание конфликтов и перекомпиляции, когда в системе установлено множество версий Python.

Обратите внимание, что компиляция происходит во время импортирования файла. Из-за этого вы обычно не будете видеть файл байт-кода .рус для файла верхнего уровня своей программы, если только он также не импортируется где-то в другом месте — лишь импортированные файлы оставляют после себя файлы . рус на компьютере.

Байт-код файлов верхнего уровня применяется внутренне и отбрасывается; байт-код импортированных файлов сохраняется в файлах для ускорения будущих операций импортирования.
Одна из новых возможностей, появившихся в Python 3.7, — классы данных (Data classes). Эти классы предназначены для автоматизации генерации кода, который используется для хранения данных.

Многие разработчики сталкиваются с необходимостью создавать подобные классы:


class RegularGuitar:
def __init__(self, brand, model):
self.brand = brand
self.model = model


Уже на этом примере можно заметить избыточность: идентификаторы brand и model повторяются несколько раз. Более сложный класс может также содержать переопределенные методы eq и repr.

Для упрощения процесса создания таких классов модуль dataclasses предлагает декоратор @dataclass. С его помощью аналогичный код будет выглядеть так:


from dataclasses import dataclass

@dataclass
class Guitar:
brand: str
model: str


Теперь классы стали более читаемыми и лаконичными, а также сохраняют важные методы, такие как __eq__ и __repr__, которые автоматически генерируются.
Можно ли во встроенной функции enumerate() задать начальное значение?
Anonymous Quiz
79%
Да
21%
Нет
enumerate(sequence, start=0)

Возвращает генератор, отдающий пары счётчик-элемент для элементов последовательности sequence. Начальное значение счетчика можно задать с помощью start.
Что выведет код?
Anonymous Quiz
26%
1
59%
2
7%
3
8%
Error
На финальном шаге операции импортирования выполняется байт-код модуля. Все операции в файле выполняются по очереди, от начала до конца, и любые присваивания именам на данном шаге генерируют атрибуты результирующего объекта модуля. Так создаются инструменты, определяемые кодом модуля. Скажем, операторы def в файле запускаются на стадии импортирования для создания объектов функций и их присваивания атрибутам внутри объекта модуля. Функции затем вызываются в файлах, импортирующих файл модуля.

Из-за того, что последний шаг импортирования фактически выполняет код файла, если любой код верхнего уровня в файле модуля делает реальную работу, то ее результаты будут видны во время импортирования. Например, операторы print верхнего уровня в модуле отображают вывод при импортировании файла. Операторы def для функций просто определяют объекты для использования в будущем.
Будет ли пересобран байт-код модуля module.pyc, если изменить версию Python?
Anonymous Quiz
74%
Да
26%
Нет
Байт-код сохраняется в файлах внутри того же самого каталога, где находятся соответствующие файлы исходного кода, обычно с расширением . рус (например, module.рус). Файлы байт-кода также внутренне снабжаются меткой с номером версии Python, в которой они создавались (известной разработчикам как «магическое» поле), поэтому Python известно о том, что они должны быть заново скомпилированы, когда программа запускается под управлением другой версии Python. Скажем, если вы провели модернизацию до новой версии Python, где байткод отличается, тогда все ваши файлы байт-кода автоматически перекомпилируются из-за несовпадения номеров версий даже при отсутствии каких-либо изменений в исходном коде.
Устанавливать переменную среды PYTHONPATH необходимо только при импортировании
из каталогов, отличающихся от каталога, в котором вы работаете (т.е. текущего каталога при работе в интерактивной подсказке или каталога, содержащего ваш файл верхнего уровня). На практике это часто встречающийся случай для нетривиальных программ.

Пример: вы используете в своем проекте Google Tesseract — OCR-систему, и перед её использованием в файле.py необходимо прописать путь до исполняемого файла.
Какое название импортируемого модуля валидно?
Anonymous Quiz
6%
if
9%
some module
24%
1_module
61%
Никакое из вышеперечисленных
Из-за того, что имена модулей становятся именами переменных внутри программы Python, они также обязаны следовать обычным правилам именования переменных. Скажем, вы можете создать файл модуля по имени if.ру, но будете не в состоянии его импортировать, т.к. if является зарезервированным словом — оператор import if приведет к синтаксической ошибке.

На самом деле правилам именования переменных должны подчиняться как имена файлов модулей, так и имена каталогов, используемых в операциях импортирования пакетов; например, они могут содержать только буквы, цифры и подчеркивания. Кроме того, каталоги пакетов также не могут содержать синтаксис, специфичный для платформы, такой как пробелы в своих именах.
Нужна ли первая строка с оператором import?
Anonymous Quiz
14%
Да
82%
Нет
4%
Код вызовет ошибку
Поскольку оператор from копирует специфические имена из одного файла в другую область видимости, он дает возможность применять скопированные имена в сценарии напрямую, не уточняя их именем модуля.

Такая форма from позволяет указывать одно или несколько имен для копирования, разделенных запятыми. Здесь оператор from имеет такой же эффект, как в предыдущем примере, но из-за того, что импортированное имя копируется в область видимости, где находится from, использование этого имени в сценарии сопряжено с меньшим объемом набора — мы можем работать с именем напрямую, не задавая включающий модуль. В действительности мы обязаны поступать так; from не создает переменную с именем самого модуля.

Оператор from на самом деле является всего лишь незначительным расширением оператора import — он импортирует файл модуля обычным образом, но добавляет дополнительный шаг, который копирует одно или большее количество имен (не объектов) из файла. Загружается целый файл, но вам предоставляются имена для более прямого доступа к его частям.