1. Что такое python?
Python - высокоуровневый язык программирования общего назначения с динамической типизацией и автоматическим управлением памятью. Является полностью объектно-ориентированным, т.к. все элементы в нем объекты.

Python - это как волшебный язык, который позволяет тебе разговаривать с компьютером.
Представь, что у тебя есть волшебная книга, в которой записаны специальные слова и команды.
Слова обозначают предметы, действия или идеи.
Команды говорят компьютеру, что он должен делать с этими словами.

Например:
Слова: яблоко, красный, стол.
Команда: нарисовать красное яблоко на столе.

Когда ты пишешь эту команду в своей волшебной книге, компьютер читает ее и творит волшебство:
он рисует красное яблоко на столе на экране.
Вот еще несколько примеров того, что можно делать с помощью Python:
Писать игры: создавать персонажей, придумывать правила, управлять ходом игры.
Создавать веб-сайты: делать красивые и интересные страницы в интернете.
Анализировать данные: изучать большие массивы информации, делать выводы и открытия.
Управлять роботами: программировать роботов для выполнения различных задач.

Python - это очень мощный инструмент, который может помочь тебе творить чудеса!
  1. В каком году написана первая статья про python?
Первая статья о Python была написана в 1991 году.
Гвидо ван Россум, создатель языка Python, опубликовал код Python 0.9.0 в феврале 1991 года на новостной группе Usenet alt.sources.
В этой статье он представил Python как новый язык программирования, предназначенный для простоты использования и читаемости.
Хотя эта статья не была формальной публикацией в научном журнале, она стала отправной точкой для Python, который с тех пор стал
одним из самых популярных языков программирования в мире.
Вот несколько интересных фактов о первых днях Python:
Первоначальное название Python: Сначала Python назывался "Limbo", но позже был переименован в честь телешоу "Monty Python's Flying Circus".
Вдохновение: Python был вдохновлен другими языками программирования, такими как ABC, Modula-2 и Setl.
Цели: Гвидо ван Россум хотел создать язык программирования, который был бы простым, мощным и универсальным.

С момента своего первого выпуска Python претерпел множество изменений, но он сохранил свою простую и читаемую природу.
Сегодня Python используется миллионами людей во всем мире для различных задач, от разработки веб-сайтов до научных исследований.
  1. Какие типы данных есть в python? На какие классы делятся?
Основные типы данных:
Числа: целые числа (например, 1, 2, 3) и числа с плавающей запятой (например, 1.5, 3.14).
Строки: тексты, заключенные в кавычки (например, "Привет!", "Я учусь Python").
Списки: упорядоченные коллекции различных элементов (например, ["яблоко", "банан", "огурец"]).
Словари: коллекции ключ-значение, где каждый ключ связан со своим значением (например, {"имя": "Вася", "возраст": 30}).
Кортежи: неизменяемые списки, похожие на списки, но их нельзя изменить (например, (1, 2, 3)).
Множества: неупорядоченные коллекции уникальных элементов (например, {1, 2, 3, 4}).
Булевы значения: True (истина) и False (ложь).

Классы типов данных:
Простые типы: числа, строки, булевы значения.
Составные типы: списки, словари, кортежи, множества.

Простые типы хранятся непосредственно в памяти.
Составные типы состоят из других данных и ссылаются на них.
Важно:
Каждый тип данных имеет свои особенности и используется для разных целей.
Правильный выбор типа данных важен для написания эффективного и понятного кода.

Вот несколько примеров использования разных типов данных:
Числа: для математических вычислений, подсчета значений.
Строки: для работы с текстом, создания сообщений, хранения имен.
Списки: для хранения упорядоченных коллекций данных, например, списков покупок или списков задач.
Словари: для хранения информации в виде ключ-значений, например, телефонных справочников или настроек программы.
Кортежи: для хранения неизменяемых данных, например, координат или дат.
Множества: для проверки уникальности элементов, например, для поиска повторяющихся слов в тексте.
Булевы значения: для проверки условий, например, "пользователь введен правильный пароль?".

Изменяемые и неизменяемые типы данных в Python
В Python существует два основных класса типов данных по
возможности их изменения:

1. Изменяемые типы данных:
Могут быть изменены после создания.
Значения хранятся в ссылочных объектах.
При изменении одного объекта, ссылающегося на данные, изменяются все остальные ссылки.
Примеры:

