Что такое Pickling и Unpickling?
Эти термины относятся к процессам сериализации и десериализации объектов.
▫️Pickling.
Модуль Pickle берёт любой Python-объект и конвертирует его в поток байтов. Этот процесс и называется pickling. Этот поток байтов может быть сохранён в файле или передан через сеть.
Пример:
▫️Unpickling.
Это обратный процесс, при котором поток байтов преобразуется обратно в объект Python.
Пример:
#вопросы_с_собеседований
Эти термины относятся к процессам сериализации и десериализации объектов.
▫️Pickling.
Модуль Pickle берёт любой Python-объект и конвертирует его в поток байтов. Этот процесс и называется pickling. Этот поток байтов может быть сохранён в файле или передан через сеть.
Пример:
import pickle
my_data = {'key': 'value', 'number': 42}
# Pickling (сериализация)
with open('data.pkl', 'wb') as file:
pickle.dump(my_data, file)
▫️Unpickling.
Это обратный процесс, при котором поток байтов преобразуется обратно в объект Python.
Пример:
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data) # Выведет: {'key': 'value', 'number': 42}
#вопросы_с_собеседований
👍22❤1
Что такое хуки? Как они используются в Python?
Хуки, в целом, — это технология, позволяющая изменить стандартное поведение тех или иных компонентов информационной системы. Они могут использоваться для изменения поведения функций, отслеживания состояния программы или выполнения дополнительных действий при вызове функций.
✔️Для создания хука в Python можно использовать декораторы. Вот простой пример:
#вопросы_с_собеседований
Хуки, в целом, — это технология, позволяющая изменить стандартное поведение тех или иных компонентов информационной системы. Они могут использоваться для изменения поведения функций, отслеживания состояния программы или выполнения дополнительных действий при вызове функций.
✔️Для создания хука в Python можно использовать декораторы. Вот простой пример:
def simple_hook(func):
def wrapper(*args, **kwargs):
print(f'Вызывается функция: {func.__name__}')
result = func(*args, **kwargs)
print(f'Функция {func.__name__} выполнена')
return result
return wrapper
# Применяем декоратор к функции
@simple_hook
def greet(name):
print(f'Привет, {name}!')
# Вызываем функцию
greet('Алексей')
#вопросы_с_собеседований
🤔14👍10🥰3💯2
Зачем нужен pdb?
pdb — это интерактивная среда отладки для программ на Python. Позволяет приостановить выполнение программы, посмотреть значения переменных, построчно выполнить код. Также поддерживает post-mortem debugging, то есть отладку программы после её аварийного завершения.
Дебаггер расширяемый, он определён как класс Pdb. Запустить отладчик можно разными способами:
▫️из командной строки
python -m pdb my_script.py
▫️прямо из кода
import pdb
pdb.set_trace()
#вопросы_с_собеседований
pdb — это интерактивная среда отладки для программ на Python. Позволяет приостановить выполнение программы, посмотреть значения переменных, построчно выполнить код. Также поддерживает post-mortem debugging, то есть отладку программы после её аварийного завершения.
Дебаггер расширяемый, он определён как класс Pdb. Запустить отладчик можно разными способами:
▫️из командной строки
python -m pdb my_script.py
▫️прямо из кода
import pdb
pdb.set_trace()
#вопросы_с_собеседований
👍27🔥1
Что такое контекстный менеджер в Python?
Контекстный менеджер в Python — это специальный тип объекта, который определяет методы enter() и exit() и используется с инструкцией with. Эти объекты часто применяются в операциях, которые требуют установки и освобождения ресурсов.
Частый сценарий — это работа с файлом:
Здесь контекстный менеджер гарантирует, что файл будет корректно закрыт после завершения блока with, даже если при чтении файла возникнет исключение.
🔨 Вот как можно написать простой контекстный менеджер самостоятельно:
#вопросы_с_собеседований
Контекстный менеджер в Python — это специальный тип объекта, который определяет методы enter() и exit() и используется с инструкцией with. Эти объекты часто применяются в операциях, которые требуют установки и освобождения ресурсов.
Частый сценарий — это работа с файлом:
with open('file.txt', 'r') as file:
data = file.read()
Здесь контекстный менеджер гарантирует, что файл будет корректно закрыт после завершения блока with, даже если при чтении файла возникнет исключение.
import time
class Timer:
def __enter__(self):
self.start = time.time()
def __exit__(self, exc_type, exc_val, exc_tb):
self.end = time.time()
print(f'Время выполнения: {self.end - self.start:.2f} секунд')
with Timer():
# код, время выполнения которого нужно измерить
time.sleep(2)
#вопросы_с_собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31👍9🥰4
Что такое асинхронность в Python?
👉 Асинхронность — это парадигма программирования, которая позволяет выполнять несколько задач одновременно, не дожидаясь завершения каждой из них. В отличие от многопоточности, где задачи физически выполняются параллельно на разных процессорах или ядрах, асинхронное программирование позволяет задачам «переключаться» в рамках одного потока.
☑️ В Python асинхронность была стандартизирована сравнительно недавно. Чаще всего для асинхронных операций в Python используют asyncio. В основе лежит понятие coroutine — специальнае функция, выполнение которой может быть приостановлено и возобновлено позже, что позволяет выполнять другие задачи во время ожидания. Вот, например, функция-корутина, которая выполняет ожидание в течение некоторого времени:
Async/await — это синтаксический сахар для работы с корутинами. await используется для вызова асинхронных функций и ожидания их выполнения.
#вопросы_с_собеседований
👉 Асинхронность — это парадигма программирования, которая позволяет выполнять несколько задач одновременно, не дожидаясь завершения каждой из них. В отличие от многопоточности, где задачи физически выполняются параллельно на разных процессорах или ядрах, асинхронное программирование позволяет задачам «переключаться» в рамках одного потока.
☑️ В Python асинхронность была стандартизирована сравнительно недавно. Чаще всего для асинхронных операций в Python используют asyncio. В основе лежит понятие coroutine — специальнае функция, выполнение которой может быть приостановлено и возобновлено позже, что позволяет выполнять другие задачи во время ожидания. Вот, например, функция-корутина, которая выполняет ожидание в течение некоторого времени:
import asyncio
@asyncio.coroutine
def my_coroutine(seconds):
print ('Starting coroutine')
yield from asyncio.sleep(seconds)
print ('Finishing coroutine')
loop = asyncio.get_event_loop ()
loop.run_until_complete(my_coroutine (2))
loop.close ()
Async/await — это синтаксический сахар для работы с корутинами. await используется для вызова асинхронных функций и ожидания их выполнения.
import asyncio
async def my_async_function(seconds):
print('Starting async function')
await asyncio.sleep(seconds)
print('Finishing async function')
asyncio.run(my_async_function(2))
#вопросы_с_собеседований
👍18❤2🔥2🥰1
Для чего нужен декоратор property?
В Python для доступа к «приватным» свойствам используются специальные методы класса — геттеры и сеттеры (
Property выполняет ту же задачу, а также улучшает инкапсуляцию. Если прописать его как декоратор
▶️ Пример кода:
#вопросы_с_собеседований
В Python для доступа к «приватным» свойствам используются специальные методы класса — геттеры и сеттеры (
get_name
, set_name
, например). Их нужно прописывать для каждого «приватного» свойства отдельно, что может сделать код громоздким. Зато сеттеры, например, позволяют проверять тип данных перед изменением значения какого-либо свойства.Property выполняет ту же задачу, а также улучшает инкапсуляцию. Если прописать его как декоратор
@property
перед каким-то методом, то он станет геттером, то есть будет возвращать значение атрибута. Помимо этого, можно использовать декораторы @property.setter
для превращения метода в сеттер и @property.deleter
для превращения метода в метод, который удаляет свойство.class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
"""Возвращает радиус круга."""
return self._radius
@radius.setter
def radius(self, value):
"""Устанавливает радиус круга, предварительно проверив, что значение положительное."""
if value >= 0:
self._radius = value
else:
raise ValueError("Радиус не может быть отрицательным")
@radius.deleter
def radius(self):
"""Удаляет радиус круга, заменяя его нулевым значением."""
self._radius = 0
#вопросы_с_собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🔥12
Что такое замыкания?
Это концепция в программировании, когда вложенная функция имеет доступ к локальным переменным функции более высокого порядка, даже после того, как эта функция более высокого порядка уже завершила свою работу.
Замыкания используются для инкапсуляции кода и скрытия важных данных. С помощью замыканий также можно избежать использования глобальных переменных.
Пример замыкания на Python:
#вопросы_с_собеседований
Это концепция в программировании, когда вложенная функция имеет доступ к локальным переменным функции более высокого порядка, даже после того, как эта функция более высокого порядка уже завершила свою работу.
Замыкания используются для инкапсуляции кода и скрытия важных данных. С помощью замыканий также можно избежать использования глобальных переменных.
Пример замыкания на Python:
def make_multiplier_of(n):
def multiplier(x):
return x * n
return multiplier
times_three = make_multiplier_of(3)
times_five = make_multiplier_of(5)
print(times_three(9))
print(times_five(3))
#вопросы_с_собеседований
👍24❤9👏1
В Python и итераторы, и генераторы позволяют перебирать элементы коллекций, но работают немного по-разному.
__iter__()
и __next__()
. Метод __iter__()
возвращает сам итератор, а __next__()
— следующий элемент коллекции. Если элементы заканчиваются, __next__()
должен вызвать исключение StopIteration
. Итераторы позволяют явно перебирать элементы коллекции, не требуя, чтобы все элементы были доступны в памяти одновременно.yield
. Главное отличие генератора заключается в том, что значения генерируются по требованию. Каждый раз, когда генератор достигает yield
, он возвращает значение и «замирает», сохраняя своё состояние до следующего вызова. Это позволяет использовать меньше памяти при итерации по длинным последовательностям.#вопросы_с_собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29❤8
В Python, методы
__init__()
и __new__()
используются при создании объектов, но играют разные роли. Если коротко: __init__
обрабатывает инициализацию объекта, а __new__
— его создание. Так,
__new__
вызывается автоматически при создании экземпляра и, собственно, возвращает созданный объект. Метод __init__
вызывается каждый раз при возвращении этого созданного объекта и инициализирует его начальным состоянием, не возвращая ничего. То есть сначала вызывается __new__
, а потом __init__
#вопросы_с_собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
❤33👍12
💬 Какие принципы ООП вы знаете?
Их четыре:
▫️наследование;
▫️инкапсуляция;
▫️полиморфизм;
▫️абстракция.
🔹Наследование
Наследование позволяет новому классу наследовать атрибуты и методы уже существующего класса. Новый класс называется производным (дочерним). Существующий — базовым (родительским).
🔹Инкапсуляция
Этот принцип заключается в ограничении доступа к внутренним методам и переменным класса извне. В Python принцип реализован лишь на уровне соглашений: приватные атрибуты выделяются подчёркиванием — одинарным _ или двойным __. Эти подчёркивания сигнализируют другим программистам о приватности. Однако доступ к ним всё равно можно получить.
🔹Полиморфизм
Полиморфизм позволяет использовать одну функцию для разных форм (типов данных). В Python это проявляется, например, когда дочерний класс переопределяет методы родительского класса или когда разные классы имеют методы с одинаковыми именами, но собственной реализацией.
🔹Абстракция
Абстракция позволяет определить общее поведение для группы объектов. Это достигается путём создания классов, которые имеют некоторые общие свойства и методы, но не включают все детали реализации.
#вопросы_с_собеседований
Их четыре:
▫️наследование;
▫️инкапсуляция;
▫️полиморфизм;
▫️абстракция.
🔹Наследование
Наследование позволяет новому классу наследовать атрибуты и методы уже существующего класса. Новый класс называется производным (дочерним). Существующий — базовым (родительским).
🔹Инкапсуляция
Этот принцип заключается в ограничении доступа к внутренним методам и переменным класса извне. В Python принцип реализован лишь на уровне соглашений: приватные атрибуты выделяются подчёркиванием — одинарным _ или двойным __. Эти подчёркивания сигнализируют другим программистам о приватности. Однако доступ к ним всё равно можно получить.
🔹Полиморфизм
Полиморфизм позволяет использовать одну функцию для разных форм (типов данных). В Python это проявляется, например, когда дочерний класс переопределяет методы родительского класса или когда разные классы имеют методы с одинаковыми именами, но собственной реализацией.
🔹Абстракция
Абстракция позволяет определить общее поведение для группы объектов. Это достигается путём создания классов, которые имеют некоторые общие свойства и методы, но не включают все детали реализации.
#вопросы_с_собеседований
❤18🥰7😁5👍4🔥2🤔1
Что делает yield в Python?
Это оператор, который используется в генераторных функциях вместо
Если мы имеем дело с генераторной функцией, то каждый раз, когда внутри неё встречается
📎 Пример генераторной функции с
#вопросы_с_собеседований
Это оператор, который используется в генераторных функциях вместо
return
. Обычная функция завершает работу если встретилось выражение return
, или закончился код функции, или возникло исключение. После выполнения функции, управление возвращается. Если мы имеем дело с генераторной функцией, то каждый раз, когда внутри неё встречается
yield
, выполнение приостанавливается и возвращает значение. При следующем запросе, генератор начинает работать с того же места, где он завершил работу в прошлый раз. Так как оператор yield
не завершает работу генератора, он может использоваться несколько раз.yield
:def simple_generator():
yield "Hello"
yield "World"
gen = simple_generator()
print(next(gen)) # Выводит "Hello"
print(next(gen)) # Выводит "World"
#вопросы_с_собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
👍35❤5🤔3🥱1
Тернарный оператор используется для написания простых условных конструкций if-else в одну строку. Появился в Python версии 2.4.
is_good = True
state = "good" if is_good else "not good"
Без применения тернарного оператора этот пример выглядел бы так:
is_good = True
if is_good:
state = "good"
else:
state = "not good"
nice = True
personality = ("mean", "nice")[nice]
print("The cat is ", personality)
# Выведет: The cat is nice
Здесь используется кортеж (“mean”, “nice”), а индекс выбирается на основе значения переменной nice. Если nice имеет значение True, что соответствует 1, выбирается "nice". Если бы nice было False (0), выбралось бы "mean".
#вопросы_с_собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
❤30👍13🔥2