Python | Вопросы собесов
13.8K subscribers
38 photos
1 file
960 links
Download Telegram
🤔 Какой метод используется для создания локального контекста в асинхронном коде?
Anonymous Quiz
13%
threading.local()
11%
contextvars.ContextVar()
26%
asynccontext.local()
50%
asyncio.Local()
💊12
📌 Какие знаешь принципы ООП?

💬 Спрашивают в 30% собеседований

Принципы объектно-ориентированного программирования (ООП) – это фундаментальные концепции, лежащие в основе этого стиля программирования. Они помогают программистам создавать гибкий и масштабируемый код. Всего 4 принципа:

1️⃣ Инкапсуляция

Это принцип, согласно которому детали реализации класса скрыты от внешнего использования. Это позволяет изменять внутреннее устройство класса без влияния на другие части программы. В Python инкапсуляция достигается за счет использования публичных, защищенных (_имя) и приватных (__имя) методов и атрибутов.
class Account:
def __init__(self):
self.__balance = 0 # Приватный атрибут

def deposit(self, amount):
if amount > 0:
self.__balance += amount

def get_balance(self):
return self.__balance

Здесь детали реализации учета баланса скрыты от пользователя.

2️⃣ Наследование

Позволяет создавать новые классы на основе уже существующих, наследуя их свойства и методы. Это облегчает повторное использование кода и упрощает расширение функциональности.
class SavingsAccount(Account):  # Наследование от класса Account
def __init__(self):
super().__init__()
self.interest_rate = 0.05

def add_interest(self):
self.deposit(self.get_balance() * self.interest_rate)

Класс SavingsAccount расширяет функционал Account, добавляя начисление процентов.

3️⃣ Полиморфизм

Это способность объектов использовать методы производных классов, даже если они вызываются с точки зрения их базового класса. Это позволяет одному интерфейсу управлять разными типами объектов.
for account in [Account(), SavingsAccount()]:
account.deposit(100)
print(account.get_balance())

Здесь deposit действует по-разному в зависимости от типа аккаунта.

4️⃣ Абстракция

Это выделение ключевых характеристик объекта и исключение нерелевантных. Это помогает сосредоточиться на том, "что делает" объект, а не на том, "как он это делает".
from abc import ABC, abstractmethod

class Shape(ABC):
@abstractmethod
def area(self):
pass

@abstractmethod
def perimeter(self):
pass

Shape является абстрактным классом, определяющим интерфейс для всех форм.

🤔 Итог:

ООП основано на четырех принципах: инкапсуляции (скрытие деталей реализации), наследовании (создание новых классов на основе существующих), полиморфизме (один интерфейс для разных типов объектов) и абстракции (выделение ключевых характеристик). Эти принципы помогают создавать структурированный и управляемый код.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовыхё
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93👾1
🤔 Какой из следующих классов используется для создания процесса в модуле multiprocessing?
Anonymous Quiz
20%
threading.Thread
68%
multiprocessing.Process
7%
asyncio.Task
5%
concurrent.futures.ThreadPoolExecutor
🤯13👍1🤔1
📌 Что такое итератор?

💬 Спрашивают в 30% собеседований

Итератор – это объект в Python, который предоставляет последовательный доступ к элементам коллекции или последовательности данных. Итераторы используются для обхода элементов в структурах данных, таких как списки, кортежи, строки, словари и многие другие.

🤔 Итераторы обладают двумя основными методами:

__iter__():

Возвращает сам итератор. Этот метод позволяет итератору начать итерацию заново, если это необходимо.

__next__():

Возвращает следующий элемент в последовательности данных. Если достигнут конец последовательности, метод должен возбуждать исключение StopIteration.

Вот пример итератора, который итерируется по числам от 1 до N, где N - это максимальное число, переданное в конструкторе:
class MyIterator:
def __init__(self, max_num):
self.max_num = max_num
self.current_num = 1

def __iter__(self):
return self

def __next__(self):
if self.current_num <= self.max_num:
result = self.current_num
self.current_num += 1
return result
else:
raise StopIteration

# Использование итератора
iterator = MyIterator(5)
for num in iterator:
print(num)