Списки (list): [1, 2, 3]
Словари (dict): {'name': 'Вася', 'age': 30}
Множества (set): {1, 2, 3}

2. Неизменяемые типы данных:
Не могут быть изменены после создания.
Значения хранятся в неизменяемых объектах.
Изменение значения создает новый объект.
Примеры:

Строки (str): "Hello, world!"
Кортежи (tuple): (1, 2, 3)
Числа (int, float, complex): 42, 3.14, 1j

Изменяемые типы:
Подходят для хранения динамичных данных, которые часто меняются.
Могут быть менее эффективны в некоторых операциях из-за необходимости отслеживать изменения ссылок.
Требуют осторожности при работе с копиями, чтобы не изменить неожиданно данные.
Неизменяемые типы:
Подходят для хранения статических данных, которые не должны меняться.
Более эффективны в некоторых операциях, так как не требуется отслеживать изменения ссылок.
Гарантируют неизменность данных, что может быть важно для безопасности и последовательности кода.
Выбор типа данных:

Учитывайте:
Нужны ли вам изменяемые или неизменяемые данные?
Какую оперативность требуется от операций с данными?
Как важно гарантировать неизменность данных?
  1. Что такое лямбда-функция? Какое у неё назначение?
Лямбда-функции: короткие функции "на лету"
Представь, что ты печешь пирог. Тебе нужно много раз замешивать тесто, но каждый раз с немного разными пропорциями ингредиентов.
В обычной ситуации ты бы каждый раз писал рецепт заново, меняя количество муки, сахара и яиц.
Но есть способ проще!
Лямбда-функции Python - это как короткие рецепты, которые ты можешь записывать "на лету", не создавая отдельного файла.
В них ты указываешь параметры (мука, сахар, яйца) и инструкции (что с ними сделать, в какой последовательности добавить).
Вот как выглядит лямбда-функция:

def func(x, y):
return x * y
# Лямбда-эквивалент
lambda x, y: x * y

В чем преимущества лямбда-функций:
Краткость: Записываются в одной строке, экономят время и место.
Простота: Легко понять, что делает функция.
Универсальность: Используются в разных ситуациях, например, с функциями высшего порядка (map, filter, reduce).

Но есть и ограничения:
Ограниченная функциональность: Подходят только для простых вычислений, не поддерживают сложные операции.
Отсутствие имени: Не имеют имени, как обычные функции.

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

data = [5, 1, 4, 2, 3]
sorted_data = sorted(data, key=lambda x: x**2)
print(sorted_data) # Output: [1, 4, 2, 3, 5]


Вычисление площади круга:

radius = 3
area = lambda r: 3.1415 * r**2
print(area(radius)) # Output: 28.26


Проверка четности числа:

is_even = lambda x: x % 2 == 0
print(is_even(5)) # Output: True
print(is_even(6)) # Output: False
  1. Что такое PEP 8?
PEP 8: Руководство по стилю кода Python - твой помощник в написании читаемого кода
Представь, что ты пишешь книгу для своих друзей.
Хочешь, чтобы они легко могли ее читать и понимать, правда?
Для этого ты используешь заголовки, абзацы, пунктуацию и делаешь текст аккуратным.
В программировании Python тоже есть свои правила оформления кода.
Эти правила называются PEP 8 (Python Enhancement Proposal 8).
PEP 8 - это как инструкция по написанию "красивого" кода Python.
Она содержит рекомендации по:
Именованию переменных и функций: Используй snake_case (змейный_подчерк): моя_переменная, функция_обработки.
Избегай сокращений и аббревиатур.

Отступам: Используй 4 пробела для отступов.
Не используй табуляцию.

Длина строк: Рекомендуемая длина строки - 79 символов.
Используй переносы строк, если необходимо.

Импорты: Используй операторы import и from правильно.
Группируй импорты по категориям.

Комментарии: Используй комментарии, чтобы объяснить сложные участки кода.
Делай комментарии лаконичными и понятными.

Соблюдение PEP 8 делает код Python:
Читаемым: Легче понять другим программистам, что делает твой код.
Понятным: Тебе самому будет проще разобраться в своем коде через некоторое время.
Согласованным: Разный код, написанный в соответствии с PEP 8, будет выглядеть единообразно.

