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

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

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

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

Другие наши проекты: https://tprg.ru/media
Download Telegram
Что выведет код?
Anonymous Quiz
22%
True
63%
False
1%
None
14%
Error
1👍1👎1
Из документации Python:

Причина вывода False — разные типы данных:

🔘 Литерал с префиксом u создаёт объект типа 𝚜𝚝𝚛 (Unicode-строка);
🔘 Литерал с префиксом b создаёт объект типа 𝚋𝚢𝚝𝚎𝚜 (байтовая строка).

В Python 3 это принципиально разные типы. Сравнение 𝚜𝚝𝚛 == 𝚋𝚢𝚝𝚎𝚜 всегда возвращает False, даже если они визуально одинаковы, потому что объекты разных типов не равны.

В официальной документации Python указано:

«Байтовые литераты всегда сопровождаются префиксом b, это генерирует объект типа 𝚋𝚢𝚝𝚎𝚜, не 𝚜𝚝𝚛».

«Поддержка устаревшего Unicode-литерала (u'spam') была вновь введена для упрощения поддержки кода, работающего как на Python 2.x, так и на Python 3.x».
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1👎1
Из документации Python:

«При работе с JSON-файлами в текстовом формате используйте encoding="utf-8" при открытии файла для чтения и записи».

𝚏 = 𝚘𝚙𝚎𝚗('𝚠𝚘𝚛𝚔𝚏𝚒𝚕𝚎', '𝚠', 𝚎𝚗𝚌𝚘𝚍𝚒𝚗𝚐="𝚞𝚝𝚏-𝟾")

Почему вариант 1 — правильный

🔘Он непосредственно позволяет указать желаемую кодировку при чтении или записи файла.
🔘Это прямой и стандартный подход, предусмотренный в языке (без дополнительных преобразований вручную).

Другие варианты (например, str.encode() с записью байтов, использование JSON или pickle) не являются подходящими для создания текстового файла в нужной кодировке — они либо статичны, либо служат для других целей.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👎1
🪤 Что выведет код?
Anonymous Quiz
65%
1
9%
2
14%
3
12%
Error
1👍1👎1
Марк Лутц, «Изучаем Python», глава 36:

«Методы __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ и __𝚜𝚎𝚝𝚊𝚝𝚝𝚛__ автоматически запускаются, когда экземпляр задействован в контексте, описанном справа в комментарии:
— 𝚍𝚎𝚏 __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__(𝚜𝚎𝚕𝚏, 𝚗𝚊𝚖𝚎): При извлечении неопределённых атрибутов
obj.name
— 𝚍𝚎𝚏 __𝚜𝚎𝚝𝚊𝚝𝚝𝚛__(𝚜𝚎𝚕𝚏, 𝚗𝚊𝚖𝚎, 𝚟𝚊𝚕𝚞𝚎): При присваивании всех атрибутов
obj.name=value»

В данном коде:

🔘При первом обращении к 𝚡.𝚓𝚘𝚋 вызывается __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__, так как атрибут 𝚓𝚘𝚋 не существует;
🔘При присваивании 𝚡.𝚙𝚊𝚢 = 99 вызывается __𝚜𝚎𝚝𝚊𝚝𝚝𝚛__;
🔘При повторном обращении к 𝚡.𝚓𝚘𝚋 снова вызывается __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__, поскольку атрибут 𝚓𝚘𝚋 так и не был создан (метод __𝚜𝚎𝚝𝚊𝚝𝚝𝚛__ не создаёт атрибут, а только выводит сообщение)
🔘Метод __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ возвращает 42, который выводится через 𝚙𝚛𝚒𝚗𝚝
🔘Метод __𝚜𝚎𝚝𝚊𝚝𝚝𝚛__ перехватывает ВСЕ присваивания атрибутов, но в данном случае он только выводит сообщение, не создавая реальный атрибут в экземпляре.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👎1