Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+694новые вакансии за сутки·52 494вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 662
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python6 244
  • Облачные технологии4 749
  • QA вакансии1 736
  • Android1 148
  • Инженер данных800
  • Продакт-менеджер321

Разработка

  • iOS1 092
  • Backend вакансии1 046
  • Fullstack вакансии453
  • AI вакансии391
  • Frontend вакансии376
  • Mobile вакансии27

По стеку

  • Go3 590
  • Java2 153
  • Kotlin942
  • Node.js767
  • Rust544
  • .NET496
  • PHP267
  • C++220
  • C#198

DevOps и инфраструктура

  • Kubernetes2 686
  • Linux-инфраструктура2 117
  • DevOps вакансии1 960
  • Terraform / IaC1 615
  • CI/CD871
  • Мониторинг и Observability742
  • SRE228
  • Кибербезопасность47

Аналитика и данные

  • Аналитик данных495
  • Data Scientist449
  • Бизнес-аналитик351
  • Системный аналитик54

Другие направления

  • Проджект-менеджер109
  • UI/UX дизайн70
  • Ручное тестирование14

По регионам

  • Вакансии в США23 835
  • Вакансии в Европе9 341
  • Работа в России3 283
  • Вакансии в Канаде2 140

По формату

  • Удалённые вакансии41 311
  • Релокация в США23 835
  • Гибридная работа4 058
  • Офисная работа2 949

По уровню

  • Senior вакансии20 396
  • Middle вакансии11 620
  • Junior вакансии3 665

Сейчас нанимают

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Wise139 вакансий
  • Grab134 вакансии
  • Infobip28 вакансий
  • Adyen23 вакансии
  • Darktrace17 вакансий
  • Spotify15 вакансий
  • Celonis11 вакансий
  • Razorpay9 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме PythonВсе вопросы
PythonMiddleТеория

Что такое генераторы в Python и чем они отличаются от обычных функций?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

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

Отличие от обычной функции

  • Обычная функция: выполняется полностью, возвращает одно значение через return, состояние не сохраняется.
  • Генератор: приостанавливается на yield, сохраняет локальное состояние (переменные, позицию выполнения), возобновляется при следующем вызове next().
def regular_func(n: int) -> list[int]:
    """Создаёт весь список в памяти сразу."""
    result = []
    for i in range(n):
        result.append(i * i)
    return result


def squares_generator(n: int):
    """Вычисляет значения лениво, по одному."""
    for i in range(n):
        yield i * i


# Разница в памяти при n=10_000_000
import sys
regular = regular_func(10_000_000)
print(sys.getsizeof(regular))       # ~80 MB

gen = squares_generator(10_000_000)
print(sys.getsizeof(gen))           # ~112 байт

Что такое генераторы

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

Жизненный цикл генератора

def countdown(n: int):
    print(f"Старт с {n}")
    while n > 0:
        yield n
        n -= 1
    print("Завершён")


gen = countdown(3)       # Код не выполняется
print(next(gen))         # Старт с 3 → 3
print(next(gen))         # 2
print(next(gen))         # 1
print(next(gen))         # Завершён → StopIteration

Практические применения

import csv
from pathlib import Path
from typing import Iterator


def read_large_csv(path: Path) -> Iterator[dict]:
    """Читает CSV построчно без загрузки всего файла в память."""
    with open(path, newline="", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for row in reader:
            yield row


def filter_active(rows: Iterator[dict]) -> Iterator[dict]:
    for row in rows:
        if row.get("status") == "active":
            yield row


def transform(rows: Iterator[dict]) -> Iterator[dict]:
    for row in rows:
        row["email"] = row["email"].lower().strip()
        yield row


# Конвейер обработки — вся цепочка работает лениво
pipeline = transform(filter_active(read_large_csv(Path("users.csv"))))
for user in pipeline:
    process_user(user)  # В памяти только одна строка

send() и двунаправленные генераторы

def accumulator():
    total = 0
    while True:
        value = yield total
        if value is None:
            break
        total += value


acc = accumulator()
next(acc)         # Инициализация — доходим до первого yield
acc.send(10)      # 10
acc.send(20)      # 30
acc.send(5)       # 35

Подводные камни

  • Генератор одноразовый: после исчерпания повторный проход по нему ничего не даст — нужно создавать заново.
  • Исключение внутри генератора: если yield находится в try, код в finally выполнится при закрытии генератора через gen.close() или сборщиком мусора.
  • return в генераторе: значение return X передаётся как атрибут StopIteration.value, а не возвращается напрямую.
  • Утечка ресурсов: если генератор открыл файл или соединение, а его не довели до конца — вызовите gen.close() явно или используйте contextlib.closing.
  • Сериализация: объект-генератор нельзя сериализовать в pickle — при использовании в multiprocessing нужно передавать данные, а не генераторы.
  • Ошибка в yield from: при использовании yield from subgen исключение из подгенератора пробрасывается наверх — не всегда очевидно, где оно возникло.

Частые вопросы на собеседовании

  • Что такое truthy и falsy значения в Python?
  • Когда использовать threading?
  • Что такое type hints и зачем они нужны?
  • Как работает yield?

Типичные ошибки

  • Описывать generators только как термин и не показывать механизм на минимальном примере.
  • Игнорировать ошибки, пустые данные, конкурентный доступ или границы транзакции.
  • Не связывать поведение с официальным контрактом Python и реальной эксплуатацией.

Что проверяет интервьюер

  • Объясняет generators через последовательность действий, а не через набор ключевых слов.
  • Приводит короткий кодовый пример или production-сценарий с ожидаемым поведением.
  • Называет хотя бы один риск: производительность, безопасность, транзакции, память или сопровождение.

Как вы знаете этот вопрос?

Проверить себя по теме Python →

Источники

  • https://docs.python.org/3/tutorial/datastructures.html
  • https://docs.python.org/3/reference/datamodel.html
←Предыдущий вопросВ чём разница между списком (list) и кортежем (tuple) в Python?Следующий вопрос→Для каких задач Python является сильным выбором, а где лучше честно выбрать другой язык?

Связанные темы

Pythontechnical-reasoning