Python: задачки и вопросы
7.62K subscribers
1.23K photos
2 videos
1 file
104 links
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков

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

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

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

Другие наши проекты: https://tprg.ru/media
Download Telegram
🧩 Что выведет код?
Anonymous Quiz
21%
('c', 'd')
10%
('a', 'c', 'd')
54%
('a', 'b', 'c', 'd')
15%
Error
👍1👎1
Атрибут 𝚌𝚘𝚍𝚎 объекта функции предоставляет доступ к объекту кода, который содержит метаданные о функции, включая информацию о локальных переменных и аргументах.

Из
документации Python:

«𝚌𝚘𝚍𝚎𝚘𝚋𝚓𝚎𝚌𝚝.𝚌𝚘_𝚟𝚊𝚛𝚗𝚊𝚖𝚎𝚜: кортеж, содержащий имена локальных переменных в функции (начиная с имен параметров)».

В 𝚏𝚞𝚗𝚌() определены:
− Аргументы: 𝚊, 𝚋
− Локальные переменные: 𝚌, 𝚍

𝚌𝚘𝚍𝚎.𝚌𝚘_𝚟𝚊𝚛𝚗𝚊𝚖𝚎𝚜 — все имена локальных переменных. Этот атрибут возвращает кортеж всех локальных переменных функции, включая аргументы и переменные, определенные внутри функции.
👍1👎1
🧩 Что выведет код?
Anonymous Quiz
49%
5.5
17%
(2, 3, 0.5)
5%
5
29%
Error
👎2👍1
В данном коде используется декоратор 𝚛𝚊𝚗𝚐𝚎𝚝𝚎𝚜𝚝 с аргументами для проверки диапазонов значений параметров функции.

Марк Лутц «Изучаем Python», глава 𝟹𝟿:

«Аннотации функций ... можно бы предложить альтернативу — аргументы декоратора, используемые в примере для задания проверок вложения в диапазон».

Декоратор @𝚛𝚊𝚗𝚐𝚎𝚝𝚎𝚜𝚝(𝚊=(𝟷, 𝟻), 𝚌=(𝟶.𝟶, 𝟷.𝟶)) принимает аргументы для проверки диапазонов:
🔘 параметр 𝚊 должен находиться в диапазоне от 𝟷 до 𝟻 (не включительно)
🔘 параметр 𝚌 должен находиться в диапазоне от 𝟶.𝟶 до 𝟷.𝟶 (не включительно)

В данной реализации декоратор является «пустым» — он принимает аргументы, но не выполняет никаких проверок, просто возвращает исходную функцию без изменений.

При вызове 𝚏𝚞𝚗𝚌(𝟸, 𝟹, 𝟶.𝟻) функция выполняется с параметрами:
− 𝚊 = 𝟸
− 𝚋 = 𝟹
− 𝚌 = 𝟶.𝟻

Функция вычисляет и выводит результат: 𝟸 + 𝟹 + 𝟶.𝟻 = 𝟻.𝟻.
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1👎1
Из документации Python:

Флаг −𝙾 в команде «𝚙𝚢𝚝𝚑𝚘𝚗 −𝙾 𝚖𝚊𝚒𝚗.𝚙𝚢» выполняет следующие действия:

🔘 Удаляет операторы 𝚊𝚜𝚜𝚎𝚛𝚝 и любой код, зависящий от значения 𝚍𝚎𝚋𝚞𝚐
🔘 Добавляет .𝚘𝚙𝚝−𝟷 к именам скомпилированных (байт−код) файлов перед расширением .𝚙𝚢𝚌

Это позволяет создавать оптимизированный байт−код без отладочной информации и проверок 𝚊𝚜𝚜𝚎𝚛𝚝.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3👎1
🧩 Что выведет код?
Anonymous Quiz
22%
<class 'type'>
63%
<class '__main__.MyClass'>
9%
class
7%
Error
👍1👎1
Классы представляют собой экземпляры класса 𝚝𝚢𝚙𝚎, в точности как нормальные экземпляры являются экземплярами класса, определённого пользователем. Это работает одинаково для встроенных типов и типов классов, определённых пользователями: классы вообще не считаются отдельной концепцией; они представляют собой просто обычные экземпляры особых типов и при их определении используется метакласс 𝚝𝚢𝚙𝚎.

