Risposte:
Per ogni contenitore C di Python, l'aspettativa è quella
for item in C:
assert item in C
passerà bene - non ti sembrerebbe sorprendente se un senso diin
(la clausola del ciclo) avesse un significato completamente diverso dall'altro (il controllo di presenza)? Lo farei sicuramente! Funziona naturalmente in questo modo per elenchi, set, tuple, ...
Quindi, quando C
è un dizionario, se si in
dovessero produrre tuple chiave / valore in un for
ciclo, allora, per principio di minimo stupore, si in
dovrebbe prendere una tupla come l'operando di sinistra nel controllo di contenimento.
Quanto sarebbe utile? Abbastanza inutile anzi, in pratica facendo if (key, value) in C
un sinonimo di if C.get(key) == value
- che è un assegno Credo di aver eseguito, o voluto eseguire, 100 volte più raramente di quello che if k in C
in realtà significa , verificare la presenza della chiave unica e ignorando completamente il valore.
D'altra parte, voler girare in loop solo sui tasti è abbastanza comune, ad esempio:
for k in thedict:
thedict[k] += 1
avere anche questo valore non aiuterebbe in particolare:
for k, v in thedict.items():
thedict[k] = v + 1
in realtà un po 'meno chiaro e meno conciso. (Si noti che items
era l'ortografia originale dei metodi "corretti" da utilizzare per ottenere coppie chiave / valore: sfortunatamente era nei giorni in cui tali accessori restituivano intere liste, quindi per supportare "solo iterando" si doveva introdurre un'ortografia alternativa ed iteritems
è stato - in Python 3, dove i vincoli di compatibilità con le versioni precedenti di Python erano molto indeboliti, è diventato di items
nuovo).
La mia ipotesi: l' uso della tupla completa sarebbe più intuitivo per il looping, ma forse meno per il test per l'utilizzo dell'appartenenza in
.
if key in counts:
counts[key] += 1
else:
counts[key] = 1
Quel codice non funzionerebbe davvero se dovessi specificare sia la chiave che il valore per in
. Sto facendo fatica a immaginare un caso d'uso in cui verifichi se nel dizionario sono presenti sia la chiave AND sia il valore. È molto più naturale testare solo i tasti.
# When would you ever write a condition like this?
if (key, value) in dict:
Ora non è necessario che l' in
operatore for ... in
operi sugli stessi articoli. Dal punto di vista dell'implementazione sono diverse operazioni ( __contains__
vs. __iter__
). Ma quella piccola incoerenza sarebbe alquanto confusa e, beh, incoerente.
x in foo
solo sei
infor i in foo
assume il valore dix
ad un certo punto, direi che sarebbe un'enorme incoerenza.