В этом примере MyIterator является пользовательским итератором, который генерирует числа от 1 до заданного максимального числа. При достижении максимального числа итерация завершается с возбуждением исключения StopIteration.

Итераторы могут быть использованы в циклах for, для обхода данных в последовательности, или в любой другой ситуации, когда требуется последовательный доступ к элементам коллекции без необходимости хранения всей последовательности в памяти.

🤔 Итог:

Итераторы также играют важную роль в контексте генераторов. Генераторы - это специальный тип итераторов, создаваемых с использованием функций с ключевым словом yield. Генераторы позволяют генерировать значения на лету, вместо того чтобы хранить их в памяти целиком, что может быть полезно для обработки больших объемов данных или бесконечных последовательностей.


🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовыхё
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
🤔 Какой метод позволяет определить количество активных потоков в текущем процессе?
Anonymous Quiz
33%
threading.active_count()
6%
threading.enumerate()
35%
threading.count()
26%
threading.get_threads()
💊13
📌 Что такое полиморфизм?

💬 Спрашивают в 26% собеседований

Полиморфизм - это принцип ООП, согласно которому можно использовать один и тот же интерфейс для различных базовых форм данных или типов. Слово "полиморфизм" происходит от греческих слов "поли" (много) и "морфе" (форма). Этот принцип позволяет объектам использовать методы производного класса, даже если они изначально определены в базовом классе.

🤔 Пример:
class Bird:
def intro(self):
print("В мире много разных птиц.")

def flight(self):
print("Большинство птиц умеют летать, но некоторые не умеют.")

class Sparrow(Bird):
def flight(self):
print("Воробьи могут летать.")

class Ostrich(Bird):
def flight(self):
print("Страусы не умеют летать.")


В этом примере у нас есть базовый класс Bird и два его подкласса Sparrow и Ostrich. Каждый подкласс переопределяет метод flight. Здесь полиморфизм проявляется в том, что метод flight, определенный в базовом классе, используется подклассами, но каждый подкласс дает свою реализацию этому методу.

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

🤔 В двух словах:

Полиморфизм - это когда один и тот же метод можно использовать для разных объектов.


🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовыхё
Please open Telegram to view this post
VIEW IN TELEGRAM
👍64🔥1
🤔 Какой из следующих модулей обеспечивает блокирующие операции ввода-вывода, совместимые с асинхронным кодом?
Anonymous Quiz
16%
threading
59%
asyncio
11%
multiprocessing
15%
concurrent.futures
2👍1
📌 Что может быть ключом в словаре?

💬 Спрашивают в 26% собеседований

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

Хешируемость означает, что объект должен иметь хеш-значение, которое не изменяется на протяжении всего времени существования объекта. Это необходимо для того, чтобы Python мог быстро находить значение по ключу. Если бы ключи были изменяемыми, их хеш-значения могли бы измениться, и это привело бы к тому, что значение по ключу стало бы невозможно найти.

🤔 Примеры ключей в словаре:

Строки - самый часто используемый тип ключа. Строки удобны, поскольку они легко читаемы и понятны.
my_dict = {"name": "Alice", "age": 25}


Числа - также могут использоваться в качестве ключей. Это могут быть целые числа или числа с плавающей точкой.
my_dict = {1: "one", 2: "two"}


Кортежи - могут быть ключами, если все их элементы неизменяемы. Это делает их полезными для комплексных ключей.
my_dict = {(1, 2): "point", (3, 4): "another point"}


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

🤔 Итог:

Ключи в словаре Python — это неизменяемые и хешируемые объекты, такие как строки, числа или кортежи. Это обеспечивает эффективный доступ и хранение данных. В качестве ключей используются данные, которые легко идентифицировать и которые не изменяются во время работы программы.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовыхё
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
📌 Что такое ООП?

💬 Спрашивают в 26% собеседований

Объектно-ориентированное программирование (ООП) — это парадигма программирования, основанная на концепции "объектов", которые могут содержать данные в виде полей (атрибуты или свойства) и код в виде процедур (методы).

🤔 Зачем нужно ООП?

ООП используется для структурирования программы таким образом, чтобы свойства и поведения были собраны в отдельные объекты. Например, в программе для управления животными в зоопарке каждое животное может быть объектом с атрибутами, такими как имя, возраст и вид, а также методами, такими как кормление или игра. Это делает программу легко понимаемой, расширяемой и поддерживаемой.

