что делает yield как присваивание? myVar = (выход)

Не используйте oneliner. Вместо этого используйте collections.defaultdict и простой цикл:

>>> pairs = [('a', 1), ('b', 3), ('a', 4), ('c', 9), ('b', 1), ('d', 3)]
>>> result = defaultdict(int)
>>> for key, value in pairs:
...     result[key] += value
...
>>> result
defaultdict(<class 'int'>, {'a': 5, 'c': 9, 'b': 4, 'd': 3})

Легко понять, питонов и быстро.

30
задан Community 23 May 2017 в 11:53
поделиться

2 ответа

Оператор yield , используемый в функции, превращает эту функцию в «генератор» (функцию, которая создает итератор). Результирующий итератор обычно возобновляется вызовом next () . Однако можно отправить значения функции, вызвав метод send () вместо next () , чтобы возобновить ее:

cr.send(1)

В вашем примере это присвоит значение 1 до c каждый раз.

cr.next () фактически эквивалентен cr.send (None)

36
ответ дан 28 November 2019 в 00:02
поделиться

Вы можете отправлять значения в генератор с помощью функции send .

Если вы выполните:

p = protocol()
p.next() # advance to the yield statement, otherwise I can't call send
p.send(5)

, то yield вернет 5, поэтому внутри генератора c будет 5.

Также, если вы вызовете p. next () , yield вернет None .

Дополнительную информацию можно найти здесь .

11
ответ дан 28 November 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: