В 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
Что быстрее: словарь или список?
Скорость выполнения операций со словарями и списками зависит, собственно, от типа операции.
🔹Словари в Python реализованы как хеш-таблицы. Поэтому:
▫️Доступ к элементу по ключу в словаре обычно выполняется за O(1), то есть быстро, независимо от размера словаря.
▫️Добавление нового элемента в словарь также обычно занимает время O(1).
▫️Проверка наличия ключа в словаре выполняется за O(1).
🔹Списки в Python реализованы как динамические массивы. Поэтому:
▫️Доступ к элементу по индексу в списке тоже выполняется за время O(1). Однако список всё же может быть незначительно быстрее, так как в случае со словарём требуются дополнительные вычисления для хеширования ключа.
▫️Вставка элемента в начало или середину списка требует сдвига всех последующих элементов, что занимает время O(n).
▫️Поиск элемента в списке, если индекс неизвестен, требует перебора всех элементов, что занимает время O(n).
#вопросы_с_собеседований
Скорость выполнения операций со словарями и списками зависит, собственно, от типа операции.
🔹Словари в Python реализованы как хеш-таблицы. Поэтому:
▫️Доступ к элементу по ключу в словаре обычно выполняется за O(1), то есть быстро, независимо от размера словаря.
▫️Добавление нового элемента в словарь также обычно занимает время O(1).
▫️Проверка наличия ключа в словаре выполняется за O(1).
🔹Списки в Python реализованы как динамические массивы. Поэтому:
▫️Доступ к элементу по индексу в списке тоже выполняется за время O(1). Однако список всё же может быть незначительно быстрее, так как в случае со словарём требуются дополнительные вычисления для хеширования ключа.
▫️Вставка элемента в начало или середину списка требует сдвига всех последующих элементов, что занимает время O(n).
▫️Поиск элемента в списке, если индекс неизвестен, требует перебора всех элементов, что занимает время O(n).
#вопросы_с_собеседований
👍31❤3🤔3
Django использует метаклассы. А метаклассы — это классы, которые конструируют другие классы. Соответственно, когда Django конструирует наш класс, он делает это с помощью своего метакласса. Внутренний класс с названием 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 используется для создания асинхронных функций (или корутин), которые позволяют выполнять задачи, не блокируя основной поток выполнения программы. Это особенно полезно для работы с такими операциями, как сетевые запросы, взаимодействие с базами данных или чтение/запись файлов.
Вот пример асинхронной функции:
Как можно заметить, async идёт в паре с await, который приостанавливает выполнение fetch_data до завершения asyncio.sleep(2).
#вопросы_с_собеседований
Ключевое слово 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😁5❤3
🐍✍️ Назовите различия между Python 2 и Python 3
Различий между версиями довольно много. Ключевые такие:
▪️Print
В Python 2 print используется как оператор, а в Python 3 его нужно использовать как функцию: print().
▪️Тип строки
В Python 2 есть два основных типа строк: байтовые и Unicode строки. В Python 3 все строки по умолчанию являются Unicode.
▪️Деление
В Python 2 деление целых чисел приводит к целому результату. В Python 3 для этого используется отдельный оператор //, а / возвращает дробное число.
▪️Обработка ошибок
Обработка ошибок стала более унифицированной в Python 3. Исключения должны быть заключены в круглые скобки в операторе except.
#вопросы_с_собеседований
Различий между версиями довольно много. Ключевые такие:
В Python 2 print используется как оператор, а в Python 3 его нужно использовать как функцию: print().
▪️Тип строки
В Python 2 есть два основных типа строк: байтовые и Unicode строки. В Python 3 все строки по умолчанию являются Unicode.
▪️Деление
В Python 2 деление целых чисел приводит к целому результату. В Python 3 для этого используется отдельный оператор //, а / возвращает дробное число.
▪️Обработка ошибок
Обработка ошибок стала более унифицированной в Python 3. Исключения должны быть заключены в круглые скобки в операторе except.
#вопросы_с_собеседований
👍18❤5
Приведите пример библиотеки для создания графиков
Leather используется для создания графиков. В отличие от ряда подобных библиотек, Leather способна взаимодействовать с широким разнообразием данных и выводить их через векторную графику.
В примере используются следующие функции:
leather.Chart() — создает график с заданным заголовком.
chart.add_dots() — добавляет точки на график. Также в ней можно указать функцию для определения цвета точек.
chart.to_svg() — позволяет сохранить график в формате .svg в указанный файл.
На втором изображении представлен результат работы программы.
#вопросы_с_собеседований
Leather используется для создания графиков. В отличие от ряда подобных библиотек, Leather способна взаимодействовать с широким разнообразием данных и выводить их через векторную графику.
В примере используются следующие функции:
leather.Chart() — создает график с заданным заголовком.
chart.add_dots() — добавляет точки на график. Также в ней можно указать функцию для определения цвета точек.
chart.to_svg() — позволяет сохранить график в формате .svg в указанный файл.
На втором изображении представлен результат работы программы.
#вопросы_с_собеседований
😁8👍3🔥2
Узнаем, сколько всего определенных букв в строке
Один из способов узнать количество определенных букв в строке максимально быстрым методом — использовать метод count для строки. Этот метод принимает символ или подстроку и возвращает количество их вхождений в строку.
Этот метод является достаточно быстрым, так как использует внутренние оптимизации CPython, которые работают на низком уровне. Он также не требует дополнительной памяти, за исключением простой переменной, используемой для хранения результата.
#вопросы_с_собеседований
Один из способов узнать количество определенных букв в строке максимально быстрым методом — использовать метод count для строки. Этот метод принимает символ или подстроку и возвращает количество их вхождений в строку.
Этот метод является достаточно быстрым, так как использует внутренние оптимизации CPython, которые работают на низком уровне. Он также не требует дополнительной памяти, за исключением простой переменной, используемой для хранения результата.
#вопросы_с_собеседований
👍7😍2❤1🔥1
Оба этих метода являются магическими.
__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 для медленной хеш-функции и является более устойчивой к атакам методом перебора.
#вопросы_с_собеседований
Самое простое решение — использовать модуль hashlib. Он поддерживает различные алгоритмы хеширования, включая SHA-256, SHA-512 и MDA RSA.
Модуль hashlib содержит одну функцию для каждого алгоритма хеширования, которая называется так же, как сам алгоритм. Например, для создания хеш-объекта с SHA-256 нужно использовать функцию hashlib.sha256().
✅ Также можно, например, использовать библиотеку Bcrypt. Она применяет алгоритм Blowfish для медленной хеш-функции и является более устойчивой к атакам методом перебора.
#вопросы_с_собеседований
🔥11👍4❤2😁1
✍️ Что такое match-case в Python
Конструкцию match-case ещё называют pattern matching (сопоставление с шаблонами). Суть её заключается в следующем:
✅ Оператор match принимает выражение и сравнивает его значение с последовательными шаблонами, заданными как один или несколько блоков case.
Код с match-case более структурирован и легче читается по сравнению с кодом, где прописано большое количество вложенных условий.
#вопросы_с_собеседований
Конструкцию match-case ещё называют pattern matching (сопоставление с шаблонами). Суть её заключается в следующем:
✅ Оператор match принимает выражение и сравнивает его значение с последовательными шаблонами, заданными как один или несколько блоков case.
Код с match-case более структурирован и легче читается по сравнению с кодом, где прописано большое количество вложенных условий.
#вопросы_с_собеседований
🔥13👍9
#вопросы_с_собеседований
Что произойдет, если блок except не обработает ошибку?
Если ошибка не будет перехвачена в блоке except, программа завершит свою работу и выведет сообщение об ошибке. Это называется необработанным исключением.
При возникновении исключения Python создает traceback — последовательность вызовов функций, которая привела к ошибке. Если блок except не перехватывает исключение, traceback отображается пользователю, и программа аварийно завершает свою работу.
Что произойдет, если блок except не обработает ошибку?
Если ошибка не будет перехвачена в блоке except, программа завершит свою работу и выведет сообщение об ошибке. Это называется необработанным исключением.
При возникновении исключения Python создает traceback — последовательность вызовов функций, которая привела к ошибке. Если блок except не перехватывает исключение, traceback отображается пользователю, и программа аварийно завершает свою работу.
👍16
🧑💻 Какие методы есть у генератора, но нет у итератора?
1️⃣
Позволяет передать значение внутрь генератора. Это значение становится результатом выражения yield в теле генератора.
2️⃣
Используется для выбрасывания исключения внутри генератора в точке последнего yield. Позволяет обрабатывать ошибки.
3️⃣
Завершает выполнение генератора, вызывая исключение GeneratorExit. Обычно используется для освобождения ресурсов.
#вопросы_с_собеседований
send(value)
throw(type, value=None, traceback=None)
close()
#вопросы_с_собеседований
👍33❤4