Python | Вопросы собесов
13.8K subscribers
38 photos
1 file
959 links
Download Telegram
📌 Что такое gPRC ?

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

gRPC (Google Remote Procedure Call) — это современный высокопроизводительный фреймворк для реализации удалённых вызовов процедур (RPC). Он был разработан Google и использует протокол HTTP/2 для передачи данных, а также Protocol Buffers (protobuf) для сериализации и десериализации сообщений. gRPC поддерживает множество языков программирования и предназначен для создания распределённых систем и микросервисной архитектуры.

🤔 Особенности:

1️⃣ Высокая производительность: Использует HTTP/2 для мультиплексирования, сжатия заголовков и улучшенной производительности.

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

3️⃣ Сериализация данных: Использует Protocol Buffers (protobuf) для компактной и эффективной сериализации данных.

4️⃣ Разнообразие типов вызовов: Поддерживает несколько типов RPC, включая односторонние и двусторонние потоковые вызовы.

5️⃣ Интерфейс описания сервиса: Интерфейсы и сообщения описываются в файлах .proto, что упрощает генерацию кода для различных языков.

🤔 Типы RPC в gRPC:

1️⃣ Unary RPC: Клиент отправляет один запрос серверу и получает один ответ.

2️⃣ Server streaming RPC: Клиент отправляет один запрос серверу и получает поток ответов.

3️⃣ Client streaming RPC: Клиент отправляет поток запросов серверу и получает один ответ.

4️⃣ Bidirectional streaming RPC: Клиент и сервер обмениваются потоками запросов и ответов.

🤔 Определение сервиса в файле .proto:

syntax = "proto3";

service Calculator {
rpc Add (AddRequest) returns (AddReply) {}
}

message AddRequest {
int32 a = 1;
int32 b = 2;
}

message AddReply {
int32 result = 1;
}


🤔 Генерация кода из файла .proto:

Для этого используется утилита protoc:

protoc --python_out=. --grpc_python_out=. calculator.proto


Реализация сервера:
import grpc
from concurrent import futures
import time
import calculator_pb2
import calculator_pb2_grpc

class CalculatorServicer(calculator_pb2_grpc.CalculatorServicer):
def Add(self, request, context):
response = calculator_pb2.AddReply()
response.result = request.a + request.b
return response

def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
calculator_pb2_grpc.add_CalculatorServicer_to_server(CalculatorServicer(), server)
server.add_insecure_port('[::]:50051')
server.start()
try:
while True:
time.sleep(86400)
except KeyboardInterrupt:
server.stop(0)

if __name__ == '__main__':
serve()

Реализация клиента:
import grpc
import calculator_pb2
import calculator_pb2_grpc

def run():
with grpc.insecure_channel('localhost:50051') as channel:
stub = calculator_pb2_grpc.CalculatorStub(channel)
response = stub.Add(calculator_pb2.AddRequest(a=1, b=2))
print(f"1 + 2 = {response.result}")

if name == '__main__':
run()


🤔 Преимущества:

1️⃣ Высокая производительность: Благодаря использованию HTTP/2 и protobuf.

2️⃣ Поддержка нескольких языков: Возможность работы с разными языками программирования.

3️⃣ Типы RPC: Поддержка различных типов взаимодействия между клиентом и сервером.

4️⃣ Масштабируемость: Подходит для построения микросервисной архитектуры.

🤔 Недостатки:

1️⃣ Крутая кривая обучения: Требует знания HTTP/2 и Protocol Buffers.

2️⃣ Совместимость с старыми системами: Не все системы и языки программирования имеют поддержку HTTP/2 и protobuf.

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

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

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
📌 Зачем нужен ОПП ?

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

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

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

1️⃣ Классы и объекты:

Класс: Шаблон или чертеж для создания объектов. Класс определяет атрибуты и методы, которые будут общими для всех объектов этого класса.

Объект: Конкретный экземпляр класса, содержащий реальные значения атрибутов.

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

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

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