𝚝𝚢𝚙𝚎(𝙼𝚢𝙲𝚕𝚊𝚜𝚜) возвращает <𝚌𝚕𝚊𝚜𝚜 '𝚝𝚢𝚙𝚎'> — это показывает, что сам класс 𝙼𝚢𝙲𝚕𝚊𝚜𝚜 является экземпляром класса 𝚝𝚢𝚙𝚎

Марк Лутц «Изучаем Python», глава 40:

«Классы представляют собой экземпляры класса 𝚝𝚢𝚙𝚎». Это означает, что 𝚝𝚢𝚙𝚎 является не только встроенным классом, но и метаклассом: классом, экземплярами которого являются другие классы.

Фактически 𝚖𝚎𝚝𝚊𝚌𝚕𝚊𝚜𝚜 — это просто фабрика классов, и благодаря тому, что классы являются экземплярами класса 𝚝𝚢𝚙𝚎, возможно создание собственных подклассов 𝚝𝚢𝚙𝚎 (называемых метаклассами) для генерации классов особого вида.
👍1👎1
🧩 Что выведет код?
Anonymous Quiz
20%
1
54%
2
14%
(1, 2)
12%
Error
👍1👎1
В этой задаче мы имеем дело с концепцией Метаклассов. При выполнении 𝚌𝚕𝚊𝚜𝚜 𝙴𝚐𝚐𝚜(𝚖𝚎𝚝𝚊𝚌𝚕𝚊𝚜𝚜=𝙼𝚎𝚝𝚊𝙵𝚞𝚗𝚌): происходит следующее:

🔘 Вызывается функция 𝙼𝚎𝚝𝚊𝙵𝚞𝚗𝚌 с тремя обязательными аргументами:
− 𝚌𝚕𝚊𝚜𝚜𝚗𝚊𝚖𝚎: строка «𝙴𝚐𝚐𝚜»
− 𝚜𝚞𝚙𝚎𝚛𝚜: кортеж родительских классов (<𝚌𝚕𝚊𝚜𝚜 '𝚘𝚋𝚓𝚎𝚌𝚝'>,)
− 𝚌𝚕𝚊𝚜𝚜𝚍𝚒𝚌𝚝: словарь атрибутов класса, содержащий '__𝚖𝚘𝚍𝚞𝚕𝚎__', '__𝚚𝚞𝚊𝚕𝚗𝚊𝚖𝚎__', '𝚍𝚊𝚝𝚊': 𝟸 и '𝚖𝚎𝚝𝚑'
🔘 Функция модифицирует словарь атрибутов: 𝚌𝚕𝚊𝚜𝚜𝚍𝚒𝚌𝚝['𝚍𝚊𝚝𝚊'] = 𝟷
🔘 Функция возвращает объект класса, созданный с помощью 𝚝𝚢𝚙𝚎(𝚌𝚕𝚊𝚜𝚜𝚗𝚊𝚖𝚎, 𝚜𝚞𝚙𝚎𝚛𝚜, 𝚌𝚕𝚊𝚜𝚜𝚍𝚒𝚌𝚝)
🔘 Создается экземпляр 𝚇 класса 𝙴𝚐𝚐𝚜
🔘 Выводится значение атрибута 𝚍𝚊𝚝𝚊 экземпляра (которое теперь равно 𝟷, а не 𝟸)