PEP 8 - это не строгий набор правил, а скорее набор рекомендаций.
В некоторых случаях ты можешь отступать от них, если это необходимо для читаемости кода.
Вот несколько ресурсов, где можно узнать больше о PEP 8:
Официальный сайт PEP 8: https://peps.python.org/pep-0008/
PEP 8 в простой русской интерпретации: https://letpy.com/python-guide/pep8/
Онлайн-инструмент проверки PEP 8: https://pep8online.com/

Используя PEP 8, ты пишешь код Python, который не только работает правильно, но и выглядит красиво и понятно для других.
  1. Как получить документацию по атрибутам объекта?
Существует несколько способов получить доступ к документации по атрибутам объекта в Python:
1. Функция help:
Самый простой способ: вызвать функцию help с объектом в качестве аргумента.
Пример:

class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person("Василий", 30)
help(person)


Выведет подробную информацию о классе Person, включая его атрибуты, методы и документацию.

2. Специальный атрибут __doc__:
Каждый объект и метод в Python имеет атрибут __doc__, который содержит его документацию.
Пример:

class Person:
def __init__(self, name, age):
"""Инициализация объекта Person."""
self.name = name
self.age = age
def say_hello(self):
"""Приветствует пользователя."""
print(f"Привет! Меня зовут {self.name}.")
person = Person("Василий", 30)
print(person.__doc__) # Выведет документацию `Person.__init__`
print(person.say_hello.__doc__) # Выведет документацию `person.say_hello`


3. Интерактивная среда (REPL):
В интерактивной среде Python (например, IDLE или командная строка) вы можете использовать ? после имени объекта или метода для доступа к его документации.
Пример:

>>> person = Person("Василий", 30)
>>> person?
>>> person.say_hello?


4. Модуль inspect:
Модуль inspect предоставляет более продвинутые инструменты для просмотра объектов и их атрибутов.
Пример:

import inspect
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person("Василий", 30)
print(inspect.getdoc(person)) # Выведет документацию `Person.__init__`
print(inspect.getdoc(person.say_hello)) # Выведет документацию `person.say_hello`


5. Сторонние инструменты:
Существуют сторонние инструменты, такие как Sphinx и docstrings, которые могут помочь вам генерировать более детальную и красивую документацию для ваших объектов и методов.
  1. Что такое docstring?