Скрывает внутреннюю реализацию объекта от внешнего мира и предоставляет доступ к данным только через методы. Это обеспечивает контроль над изменениями и защиту данных.

4️⃣ Полиморфизм:

Способность использовать объекты различных классов через единый интерфейс. Это позволяет применять один и тот же метод к объектам разных классов и обеспечивать их различное поведение.

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

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

🤔 Преимущества:

1️⃣ Повторное использование кода:

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

2️⃣ Модульность:

Программы разбиваются на модули (классы и объекты), которые можно разрабатывать, тестировать и отлаживать независимо друг от друга.

3️⃣ Расширяемость:

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

4️⃣ Поддержка и отладка:

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

5️⃣ Гибкость и полиморфизм:

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

🤔 Пример:
class Animal:
def __init__(self, name):
self.name = name

def speak(self):
raise NotImplementedError("Subclass must implement abstract method")

class Dog(Animal):
def speak(self):
return f"{self.name} says Woof!"

class Cat(Animal):
def speak(self):
return f"{self.name} says Meow!"

# Использование
animals = [Dog("Buddy"), Cat("Whiskers")]

for animal in animals:
print(animal.speak())


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

Класс Animal является суперклассом, содержащим абстрактный метод speak.

Классы Dog и Cat являются подклассами, которые наследуют от Animal и реализуют метод speak.

Список animals содержит объекты различных классов, и полиморфизм позволяет вызывать метод speak для каждого из них, не зная их конкретного класса.

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

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
💊6👍52
📌 Какие есть типы данных в Python?

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

Типы данных делят на 2 группы: изменяемые и не изменяемые.

🤔 Изменяемые (mutable)

Списки (list):

Упорядоченные коллекции, которые могут содержать элементы разных типов. Пример: [1, "apple", 3.14]. Списки часто используются для хранения и последовательного доступа к элементам.
e = [1, 2, 3, 4, 5]


Словари (dict):

Коллекции пар ключ-значение. Пример: {"name": "Alice", "age": 25}. Словари удобны для представления объектов с атрибутами. Ключом в словаре может быть значение с не изменяемым типом данных (int, float, str, tuple, bool, frozenset и т.д.)
g = {"name": "Alice", "age": 25}


Множества (set):

Неупорядоченные коллекции уникальных элементов. Пример: {1, 2, 3}. Используются для удаления дубликатов и выполнения операций над множествами, таких как объединение, пересечение.
h = {1, 2, 3, 4, 5}


Байтовые массивы (bytearray):

Это изменяемая последовательность целых чисел в диапазоне от 0 до 255. Они используются для работы с двоичными данными, например, при чтении файлов или сетевого взаимодействия. bytearray полезен, когда вам нужно изменять данные на уровне байтов.
ba = bytearray([50, 100, 150, 200])


🤔 Не изменяемые (immutable)

Целые числа (int):

Как положительные, так и отрицательные. Например, 1, 100, -20.
a = 5


Вещественные числа (float):

Числа с плавающей точкой (то есть с дробной частью). Примеры: 3.14, -0.001
b = 2.5


Комплексные числа (complex):

Этот тип данных используется для представления комплексных чисел, которые включают в себя действительную и мнимую части. В Python комплексные числа могут быть созданы с помощью литерала j для мнимой части. Например, комплексное число 3 + 4j. Комплексные числа используются в научных и инженерных расчетах, где необходимо работать с числами, имеющими мнимую составляющую.
z = 3 + 4j


Длинные целые числа (long):

В старых версиях Python (2.x и ранее) существовал отдельный тип данных long для представления очень больших целых чисел. Однако в Python 3 и выше этот тип был упразднен, и теперь все целые числа (int) могут быть любой длины. Таким образом, в современном Python отдельного типа данных long не существует — все большие целые числа автоматически становятся int.
a = 12345678901234567890L # Python 2.x
a = 12345678901234567890 # Python 3


Строки (str):

Текст, заключенный в одинарные, двойные или тройные кавычки. Например: "hello", 'world'.
c = "Hello, Python!"


Булевы значения (bool):

