Yanıtlar:
Her python konteyneri C için beklenti şudur:
for item in C:
assert item in C
gayet iyi geçecek - bir duygunun olması şaşırtıcı değil mi?in (döngü maddesinde) diğer (varlığı kontrol) den tamamen farklı bir anlamı vardı? Elbette isterim! Doğal olarak listeler, setler, tuplelar vb. İçin bu şekilde çalışır.
Öyleyse, Csözlük olduğunda , bir döngüde inanahtar / değer demetleri verecek olsaydı for, o zaman, en az şaşkınlık ilkesine göre in, kapsama kontrolünde sol taraftaki işleneni olarak böyle bir demeti de almak zorunda kalırdı.
Bu ne kadar yararlı olur? Oldukça yararsız gerçekten, temelde yapım if (key, value) in Ciçin eşanlamlısını if C.get(key) == valueBen gerçekleştirilen veya gerçekleştirmek istediği bulunduğuna inanıyoruz çek olan 100 kat daha nadiren olandan - if k in Caslında araçlar anahtarın varlığını kontrol sadece ve tamamen değerini görmezden.
Öte yandan, sadece tuşlar üzerinde döngü yapmak istemek oldukça yaygındır, örneğin:
for k in thedict:
thedict[k] += 1
değere sahip olmak özellikle yardımcı olmaz:
for k, v in thedict.items():
thedict[k] = v + 1
aslında biraz daha az açık ve daha az özlü. ( itemsAnahtar / değer çiftlerini elde etmek için kullanılacak "uygun" yöntemlerin orijinal yazılışı olduğunu unutmayın : ne yazık ki bu, bu tür erişimcilerin tam listeleri döndürdüğü günlerdeydi, bu nedenle "yalnızca yinelemeyi" desteklemek için alternatif bir yazımın tanıtılması gerekiyordu ve iteritems öyleydi - önceki Python sürümleriyle geriye dönük uyumluluk kısıtlamalarının çok zayıfladığı Python 3'te, itemsyeniden oldu ).
Tahminim: Tam demeti kullanmak döngü için daha sezgisel olurdu, ancak üyelik kullanımı için test etmek için belki daha az in.
if key in counts:
counts[key] += 1
else:
counts[key] = 1
Hem anahtarı hem de değeri belirtmeniz gerekse bu kod gerçekten işe yaramazdı in. Hem anahtar hem de değerin sözlükte olup olmadığını kontrol edeceğiniz kullanım durumunu hayal etmekte zorlanıyorum. Yalnızca anahtarları test etmek çok daha doğaldır.
# When would you ever write a condition like this?
if (key, value) in dict:
Artık inoperatörün ve for ... inaynı öğeler üzerinde çalışması gerekli değildir . Uygulama açısından farklı işlemlerdir ( __contains__vs. __iter__). Ancak bu küçük tutarsızlık biraz kafa karıştırıcı ve tutarsız olacaktır.
x in fooyalnızcaiiçindefor i in foodeğerini varsayarxbir noktada, ben çok olacağını söyleyebilirim büyük tutarsızlık.