Docstring: твой помощник в объяснении кода Python
Docstring (документационная строка) - это комментарий, который используется для документирования кода Python.
Он похож на обычный комментарий, но заключается в тройные кавычки (``` или """).
Docstring может содержать разную информацию, в том числе:
Описание: Что делает код?
Аргументы: Какие аргументы принимает функция или класс?
Возвращаемое значение: Что возвращает функция?
Примеры использования: Как использовать код?
Объяснение сложных моментов: Как работает код?
Автор: Кто написал код?
Дата создания: Когда был создан код?
Изменения: Что было изменено в коде?

Использование docstring:
В начале функции, класса или метода:

def my_function(x, y):
"""
Складывает два числа.

Args:
x (int): Первое число.
y (int): Второе число.

Returns:
int: Сумму x и y.

Example:
>>> my_function(5, 3)
8
"""
return x + y


В модуле:

"""
Модуль с математическими функциями.

Этот модуль содержит функции для выполнения основных математических
операций, таких как сложение, вычитание, умножение и деление.
"""

def add(x, y):
"""Складывает два числа."""
return x + y

def subtract(x, y):
"""Вычитает второе число из первого."""
return x - y


Преимущества docstring:
Повышают читаемость кода: Помогают другим программистам понять, как работает код.
Делают код более понятным для тебя самого через некоторое время.

Улучшают сопровождаемость кода: Облегчают внесение изменений в код.
Помогают другим программистам использовать твой код.

Автоматическая генерация документации: Некоторые инструменты могут автоматически генерировать документацию из docstring.

Существует несколько стилей написания docstring:
Стиль Google: https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html
Стиль reStructuredText: https://sphinx-rtd-tutorial.readthedocs.io/en/latest/docstrings.html
Стиль NumPy/SciPy: https://numpydoc.readthedocs.io/en/latest/format.html
  1. В чём разница между типами list и tuple?
Основные отличия между типами данных list и tuple в Python:
Изменяемость:
Списки (list): Мутируемые, то есть их элементы можно изменять после создания.
Кортежи (tuple): Неизменяемые, их элементы нельзя изменить после создания.

Пример:

# Список - можно изменить
my_list = [1, 2, 3]
my_list[1] = 4
print(my_list) # Output: [1, 4, 3]

# Кортеж - изменение запрещено
my_tuple = (1, 2, 3)
my_tuple[1] = 4 # Ошибка: TypeError: 'tuple' object does not support item assignment


Использование:
Списки: Подходят для хранения динамичных, часто меняющихся данных, например, списков покупок, списков задач, временных значений.
Кортежи: Подходят для хранения статичных, неизменяемых данных, например, констант, координат, информации о версии.

Производительность:
Списки: Обычно медленнее в операциях, где требуется изменение элементов, чем кортежи, из-за своей мутируемой природы.
Кортежи: Быстрее в операциях, где элементы не меняются, благодаря своей неизменяемости.

Синтаксис создания:
Списки: Используются квадратные скобки [].
Кортежи: Используются круглые скобки (), иногда с запятыми между элементами, но они не обязательны для кортежей с одним элементом или при вложенности в скобках.

Пример:

my_list = [] # Пустой список
my_list = [1, 2, 3] # Список с элементами

my_tuple = () # Пустой кортеж
my_tuple = (1, 2, 3) # Кортеж с элементами
my_tuple = (1,) # Кортеж с одним элементом (запятая необязательна)


Дополнительные отличия:
Вложенность: В списки и кортежи можно вкладывать другие списки и кортежи.
Операции: Списки поддерживают больше операций, таких как +=, -=, insert, remove, pop.
Память: Кортежи обычно занимают меньше памяти, чем списки с эквивалентным количеством элементов.

Выбор между list и tuple:
Используйте list, когда вам нужен динамичный набор данных, который может меняться.
Используйте tuple, когда вам нужен статичный набор данных, который не должен меняться.
  1. Может ли быть индекс списка отрицательным?
Сами значения индексов могут быть только положительными т.к. они автоинкрементируемые (увеличиваются на единицу от предыдущего).
Однако, мы можем обращаться к элементам списков по отрицательному индексу, это действие называет back indexing.
Это позволяет вам обращаться к элементам списка с конца в обратном порядке.
Вот несколько примеров:
Список my_list:

my_list = [1, 2, 3, 4, 5]

Доступ к элементам с помощью положительных индексов:

print(my_list[0]) # Выведет 1 (первый элемент)
print(my_list[1]) # Выведет 2 (второй элемент)
print(my_list[4]) # Выведет 5 (пятый элемент)


Доступ к элементам с помощью отрицательных индексов:

print(my_list[-1]) # Выведет 5 (последний элемент)
print(my_list[-2]) # Выведет 4 (предпоследний элемент)
print(my_list[-3]) # Выведет 3 (третий элемент с конца)

Объяснение:
Длина списка: Длина списка my_list равна 5.
Положительные индексы: Нумерация начинается с 0. my_list[0] соответствует первому элементу.
my_list[1] соответствует второму элементу.
...
my_list[4] соответствует пятому элементу.

Отрицательные индексы: Нумерация начинается с -1 (последнего элемента) и идет в обратном порядке. my_list[-1] соответствует последнему элементу.
my_list[-2] соответствует предпоследнему элементу.
...
my_list[-5] соответствует первому элементу.

Важно:
Индекс 0 всегда соответствует первому элементу списка.
Отрицательный индекс -1 всегда соответствует последнему элементу списка.
Выход за пределы списка с помощью отрицательного индекса приведет к ошибке IndexError.

Использование отрицательных индексов:
Отрицательные индексы полезны для: Перебора элементов списка в обратном порядке.
Доступа к последним элементам списка без необходимости вычислять их точную позицию.
Извлечения подсписков с конца списка.

Пример:

# Перебор списка в обратном порядке
for i in range(-1, -len(my_list) - 1, -1):
print(my_list[i])

# Извлечение подсписка с конца списка
last_three = my_list[-3:]
print(last_three) # Output: [3, 4, 5]
  1. Что значит конструкция pass?
В Python оператор pass - это пустой оператор, который не выполняет никаких действий.
Он используется в тех местах кода, где синтаксис Python требует оператор или блок кода, но на данном этапе реализация не требуется.
Вот несколько случаев, когда можно использовать pass:
Внутри функции или метода: Когда вы пишете функцию, но пока не готовы к реализации ее логики.
В качестве заглушки для обработки будущих условий или ошибок.
Для разделения блоков кода, чтобы сделать код более читаемым.

Пример:

def my_function(x, y):
if x == 0:
pass # Обработка ошибки деления на ноль (будет добавлена позже)
else:
result = y / x
return result

# Пример использования
my_function(10, 2) # Output: 5.0
my_function(0, 5) # (Обработка ошибки будет добавлена позже)


Внутри условных операторов (if, elif, else): Когда вы хотите пропустить блок кода в определенном условии.
В качестве заглушки для будущей реализации функциональности.

Пример:

if condition1:
# Выполнить действия
elif condition2:
pass # Пропустить этот блок (будет реализован позже)
else:
# Выполнить другие действия


Внутри циклов (for, while): Когда вы хотите пропустить итерацию цикла в определенном условии.
В качестве заглушки для будущей реализации функциональности.

Пример:

for i in range(10):
if i % 2 == 0:
pass # Пропустить четные числа (будет добавлена обработка позже)
else:
print(i)


Важно:
pass не является пустой строкой или комментарием. Он - оператор, который интерпретатор Python учитывает при выполнении кода.

Использование pass бездумно может сделать код менее читаемым. Используйте его с умом и добавляйте комментарии, чтобы объяснить свои намерения.
  1. Чем отличаются многопоточное и многопроцессорное приложение?
  2. Как просмотреть методы объекта?
  3. Что такое *args и **kwargs в определении функции?
  4. Python полностью поддерживает ООП?
  5. Что такое globals() и locals()?
  6. Что хранится в атрибуте __dict__?
  7. Как проверить файл .py на синтаксические ошибки, не запуская его?
  8. Зачем в python используется ключевое слово self?
  9. Что такое декоратор? Как написать собственный?
  10. Что может быть ключом в словаре?
  11. В чём разница между пакетами и модулями
  12. Как перевести строку, содержащую двоичный код (1 и 0), в число?
  13. Для чего используется функция __init__?
  14. Что такое слайс(slice)?
  15. Как проверить, что один кортеж содержит все элементы другого кортежа?
  16. Почему пустой список нельзя использовать как аргумент по умолчанию?
  17. Что такое @classmethod, @staticmethod, @property?
  18. Что такое синхронный код?
  19. Что такое асинхронный код? Приведите пример.
  20. Каким будет результат следующего выражения?
    >>> -30 % 10
  21. Для чего нужен метод id()?
  22. Что такое итератор?
  23. Что такое генератор? Чем отличается от итератора?
  24. Для чего используется ключевое слово yield?
  25. Чем отличаются __iter__ и __next__?
  26. Что такое контекстный менеджер?
  27. Как сделать python-скрипт исполняемым в различных операционных системах?
  28. Как сделать копию объекта? Как сделать глубокую копию объекта?
  29. Опишите принцип работы сборщика мусора в python
  30. Как использовать глобальные переменные? Это хорошая идея?
  31. Для чего в классе используется атрибут __slots__?
  32. Какие пространства имен существуют в python?
  33. Как реализуется управление памятью в python?
  34. Что такое метаклассы и в каких случаях их следует использовать?
  35. Зачем нужен pdb?
  36. Каким будет результат следующего выражения?
    >>> [0, 1][10:]
  37. Как создать класс без слова class?
  38. Как перезагрузить импортированный модуль?
  39. Напишите декоратор, который будет перехватывать ошибки и повторять функцию максимум N раз.
  40. Каким будет результат следующего выражения?
    >>> len(' '.join(list(map(str, [[0], [1]]))))
  41. Python — легкий язык. Согласны?
  42. Какие проблемы есть в python?
  43. Когда будет выполнена ветка else в конструкции try…except…else?
  44. Поддерживает ли python множественное наследование?
  45. Как dict и set реализованы внутри? Какова сложность получения элемента? Сколько памяти потребляет каждая структура?
  46. Что такое MRO? Как это работает?
  47. Как аргументы передаются в функции: по значению или по ссылке?
  48. С помощью каких инструментов можно выполнить статический анализ кода?
  49. Что будет напечатано в результате выполнения следующего кода?
import sys
arr_1 = []
arr_2 = arr_1
print(sys.getrefcount(arr_1))
  1. Что такое GIL? Почему GIL всё ещё существует?
  2. Опишите процесс компиляции в python.
  3. Как тиражировать python код?
  4. Что такое дескрипторы? Есть ли разница между дескриптором и декоратором?
  5. Почему всякий раз, когда python завершает работу, не освобождается вся память?
  6. Что будет напечатано в результате выполнения следующего кода?
class Variable:

   def __init__(self, name, value):
      self._name = name
      self._value = value

   @property
   def value(self):
      print(self._name, 'GET', self._value)
      return self._value

   @value.setter
   def value(self, value):
      print(self._name, 'SET', self._value)
      self._value = value

var_1 = Variable('var_1', 'val_1')
var_2 = Variable('var_2', 'val_2')
var_1.value, var_2.value = var_2.value, var_1.value
  1. Что такое интернирование строк? Почему это есть в python?
  2. Как упаковать бинарные зависимости?
  3. Почему в python нет оптимизации хвостовой рекурсии? Как это реализовать?
  4. Что такое wheels и eggs? В чём разница?
  5. Как получить доступ к модулю, написанному на python из C и наоборот?
  6. Как ускорить существующий код python?
  7. Что такое __pycache__? Что такое файлы .pyc?
  8. Что такое виртуальное окружение?
  9. Python — это императивный или декларативный язык?
  10. Что такое менеджер пакетов? Какие менеджеры пакетов вы знаете?
  11. В чём преимущества массивов numpy по сравнению с (вложенными) списками python?
  12. Вам нужно реализовать функцию, которая должна использовать статическую переменную. Вы не можете писать код вне функции и у вас нет информации о внешних переменных (вне вашей функции). Как это сделать?
  13. Что будет напечатано в результате выполнения следующего кода?
def f_g():
   yield 43
   return 66

print(f_g())
  1. Как имплементировать словарь с нуля?
  2. Напишите однострочник, который будет подсчитывать количество заглавных букв в файле.
  3. Что такое файлы .pth?
  4. Какие функции из collections и itertools вы используете?
  5. Что делает флаг PYTHONOPTIMIZE?
  6. Что будет напечатано в результате выполнения следующего кода?
arr = [[]] * 5
arr_1, arr_2 = arr, arr
for k, arr in enumerate((arr_1, arr_2)):
   arr[0].append(k)
arr = (arr_1, 5, arr_2)
print(arr)
  1. Какие переменные среды, влияющие на поведение интерпретатора python, вы знаете?
  2. Что такое Cython? Что такое IronPython? Что такое PyPy? Почему они до сих пор существуют и зачем?
  3. Как перевернуть генератор?
  4. Приведите пример использования filter и reduce над итерируемым объектом.
  5. Что будет напечатано в результате выполнения кода
    >>> print(_)
  6. Чем фреймворк отличается от библиотеки?
  7. Расположите функции в порядке эффективности, объясните выбор.
def f1(arr):
   l1 = sorted(arr)
   l2 = [i for i in l1 if i < .5]
   return [i * i for i in l2]

def f2(arr):
   l1 = [i for i in arr if i < .5]
   l2 = sorted(l1)
   return [i * i for i in l2]

def f3(arr):
   l1 = [i * i for i in arr]
   l2 = sorted(l1)
   return [i for i in l1 if i < (.5 * .5)]
  1. Произошла утечка памяти в рабочем приложении. Как бы вы начали отладку?
  2. В каких ситуациях возникает исключение NotImplementedError?
  3. Что не так с этим кодом? Зачем это нужно?
if __debug__:
   assert False, ("error")
  1. Что такое магические методы(dunder)?
  2. Объясните, почему такое возможно?
_MangledGlobal__mangled = "^_^"

class MangledGlobal:

   def test(self):
       return __mangled

assert MangledGlobal().test() == "^_^"
  1. Что такое monkey patching? Приведите пример использования.
  2. Как работать с транзитивными зависимостями?
  3. Что будет напечатано в окне браузера?
<html>
   <link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" />
   <script defer src="https://pyscript.net/alpha/pyscript.js"></script>
   <body>
      <py-script>
         print(__name__)
         print(__file__)
      </py-script>
   </body>
</html>
  1. Какие новые функции добавлены в python 3.10?
  2. Почему иногда python так долго запускается (в Windows)?
Нет комментариев.