Имеют всего два значения: True и False. Они часто используются в условиях и логических выражениях.
d = True


Кортежи (tuple):

Похожи на списки, но являются неизменяемыми. Пример: (1, "apple", 3.14). Используются, когда данные не должны изменяться после их создания. Если кортеж содержит изменяемые данные, то он становится изменяемым
f = (1, 2, 3)


Диапазон (range):

Это неизменяемая последовательность чисел, обычно используемая в циклах for. range полезен для итерации через серии числовых значений.
for i in range(0, 10):
print(i)


NoneType:

Этот тип данных имеет только одно возможное значение: None. Оно используется для обозначения отсутствия значения. Часто используется в логических операциях например if a is None:
a = None


Frozenset:

Это неизменяемый аналог set. Так как frozenset неизменяем, он может использоваться в качестве ключа в словарях.
fs = frozenset([1, 2, 3])


Байты (bytes):

Похожи на bytearray, но являются неизменяемыми. Они также представляют собой последовательности целых чисел от 0 до 255 и используются для работы с двоичными данными.
b = bytes([50, 100, 150, 200])


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

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

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

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

🤔 enter и exit.

Метод enter вызывается в начале блока кода, управляемого контекстным менеджером (обычно после ключевого слова with), и обычно используется для выделения ресурсов.

Метод exit вызывается после окончания блока кода и обычно занимается очисткой ресурсов.

