Ответ 1
Для каждого контейнера C питона C ожидается, что
for item in C:
assert item in C
пройдет очень хорошо - разве вы не удивитесь, если бы одно чувство in
(предложение цикла) имело совершенно другое значение от другого (проверка наличия)? Я бы точно! Он, естественно, работает таким образом для списков, наборов, кортежей,...
Итак, когда C
является словарем, если in
должен был давать кепки key/value в цикле for
, то по принципу наименьшего удивления in
также пришлось бы взять такой кортеж как его левый операнд в проверке сдерживания.
Насколько это полезно? Довольно бесполезно, в основном, делая if (key, value) in C
синонимом if C.get(key) == value
- который является проверкой, которую, я считаю, я мог выполнить или хотел выполнить в 100 раз реже, чем на самом деле означает if k in C
, проверяя наличие ключ и полностью игнорирует значение.
С другой стороны, очень часто требуется простое соединение с клавишами, например:
for k in thedict:
thedict[k] += 1
значение которого также не помогло бы особо:
for k, v in thedict.items():
thedict[k] = v + 1
на самом деле несколько менее ясным и менее кратким. (Обратите внимание, что items
было оригинальным написанием "правильных" методов использования для получения пар ключ/значение: к сожалению, это было в те дни, когда такие аксессоры возвращали целые списки, поэтому для поддержки "просто повторения" альтернативная орфография была и iteritems
было - в Python 3, где ограничения обратной совместимости с предыдущими версиями Python были значительно ослаблены, он снова стал items
).