🤔Основные концепции ООП:

1️⃣ Инкапсуляция — это сокрытие деталей реализации и объединение данных и методов, работающих с этими данными, в одном классе. Это помогает защитить данные от непосредственного доступа извне и делает интерфейс работы с объектом более четким и строгим.

2️⃣ Наследование позволяет создавать новые классы на основе уже существующих, наследуя их свойства и методы. Это облегчает повторное использование кода и создание иерархий классов.

3️⃣ Полиморфизм — способность одной и той же функции или метода работать с разными типами данных. В ООП это обычно достигается за счет переопределения методов в дочерних классах.

4️⃣ Абстракция — это способ выделить набор общих характеристик объекта, исключая из рассмотрения несущественные. Это позволяет сосредоточиться на том, что объект делает, а не на том, как он это делает.

Пример кода:
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age

def speak(self):
return "Звуки, которые издает животное"

class Dog(Animal): # Наследование класса Animal
def speak(self): # Переопределение метода speak
return "Гав"

# Создание объекта класса Dog
my_dog = Dog("Бобик", 5)
print(my_dog.speak()) # Вывод: Гав


В этом примере Animal является базовым классом с методом speak, а Dog — производным классом, который наследует свойства Animal и переопределяет метод speak. Это демонстрирует наследование и полиморфизм.

🤔 Вкратце:

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовыхё
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3
🤔 Какой из следующих методов используется для блокировки выполнения потока до завершения другого потока?
Anonymous Quiz
20%
thread.sleep()
29%
thread.join()
16%
thread.hold()
35%
thread.wait()
📌 Что такое лямбда-функции?

💬 Спрашивают в 23% собеседований

Лямбда-функции — это небольшие анонимные функции, состоящие из одного выражения, результат которого является значением функции. Они определяются с помощью ключевого слова lambda, за которым следуют аргументы функции, двоеточие и выражение, значение которого функция должна вернуть.

🤔 Зачем нужны лямбда-функции?

Лямбда-функции часто используются в тех случаях, когда необходима простая функция для кратковременного использования, и нет смысла определять полноценную функцию с помощью def. Это может быть полезно для сортировки или фильтрации данных, а также в качестве аргумента для функций высшего порядка, таких как map(), filter() и reduce().

Пример использования:
# Определение лямбда-функции для вычисления квадрата числа
square = lambda x: x * x

# Использование лямбда-функции
print(square(5)) # Выведет 25

# Лямбда-функция в качестве аргумента функции map()
numbers = [1, 2, 3, 4]
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers) # Выведет [1, 4, 9, 16]

# Лямбда-функция для фильтрации списка
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # Выведет [2, 4]


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

🤔 Вкратце:

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


🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовыхё
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
🤔 Какой из приведенных ниже методов безопасен для работы с потоками при модификации одного и того же объекта?
Anonymous Quiz
62%
queue.Queue.put()
12%
set.add()
14%
dict.update()
11%
list.append()
👍21
📌 Что такое MRO?

💬 Спрашивают в 23% собеседований

MRO (Method Resolution Order) — это порядок, в котором Python ищет методы и атрибуты класса при их вызове. Этот порядок особенно важен в контексте множественного наследования, когда класс наследует поведение и атрибуты от нескольких родительских классов, и нужно четко определить, откуда именно брать эти атрибуты и методы в случае их совпадения.

🤔 Зачем нужен MRO ?

MRO помогает избежать проблемы алмаза (diamond problem), которая возникает, когда два родительских класса наследуют от одного и того же базового класса, а затем эти классы сливаются в один дочерний класс. Без четко определенного MRO Python не смог бы автоматически решить, в каком порядке следует искать методы и атрибуты среди родительских классов.

🤔 Как работает MRO ?

Python использует алгоритм C3 Linearization для определения MRO. Этот алгоритм гарантирует, что порядок разрешения методов учитывает следующие условия:

Подкласс всегда имеет приоритет перед родительским классом.

Порядок родительских классов сохраняется.

Если класс наследует от нескольких классов, порядок, указанный при наследовании, определяет приоритетность.

Можно узнать MRO любого класса, используя атрибут __mro__ или метод mro() у самого класса.

Пример:
class Base:
pass

class A(Base):
pass

class B(Base):
pass

class C(A, B):
pass

print(C.mro())


В этом примере порядок разрешения методов для класса C будет следующим: C, A, B, Base, object. Это означает, что если метод вызывается для экземпляра класса C, интерпретатор Python будет искать его сначала в C, затем в A, после в B, затем в Base и, наконец, в встроенном объекте object, который является базовым для всех классов.

🤔 Итог:

MRO определяет порядок, в котором интерпретатор будет искать методы и атрибуты при их вызове в контексте множественного наследования. Это обеспечивает предсказуемость и избегает конфликтов при наследовании от нескольких классов.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовыхё
Please open Telegram to view this post
VIEW IN TELEGRAM
👍111
📌Что такое миксин?

💬 Спрашивают в 23% собеседований

Миксин (Mixin) – это класс, предназначенный для предоставления определённых методов для использования другими классами, без необходимости становиться родительским классом для этих классов. Главная цель миксина - реализация функциональности, которую можно легко подключить к другому классу. Миксины позволяют разработчикам использовать композицию для добавления функций в классы вместо наследования, что делает структуру кода гибче и модульнее.

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

Пример использования миксина:
class JsonMixin:
def to_json(self):
import json
return json.dumps(self.__dict__)

class Person:
def __init__(self, name, age):
self.name = name
self.age = age

class PersonJson(JsonMixin, Person): # Использование миксина для добавления функциональности сериализации в JSON
pass

p = PersonJson('Иван', 25)
print(p.to_json()) # Выведет строку в формате JSON, представляющую объект PersonJson


В этом примере JsonMixin предоставляет метод to_json, который может сериализовать объекты класса в JSON. Класс PersonJson наследует этот метод благодаря множественному наследованию, где JsonMixin используется для добавления функциональности сериализации к классу Person, не изменяя его исходный код.

Использование миксинов делает код более читаемым и легко поддерживаемым, так как оно позволяет разработчикам комбинировать и переиспользовать функциональности между различными классами без изменения их иерархии наследования.

🤔 Итог:

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовыхё
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍5
📌 В чем разница методов экземпляра, класса и статическими ?

💬 Спрашивают в 3% собеседований

Существуют три основных типа методов, которые можно определить в классе: методы экземпляра, методы класса и статические методы. Каждый из этих типов методов имеет своё предназначение и способы вызова. Различия между ними заключаются в том, к какому контексту они привязаны (экземпляр, класс или независимость от обоих) и как они объявляются.

1️⃣ Методы экземпляра (Instance Methods)

Работают с конкретным экземпляром класса и могут изменять состояние этого экземпляра. Они принимают как первый аргумент self, который ссылается на текущий экземпляр класса.

🤔 Характеристики:

Привязаны к конкретному объекту класса.

Имеют доступ к атрибутам и другим методам этого объекта через self.

class MyClass:
def __init__(self, value):
self.value = value

def increment(self):
self.value += 1

# Использование
obj = MyClass(10)
obj.increment()
print(obj.value) # Вывод: 11


2️⃣ Методы класса (Class Methods)

Работают с самим классом, а не с его экземплярами. Они принимают как первый аргумент cls, который ссылается на сам класс. Методы класса обозначаются декоратором @classmethod.

🤔 Характеристики:

Привязаны к классу, а не к конкретному объекту.

Могут изменять состояние класса, но не состояние конкретного объекта.

Имеют доступ только к атрибутам и методам класса через cls.

class MyClass:
count = 0

def __init__(self):
MyClass.count += 1

@classmethod
def get_count(cls):
return cls.count

# Использование
obj1 = MyClass()
obj2 = MyClass()
print(MyClass.get_count()) # Вывод: 2


3️⃣ Статические методы (Static Methods)

Не зависят ни от экземпляра класса, ни от самого класса. Они не принимают self или cls в качестве первого аргумента. Статические методы обозначаются декоратором @staticmethod.

🤔 Характеристики:

Не привязаны ни к классу, ни к экземпляру.