Функция 𝙼𝚎𝚝𝚊𝙵𝚞𝚗𝚌 является «простейшей (и вполне законной) версией метакласса, которая позволяет перехватить процесс создания класса и модифицировать его атрибуты перед созданием. В данном случае метакласс изменяет значение атрибута 𝚍𝚊𝚝𝚊 с 𝟸 на 𝟷, демонстрируя возможность динамической модификации класса во время его создания.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👎1
🪤 Что выведет код?
Anonymous Quiz
31%
1
42%
2
24%
(1, 2)
3%
Error
👍2👎1
В данном коде определены:
🔘 Метакласс 𝙼 с атрибутом 𝚊𝚝𝚝𝚛 = 𝟷
🔘 Суперкласс 𝙰 с атрибутом 𝚊𝚝𝚝𝚛 = 𝟸
🔘 Класс 𝙱, который наследует от 𝙰 и использует метакласс 𝙼

Ключевой момент заключается в том, как работает наследование атрибутов в 𝙿𝚢𝚝𝚑𝚘𝚗.

Марк Лутц «Изучаем Python», глава 40:

«Экземпляры будут видеть имена в классе, но не в его метаклассе».

«__𝚍𝚒𝚌𝚝__ каждого класса в порядке 𝙼𝚁𝙾 (𝙼𝚎𝚝𝚑𝚘𝚍 𝚁𝚎𝚜𝚘𝚕𝚞𝚝𝚒𝚘𝚗 𝙾𝚛𝚍𝚎𝚛) просматривается к получению из экземпляра (отношение экземпляр−класс)»

В нашем случае:
🔘 Объект 𝚘𝚋𝚓 является экземпляром класса 𝙱
🔘 При обращении к 𝚘𝚋𝚓.𝚊𝚝𝚝𝚛 𝙿𝚢𝚝𝚑𝚘𝚗 ищет атрибут в порядке 𝙼𝚁𝙾
🔘 Класс 𝙱 наследует от суперкласса 𝙰, поэтому 𝚊𝚝𝚝𝚛 = 𝟸 из класса 𝙰 становится доступным для экземпляров 𝙱
🔘 Атрибут 𝚊𝚝𝚝𝚛 = 𝟷 из метакласса 𝙼 недоступен для экземпляров класса 𝙱

«Если класс определяется с помощью метакласса, он должен передать имена, полученные из метакласса, используя наследование от суперкласса».

Поэтому код выводит 𝟸 — значение атрибута 𝚊𝚝𝚝𝚛 из суперкласса 𝙰.
Please open Telegram to view this post
VIEW IN TELEGRAM
Борис Пасхавер, «Pandas в действии», глава 𝟹:

«Pandas при сортировке ставит символы в верхнем регистре перед символами в нижнем. Таким образом, строка с заглавной буквы 𝚉 будет располагаться в очереди раньше строки со строчной буквы 𝚊».

В нашем случае:
− '𝙱𝚘𝚋' начинается с заглавной '𝙱'
− '𝙳𝚊𝚟𝚒𝚍' начинается с заглавной '𝙳'
− '𝚊𝚕𝚒𝚌𝚎' начинается со строчной '𝚊'
− '𝚌𝚑𝚊𝚛𝚕𝚒𝚎' начинается со строчной '𝚌'

Поэтому после сортировки порядок будет: сначала все строки с заглавными буквами (𝙱𝚘𝚋, 𝙳𝚊𝚟𝚒𝚍), затем со строчными (𝚊𝚕𝚒𝚌𝚎, 𝚌𝚑𝚊𝚛𝚕𝚒𝚎).

Для сортировки без учета регистра можно использовать параметр 𝚔𝚎𝚢 с функцией 𝚜𝚝𝚛.𝚕𝚘𝚠𝚎𝚛:

𝚍𝚏.𝚜𝚘𝚛𝚝_𝚟𝚊𝚕𝚞𝚎𝚜('𝙽𝚊𝚖𝚎', 𝚔𝚎𝚢=𝚕𝚊𝚖𝚋𝚍𝚊 𝚡: 𝚡.𝚜𝚝𝚛.𝚕𝚘𝚠𝚎𝚛())

Это даст естественный алфавитный порядок: ['𝚊𝚕𝚒𝚌𝚎', '𝙱𝚘𝚋', '𝚌𝚑𝚊𝚛𝚕𝚒𝚎', '𝙳𝚊𝚟𝚒𝚍'].