🤔 Пример контекстного менеджера, который управляет файлом:
class FileHandler:
def init(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None

def enter(self):
self.file = open(self.filename, self.mode)
return self.file

def exit(self, exc_type, exc_val, exc_tb):
if self.file:
self.file.close()

# Использование контекстного менеджера
with FileHandler('example.txt', 'w') as f:
f.write('Привет, мир!')

# После выхода из блока with файл автоматически закрывается


В этом примере FileHandler - это контекстный менеджер для работы с файлами. Когда начинается блок with, вызывается метод enter, который открывает файл. После завершения работы в блоке with автоматически вызывается метод exit, который закрывает файл. Это предотвращает ошибки, связанные с забытым закрытием файла, и делает код более надежным и читаемым.

Контекстные менеджеры широко используются в Python для управления ресурсами, их можно встретить в стандартной библиотеке (например, open для файлов), а также во многих сторонних библиотеках.

🤔 Кратко:

Контекстный менеджер в Python - это способ управления ресурсами в блоке кода, обеспечивающий автоматическое выделение и освобождение ресурсов.

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

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

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

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

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

1️⃣ Преобразование функций:

Декораторы могут изменять поведение функции, не изменяя её кода.

2️⃣ Повторное использование кода:

Они позволяют использовать общий код в нескольких функциях, уменьшая дублирование.

3️⃣ Синтаксическое удобство:

В Python декораторы могут быть применены к функции с использованием символа @, что делает код более читабельным и элегантным.


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

🔒 База собесов | 🔒 База тестовыхё
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
📌 Чем init() отличается от new() ?

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

Различие между init() и new() заключается в их роли при создании экземпляров классов.

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

__new__() – это конструктор класса. Он фактически создаёт экземпляр класса и вызывается перед __init__(). Это статический метод, который должен возвращать новый созданный объект, и он используется в особых случаях, например, при создании экземпляров синглтонов или при наследовании от неизменяемых типов данных, как tuple.

Пример с init()

Допустим, у нас есть класс Person, представляющий информацию о человеке. Мы используем init() для инициализации атрибутов каждого объекта этого класса.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

# Создание экземпляра класса Person
person1 = Person("Алексей", 30)

print(f"Имя: {person1.name}, Возраст: {person1.age}")


В этом примере init() используется для установки имени и возраста для каждого объекта Person. Это самый распространенный способ инициализации атрибутов в объектно-ориентированном программировании.

Пример с new()

new() используется реже, но его можно применять в специфических сценариях, например, для создания синглтонов (одиночек).
class Singleton:
_instance = None

def new(cls):
if cls._instance is None:
print("Создание экземпляра")
cls._instance = super(Singleton, cls).new(cls)
return cls._instance

# Создание экземпляров Singleton
singleton1 = Singleton()
singleton2 = Singleton()

print(singleton1 is singleton2) # Вернет True, так как оба объекта являются одним и тем же экземпляром


Здесь new() гарантирует, что класс Singleton создает только один экземпляр. При попытке создать новый объект этого класса, new() возвращает уже существующий экземпляр, если он есть, предотвращая создание новых экземпляров.

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

🔒 База собесов | 🔒 База тестовыхё
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔9👍53🔥2
📌 Что такое генератор?

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

Генератор в Python – это специальный тип функций, который позволяет вам возвращать значение и позже продолжить выполнение функции с того места, где она была остановлена. Это достигается с помощью ключевого слова yield.

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

Пример использования генератора:
def count_up_to(max):
count = 1
while count <= max:
yield count
count += 1

counter = count_up_to(5)
for num in counter:
print(num)


В этом примере функция count_up_to является генератором. Когда вы вызываете её, она не выполняет свой код сразу. Вместо этого, она возвращает итерируемый объект. Когда вы итерируетесь через этот объект (например, используя цикл for), код внутри функции выполняется до первого yield. Значение, которое следует за yield, возвращается в цикл. При следующей итерации выполнение функции возобновляется сразу после yield и продолжается до следующего yield.

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

В асинхронных функциях (async def) используется await вместо yield, но концептуально это очень похоже. Когда функция достигает await, она возвращает управление вызывающей стороне, позволяя другим задачам выполняться, пока текущая задача находится в ожидании (например, ожидает ответа от сервера).

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

async def fetch_data():
print('Start fetching')
await asyncio.sleep(2) # Имитация асинхронной задачи, например, запроса к серверу
print('Done fetching')
return {'data': 1}

async def main():
print('Before fetching')
result = await fetch_data()
print('Result:', result)
print('After fetching')

asyncio.run(main())

Здесь fetch_data является асинхронной функцией. Когда она достигает строки await asyncio.sleep(2), управление возвращается в main, позволяя выполнять другие операции, в то время как fetch_data находится в ожидании.

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

🤔 Итог:

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

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

🔒 База собесов | 🔒 База тестовыхё
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍8🔥1
📌 Что такое индексы и как они работают?

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

Индексы – это специальные структуры данных, которые используются для ускорения операций выборки (retrieval) и поиска данных в таблице. Они подобны индексам в книге: вместо того, чтобы перелистывать всю книгу (или всю таблицу данных) для поиска нужной информации, вы можете использовать индекс для быстрого нахождения необходимых данных.

🤔 Зачем нужны

Индексы существенно ускоряют поиск и выборку данных, особенно в больших таблицах. Без индексов база данных должна была бы осуществлять "полное сканирование таблицы" (full table scan), что очень ресурсоемко и медленно, особенно для больших объемов данных. Однако стоит учитывать, что создание и поддержание индексов также требует дополнительных ресурсов, включая место на диске и время на обновление индекса при изменении данных в таблице.

🤔 Как работают индексы

Существуют различные типы индексов, и они могут быть реализованы по-разному в зависимости от системы управления базами данных (СУБД), но обычно они используют структуры данных, такие как B-деревья или хеш-таблицы, для эффективного хранения и поиска данных.

Например, если вы создаете индекс для столбца "Фамилия" в таблице с записями сотрудников, СУБД создаст структуру данных (например, B-дерево), которая позволит быстро находить записи по значению фамилии, не перебирая каждую запись в таблице.
CREATE INDEX idx_lastname ON employees (lastname);


Эта SQL-команда создает индекс idx_lastname для столбца lastname в таблице employees. После создания этого индекса запросы, которые ищут сотрудников по фамилии, будут выполняться значительно быстрее.

🤔 Итог:

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


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

🔒 База собесов | 🔒 База тестовыхё
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍5💊21
🤔 Какой метод используется для создания локального контекста в асинхронном коде?
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