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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python11 079
  • Облачные технологии8 824
  • QA вакансии2 977
  • Android1 395
  • Инженер данных1 032
  • Продакт-менеджер351

Разработка

  • Backend вакансии1 342
  • iOS1 307
  • AI вакансии660
  • Fullstack вакансии524
  • Frontend вакансии465
  • Mobile вакансии28

По стеку

  • Go6 622
  • Java3 670
  • Kotlin1 199
  • Node.js1 190
  • Rust1 181
  • .NET780
  • PHP329
  • C++301
  • C#211

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

  • Kubernetes5 251
  • Linux-инфраструктура4 138
  • DevOps вакансии3 024
  • Terraform / IaC2 834
  • Мониторинг и Observability1 406
  • CI/CD917
  • SRE389
  • Кибербезопасность40

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

  • Аналитик данных586
  • Бизнес-аналитик487
  • Data Scientist458
  • Системный аналитик75

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

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

По регионам

  • Вакансии в США31 201
  • Вакансии в Европе11 507
  • Работа в России3 630
  • Вакансии в Канаде2 546

По формату

  • Удалённые вакансии47 761
  • Релокация в США31 201
  • Гибридная работа7 699
  • Офисная работа6 071

По уровню

  • Senior вакансии27 027
  • Middle вакансии12 284
  • Junior вакансии4 495

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

Все компании
  • Wise196 вакансий
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify38 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Чем yield отличается от yield from?

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

yield from делегирует итерацию другому итерируемому объекту или генератору, прозрачно пробрасывая send(), throw() и return-значение. Это чище, чем цикл for + yield, и обязательно для корутин на генераторах.

Разница: for+yield vs yield from

from typing import Generator, Iterable


# Старый способ — не пробрасывает send() и throw()
def chain_old(*iterables: Iterable) -> Generator:
    for it in iterables:
        for item in it:
            yield item


# Новый способ с yield from
def chain_new(*iterables: Iterable) -> Generator:
    for it in iterables:
        yield from it


result = list(chain_new([1, 2], [3, 4], [5]))
print(result)  # [1, 2, 3, 4, 5]

yield from: делегирование генераторов

yield from iterable, появившийся в Python 3.3 (PEP 380), делает три вещи одновременно:

  1. Передаёт все значения из iterable вызывающему коду.
  2. Прозрачно пробрасывает send() и throw() во вложенный генератор.
  3. Получает возвращаемое значение (return) вложенного генератора как результат выражения yield from.

Пробрасывание return-значения

def inner() -> Generator[int, None, str]:
    yield 1
    yield 2
    return "inner done"  # возвращается через StopIteration.value


def outer() -> Generator[int, None, str]:
    result = yield from inner()  # result = "inner done"
    print(f"Inner returned: {result}")
    return "outer done"


gen = outer()
print(next(gen))   # 1
print(next(gen))   # 2
try:
    next(gen)      # Inner returned: inner done → StopIteration
except StopIteration as e:
    print(e.value) # outer done

Пробрасывание send() и throw()

def inner_accumulator() -> Generator[float, float, None]:
    total = 0.0
    while True:
        value = yield total
        if value is None:
            return
        total += value


def outer_wrapper() -> Generator[float, float, None]:
    print("Starting")
    yield from inner_accumulator()  # send() идёт прямо в inner
    print("Done")


gen = outer_wrapper()
next(gen)       # Starting → 0.0
gen.send(10)    # → 10.0  (send ушёл в inner_accumulator)
gen.send(5)     # → 15.0

Рекурсивный обход дерева

from typing import Any


def flatten(nested: Any) -> Generator:
    """Рекурсивно разворачивает вложенные списки."""
    if isinstance(nested, list):
        for item in nested:
            yield from flatten(item)  # рекурсия через yield from
    else:
        yield nested


data = [1, [2, [3, 4]], [5, 6]]
print(list(flatten(data)))  # [1, 2, 3, 4, 5, 6]

Историческая роль: корутины до asyncio

До появления async/await (Python 3.5) корутины реализовывались через генераторы с yield from. Декоратор @asyncio.coroutine и yield from asyncio.sleep(1) — предшественники современного await. Сегодня это legacy, но понимание помогает читать старый код.

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

  • yield from работает только с итерируемыми объектами или генераторами; yield from None вызовет TypeError.
  • При использовании с обычным списком yield from [1, 2, 3] — значения пробрасываются, но send() туда не передаётся (список не поддерживает протокол генератора).
  • Смешивание yield и yield from в одной функции работает, но усложняет понимание потока управления.
  • Возвращаемое значение yield from доступно только внутри генератора; снаружи оно теряется в StopIteration.value и игнорируется обычным for.
  • В async-коде yield from не работает — используйте await и async for.
  • Рекурсивный yield from на глубоко вложенных структурах создаёт длинную цепочку генераторов — возможна RecursionError при очень большой глубине.
  • Отладка сложнее: трейсбек проходит через несколько уровней генераторов, что затрудняет поиск источника ошибки.

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

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

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

  • Не знать про return value вложенного генератора.
  • Использовать yield from для одного значения.
  • Не понимать делегирование исключений.

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

  • Показывает flatten.
  • Объясняет делегирование генератору.
  • Знает про send/throw/close хотя бы концептуально.

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

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

Источники

  • https://docs.python.org/3/reference/expressions.html
  • https://docs.python.org/3/reference/datamodel.html

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

PythoncoroutinesIteration

Вакансии с этим навыком

Python вакансии
  • AI Enablement Lead (GenAI Value Lab) (#5686)
  • Middle DevOps (AWS) Engineer (#5857)
  • Senior MLOps Engineer (#5860)
  • Senior Data Engineer (#5883)
  • Lead Cloud Engineer (Azure) — Interview Experts Needed (#5499)