Python: Yield Dict Элементы в генераторах?

Прежде чем я скажу слово, позвольте мне поблагодарить сообщество за то, что оно авторитетное место для моих запросов по программированию в последнее время. И представьте, что эти комплименты не были выражены словами. Как бы то ни было, закон вероятности требовал, чтобы я наткнулся на то, что не смог найти с помощью универсальной панели поиска, поэтому я решил впервые явно спросить. Возможно, я просто не использовал для поиска достаточно питонический жаргон. Или, возможно, я отстой в Googling / Stackoverflowing. Несмотря на это ...

Я играю с сопрограммами и генераторами Python. Насколько я могу судить, вы можете делать все, что может понять генератор, с сопрограммами производителя, хотя и более подробно. В настоящее время я использую Python 3, хотя любые ответы, касающиеся Python 2, также не будут пропущены.

Итак, я предполагаю, что следующие фрагменты кода эквивалентны:

one_to_three = (num for num in range(1, 4))

...

def one_to_three():
    for num in range(1, 4):
        yield num

one_to_three_gen = one_to_three()

Он работает на моя установка Python. Если я проигнорирую так часто встречающиеся в примерах избыточности, представленные в этом коде, я вижу, что понимание генератора легко отображается на генератор, созданный сопрограммой производителя. Будучи доктором Прагматиком, я попытался сопоставить одну и ту же концепцию с dicts, учитывая, что понимания dict уже существуют, и я думал, что эти два будут эквивалентны:

one_to_three_doubles = {num : num * 2 for num in range(1, 4)}

...

def one_to_three_doubles():
    for num in range(1, 4):
        yield num : num * 2

one_to_three_doubles_gen = one_to_three_doubles()

Первый работает, а второй нет. Он отмечает синтаксическую ошибку в двоеточии в 3-й строке.

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

Так что да, исправление этой ошибки - это в основном то, что я прошу для; заранее спасибо. Я бы предпочел ответ, который подсказывает мне ответ, а не дает мне совершенно новый способ достижения результата, но, очевидно, если это единственный способ ...

17
задан Adrian W 2 June 2019 в 18:06
поделиться