Не имеют доступа ни к атрибутам экземпляра, ни к атрибутам класса.

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

class MyClass:
@staticmethod
def greet(name):
return f"Hello, {name}!"

# Использование
print(MyClass.greet("Alice")) # Вывод: Hello, Alice!


🤔 Методы экземпляра, методы класса и статические методы служат разным целям и имеют разные контексты использования:

Методы экземпляра: используются для работы с конкретными объектами класса и имеют доступ к их атрибутам.

Методы класса: используются для работы с самим классом и могут изменять состояние класса, но не конкретного объекта.

Статические методы: не зависят ни от класса, ни от экземпляра и используются для функций, которые логически связаны с классом, но не требуют доступа к состоянию класса или объекта.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍51
📌 Что такое @classmethod ?

💬 Спрашивают в 3% собеседований

Декоратор @classmethod используется для определения метода класса, который работает с самим классом, а не с его экземплярами. Методы, определенные с использованием @classmethod, принимают класс как первый аргумент, что позволяет им взаимодействовать с атрибутами и методами класса, а не конкретных экземпляров.

🤔 Основные характеристики:

1️⃣ Первый параметр `cls`: Методы класса принимают в качестве первого параметра ссылку на класс, обычно называемую cls. Это позволяет методу класса получить доступ к атрибутам и методам класса.

2️⃣ Доступ к атрибутам класса: Методы класса могут изменять атрибуты класса и вызывать другие методы класса.

3️⃣ Не зависят от экземпляров: Методы класса могут быть вызваны без создания экземпляра класса.

class MyClass:
count = 0

def __init__(self):
MyClass.count += 1

@classmethod
def get_count(cls):
return cls.count

# Создание объектов класса
obj1 = MyClass()
obj2 = MyClass()

# Вызов метода класса
print(MyClass.get_count()) # Вывод: 2


🤔 В этом примере:

Класс MyClass содержит атрибут класса count, который увеличивается при каждом создании экземпляра.

Метод класса get_count возвращает текущее значение атрибута count. Он использует параметр cls для доступа к атрибуту класса.

Метод get_count вызывается на самом классе MyClass, а не на экземпляре класса.

🤔 Пример использования метода класса для создания объектов:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

@classmethod
def from_birth_year(cls, name, birth_year):
age = 2023 - birth_year
return cls(name, age)

# Использование
person1 = Person("Alice", 30)
person2 = Person.from_birth_year("Bob", 1993)

print(person1.name, person1.age) # Вывод: Alice 30
print(person2.name, person2.age) # Вывод: Bob 30


🤔 В этом примере:

Метод класса from_birth_year используется для создания экземпляра класса Person на основе года рождения.

Метод from_birth_year вычисляет возраст и вызывает основной конструктор класса (__init__) для создания нового экземпляра.

🤔 Когда использовать данный метод:

1️⃣ Альтернативные конструкторы: Для предоставления дополнительных способов создания экземпляров класса.

2️⃣ Операции на уровне класса: Для операций, которые должны выполняться на уровне класса, а не на уровне экземпляров (например, работа с атрибутами класса).

3️⃣ Создание и управление объектами: Когда метод должен создавать или управлять объектами класса, основываясь на информации, доступной только на уровне класса.

Различие между @classmethod и @staticmethod:

@classmethod: Метод получает класс (cls) как первый аргумент и может изменять состояние класса.

@staticmethod: Метод не получает ни класс, ни экземпляр как первый аргумент и не может изменять состояние класса или экземпляра.

class MyClass:
class_attribute = 0

@classmethod
def increment_class_attribute(cls):
cls.class_attribute += 1

@staticmethod
def static_method():
print("This is a static method")

# Использование
MyClass.increment_class_attribute()
print(MyClass.class_attribute) # Вывод: 1

MyClass.static_method() # Вывод: This is a static method


Декоратор @classmethod позволяет определять методы, которые работают с самим классом, а не с его экземплярами. Эти методы могут быть полезны для выполнения операций на уровне класса, таких как создание новых экземпляров с использованием альтернативных конструкторов или изменение атрибутов класса. Понимание различий между методами класса, статическими методами и методами экземпляра помогает эффективно использовать объектно-ориентированные возможности.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81