Python: выход Dict элементов в производстве Corouts?
Прежде чем я скажу слово, позвольте мне поблагодарить сообщество за то, что он был авторитетным местом для моих запросов программирования на недавнем. И притворяйтесь, что эти комплименты не были выражены с помощью слов. Во всяком случае, закон вероятности диктовал, что я наткнулся на то, что я не смог найти, используя универсальную панель поиска, поэтому я решил прямо спросить в первый раз. Возможно, я просто не искал, используя Pythonic-достаточно лингви. Или, возможно, я сосать в 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. Если я игнорирую примеры избыточности - так распространены в примерах, которые содержатся в этом коде, я вижу, что понимание генератора легко преобразуется в генератор, созданный сопроводителем-производителем. Будучи доктором Прагматиком, я попытался сопоставить одну и ту же концепцию с диктофонами, учитывая, что существуют уже существующие соображения, со мной думают, что эти два будут эквивалентны:
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()
Первый работает, а второй - нет. Он помещает синтаксическую ошибку в двоеточие на третьей строке.
Теперь я либо немного сползаю по синтаксису, либо у меня есть огромное непонимание того, как работают сопрограммы производителей. Я подозреваю, что он не работает по той же причине, что вы не можете заставить сопрограмму вернуть список в отличие от генератора, но я действительно не знаю.
Так что да, исправление этой ошибки в основном - то, о чем я прошу; заранее спасибо. Я бы предпочел ответ, который подскажет мне ответ, а не дать мне совершенно новый способ достижения результата, но, очевидно, если это единственный способ...
Ответы
Ответ 1
Понимания Dict работают подобно представлению списков/наборов и выражений генератора - понимание X с телом expr for vars in iterable
в значительной степени эквивалентно X(expr for vars in iterable)
- и вы уже знаете, как превратить выражение генератора в генератор, Но обратите внимание на битку "довольно много", поскольку буквальный перевод не работает (как вы заметили) и не нужен вообще (не делает реализацию намного проще и фактически будет довольно хаки).
У понимания Dict есть маленький бит синтаксического сахара, который больше похож на литералы тика (двоеточие). Семантически это не нужно - в этом нет ничего особенного. Остановитесь и подумайте об этом на секунду: понимание dict должно вызывать два значения на каждой итерации, ключ и значение. Именно то, что обозначает двоеточие, - пары (key, value)
(помните, что dict
принимает итерабельность пар (key, value)
). Вы не можете использовать этот синтаксический сахар вне понятий dict, но вы можете просто использовать кортежи для пар. Следовательно, эквивалентный генератор будет:
def one_to_three_doubles():
for num in range(1, 4):
yield num, num * 2